diff --git a/tests/integration/pragma.rs b/tests/integration/pragma.rs index 14559d11e..533e06c22 100644 --- a/tests/integration/pragma.rs +++ b/tests/integration/pragma.rs @@ -57,3 +57,107 @@ fn test_pragma_module_list_generate_series() { assert!(found, "generate_series should appear in module_list"); } + +#[test] +fn test_pragma_page_sizes_without_writes_persists() { + for test_page_size in [512, 1024, 2048, 4096, 8192, 16384, 32768, 65536] { + let db = TempDatabase::new_empty(false); + { + let conn = db.connect_limbo(); + let pragma_query = format!("PRAGMA page_size={test_page_size}"); + conn.execute(&pragma_query).unwrap(); + conn.execute("PRAGMA user_version=1").unwrap(); // even sqlite behavior is that just changing page_size pragma doesn't persist it, so we do this to make a minimal persistent change + } + + let conn = db.connect_limbo(); + let mut rows = conn.query("PRAGMA page_size").unwrap().unwrap(); + let StepResult::Row = rows.step().unwrap() else { + panic!("expected row"); + }; + let row = rows.row().unwrap(); + let Value::Integer(page_size) = row.get_value(0) else { + panic!("expected integer value"); + }; + assert_eq!(*page_size, test_page_size); + + // Reopen database and verify page size + let db = TempDatabase::new_with_existent(&db.path, false); + let conn = db.connect_limbo(); + let mut rows = conn.query("PRAGMA page_size").unwrap().unwrap(); + let StepResult::Row = rows.step().unwrap() else { + panic!("expected row"); + }; + let row = rows.row().unwrap(); + let Value::Integer(page_size) = row.get_value(0) else { + panic!("expected integer value"); + }; + assert_eq!(*page_size, test_page_size); + } +} + +#[test] +fn test_pragma_page_sizes_with_writes_persists() { + for test_page_size in [512, 1024, 2048, 4096, 8192, 16384, 32768, 65536] { + let db = TempDatabase::new_empty(false); + { + { + let conn = db.connect_limbo(); + let pragma_query = format!("PRAGMA page_size={test_page_size}"); + conn.execute(&pragma_query).unwrap(); + + // Create table and insert data + conn.execute("CREATE TABLE test (id INTEGER PRIMARY KEY, value TEXT)") + .unwrap(); + conn.execute("INSERT INTO test (id, value) VALUES (1, 'test data')") + .unwrap(); + let mut page_size = conn.pragma_query("page_size").unwrap(); + let mut page_size = page_size.pop().unwrap(); + let page_size = page_size.pop().unwrap(); + let Value::Integer(page_size) = page_size else { + panic!("expected integer value"); + }; + assert_eq!(page_size, test_page_size); + } // Connection is dropped here + + // Reopen database and verify page size and data + let conn = db.connect_limbo(); + + // Check page size is still test_page_size + let mut page_size = conn.pragma_query("page_size").unwrap(); + let mut page_size = page_size.pop().unwrap(); + let page_size = page_size.pop().unwrap(); + let Value::Integer(page_size) = page_size else { + panic!("expected integer value"); + }; + assert_eq!(page_size, test_page_size); + + // Verify data can still be read + let mut rows = conn + .query("SELECT value FROM test WHERE id = 1") + .unwrap() + .unwrap(); + loop { + if let StepResult::Row = rows.step().unwrap() { + let row = rows.row().unwrap(); + let Value::Text(value) = row.get_value(0) else { + panic!("expected text value"); + }; + assert_eq!(value.as_str(), "test data"); + break; + } + rows.run_once().unwrap(); + } + } + + // Drop the db and reopen it, and verify the same + let db = TempDatabase::new_with_existent(&db.path, false); + let conn = db.connect_limbo(); + let mut page_size = conn.pragma_query("page_size").unwrap(); + let mut page_size = page_size.pop().unwrap(); + let page_size = page_size.pop().unwrap(); + let Value::Integer(page_size) = page_size else { + panic!("expected integer value"); + }; + assert_eq!(page_size, test_page_size); + } +}