From 97db5f14c6031ade80e886e33d5099f9076f8db1 Mon Sep 17 00:00:00 2001 From: All Asmaul Husnain <2263081025@uttarauniversity.edu.bd> Date: Wed, 4 Nov 2026 03:13:20 +0600 Subject: [PATCH 1/2] Preserve pager capacity errors in table_open --- src/database.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/database.c b/src/database.c index 2d09ad5..e4319a6 100644 --- a/src/database.c +++ b/src/database.c @@ -55,7 +55,17 @@ Table *table_open(const char *filename, SqliteResult *result) PagerResult pager_result; Pager *pager = pager_open(filename, &pager_result); if (pager == NULL) { - *result = pager_result == PAGER_CORRUPT ? SQLITE_CORRUPT : SQLITE_IO_ERROR; + switch (pager_result) { + case PAGER_CORRUPT: + *result = SQLITE_CORRUPT; + break; + case PAGER_OUT_OF_PAGES: + *result = SQLITE_TABLE_FULL; + break; + default: + *result = SQLITE_IO_ERROR; + break; + } return NULL; } From 9f1cbeffb7e42435a55d2fafe01718cc7c8f5c1a Mon Sep 17 00:00:00 2001 From: All Asmaul Husnain <2263081025@uttarauniversity.edu.bd> Date: Wed, 4 Nov 2026 03:13:23 +0600 Subject: [PATCH 2/2] Test database page limit error mapping --- tests/test_database.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/test_database.c b/tests/test_database.c index 9dd3e67..04c5103 100644 --- a/tests/test_database.c +++ b/tests/test_database.c @@ -228,6 +228,25 @@ static void test_corrupt_node_count_is_rejected(void) remove(filename); } +static void test_database_exceeding_page_limit_reports_table_full(void) +{ + const char *filename = "build/test_too_many_pages.db"; + FILE *file = fopen(filename, "wb"); + assert(file != NULL); + + unsigned char page[PAGE_SIZE] = {0}; + for (size_t i = 0; i < TABLE_MAX_PAGES + 1U; ++i) { + assert(fwrite(page, sizeof(page), 1U, file) == 1U); + } + assert(fclose(file) == 0); + + SqliteResult result = SQLITE_OK; + Table *table = table_open(filename, &result); + assert(table == NULL); + assert(result == SQLITE_TABLE_FULL); + remove(filename); +} + static void test_partial_page_database_is_reported_as_corrupt(void) { const char *filename = "build/test_partial_page.db"; @@ -287,6 +306,7 @@ int main(void) test_corrupt_node_count_is_rejected(); test_corrupt_metadata_page_is_rejected(); test_partial_page_database_is_reported_as_corrupt(); + test_database_exceeding_page_limit_reports_table_full(); test_corrupt_child_reference_is_rejected(); return 0; }