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; } 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; }