Skip to content

Commit 2265c9e

Browse files
fix(storage): admit bounded schema pragmas
1 parent 276e533 commit 2265c9e

1 file changed

Lines changed: 36 additions & 15 deletions

File tree

crates/tracedecay-rusqlite-runtime/src/migration_sql.rs

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1371,12 +1371,18 @@ fn authorize_migration_writer(context: rusqlite::hooks::AuthContext<'_>) -> Auth
13711371

13721372
fn is_allowed_migration_pragma(pragma_name: &str, pragma_value: Option<&str>) -> bool {
13731373
is_migration_read_pragma(pragma_name, pragma_value)
1374-
|| matches!(
1375-
pragma_value,
1376-
Some(value)
1377-
if pragma_name.eq_ignore_ascii_case("auto_vacuum")
1378-
&& (value.eq_ignore_ascii_case("incremental") || value == "2")
1379-
)
1374+
|| pragma_value.is_some_and(|value| {
1375+
(pragma_name.eq_ignore_ascii_case("auto_vacuum")
1376+
&& (value.eq_ignore_ascii_case("incremental") || value == "2"))
1377+
|| (pragma_name.eq_ignore_ascii_case("foreign_keys")
1378+
&& (value.eq_ignore_ascii_case("on") || value == "1"))
1379+
|| (pragma_name.eq_ignore_ascii_case("defer_foreign_keys")
1380+
&& (value.eq_ignore_ascii_case("on") || value == "1"))
1381+
|| (pragma_name.eq_ignore_ascii_case("secure_delete")
1382+
&& (value.eq_ignore_ascii_case("on") || value == "1"))
1383+
|| (pragma_name.eq_ignore_ascii_case("user_version")
1384+
&& value.parse::<u32>().is_ok())
1385+
})
13801386
}
13811387

13821388
fn is_migration_read_pragma(pragma_name: &str, pragma_value: Option<&str>) -> bool {
@@ -1756,18 +1762,33 @@ mod tests {
17561762
}
17571763

17581764
#[test]
1759-
fn writer_actor_allows_only_incremental_auto_vacuum_configuration() {
1765+
fn writer_actor_allows_only_product_schema_pragmas() {
17601766
let fixture = fixture('a', 'a');
17611767
let channel = MigrationSqlHandle::attach(&fixture.writer, &fixture.readers).unwrap();
17621768

1763-
channel
1764-
.execute_batch("PRAGMA auto_vacuum = INCREMENTAL".to_owned())
1765-
.expect("repeat safe incremental auto-vacuum");
1766-
let error = channel
1767-
.execute_batch("PRAGMA auto_vacuum = NONE".to_owned())
1768-
.unwrap_err();
1769-
1770-
assert!(matches!(error, MigrationSqlError::Sqlite { .. }));
1769+
for pragma in [
1770+
"PRAGMA auto_vacuum = INCREMENTAL",
1771+
"PRAGMA foreign_keys = ON",
1772+
"PRAGMA defer_foreign_keys = ON",
1773+
"PRAGMA secure_delete = ON",
1774+
"PRAGMA user_version = 24",
1775+
] {
1776+
channel
1777+
.execute_batch(pragma.to_owned())
1778+
.unwrap_or_else(|error| panic!("{pragma} must remain available: {error}"));
1779+
}
1780+
for pragma in [
1781+
"PRAGMA auto_vacuum = NONE",
1782+
"PRAGMA foreign_keys = OFF",
1783+
"PRAGMA secure_delete = OFF",
1784+
"PRAGMA writable_schema = ON",
1785+
] {
1786+
let error = channel.execute_batch(pragma.to_owned()).unwrap_err();
1787+
assert!(
1788+
matches!(error, MigrationSqlError::Sqlite { .. }),
1789+
"{pragma}: {error}"
1790+
);
1791+
}
17711792
}
17721793

17731794
#[test]

0 commit comments

Comments
 (0)