@@ -1371,12 +1371,18 @@ fn authorize_migration_writer(context: rusqlite::hooks::AuthContext<'_>) -> Auth
13711371
13721372fn 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
13821388fn 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