| #define SQLITE_CORE 1 |
| #include "unity.h" |
| #include "sqliteInt.h" |
| #include <string.h> |
|
|
| void setUp(void) {} |
| void tearDown(void) {} |
|
|
| |
| extern int test_renameTableSelectCb(Walker *pWalker, Select *pSelect); |
|
|
| |
| void test_renameTableSelectCb_prunes_view(void) { |
| sqlite3 *db; |
| sqlite3_open(":memory:", &db); |
| |
| Parse parse = {0}; |
| parse.db = db; |
| |
| Walker walker = {0}; |
| walker.pParse = &parse; |
| |
| Select select = {0}; |
| select.selFlags = SF_View; |
| select.pSrc = NULL; |
| |
| int result = test_renameTableSelectCb(&walker, &select); |
| |
| TEST_ASSERT_EQUAL(WRC_Prune, result); |
| sqlite3_close(db); |
| } |
|
|
| |
| void test_renameTableSelectCb_prunes_copycte(void) { |
| sqlite3 *db; |
| sqlite3_open(":memory:", &db); |
| |
| Parse parse = {0}; |
| parse.db = db; |
| |
| Walker walker = {0}; |
| walker.pParse = &parse; |
| |
| Select select = {0}; |
| select.selFlags = SF_CopyCte; |
| select.pSrc = NULL; |
| |
| int result = test_renameTableSelectCb(&walker, &select); |
| |
| TEST_ASSERT_EQUAL(WRC_Prune, result); |
| sqlite3_close(db); |
| } |
|
|
| |
| void test_renameTableSelectCb_prunes_view_and_cte(void) { |
| sqlite3 *db; |
| sqlite3_open(":memory:", &db); |
| |
| Parse parse = {0}; |
| parse.db = db; |
| |
| Walker walker = {0}; |
| walker.pParse = &parse; |
| |
| Select select = {0}; |
| select.selFlags = SF_View | SF_CopyCte; |
| select.pSrc = NULL; |
| |
| int result = test_renameTableSelectCb(&walker, &select); |
| |
| TEST_ASSERT_EQUAL(WRC_Prune, result); |
| sqlite3_close(db); |
| } |
|
|
| |
| void test_renameTableSelectCb_null_srclist_aborts(void) { |
| sqlite3 *db; |
| sqlite3_open(":memory:", &db); |
| |
| Parse parse = {0}; |
| parse.db = db; |
| db->mallocFailed = 1; |
| |
| Walker walker = {0}; |
| walker.pParse = &parse; |
| |
| Select select = {0}; |
| select.selFlags = 0; |
| select.pSrc = NULL; |
| |
| int result = test_renameTableSelectCb(&walker, &select); |
| |
| TEST_ASSERT_EQUAL(WRC_Abort, result); |
| sqlite3_close(db); |
| } |
|
|
| |
| void test_renameTableSelectCb_empty_srclist_continues(void) { |
| sqlite3 *db; |
| sqlite3_open(":memory:", &db); |
| |
| Parse parse = {0}; |
| parse.db = db; |
| |
| Table *pTab = sqlite3DbMallocZero(db, sizeof(Table)); |
| pTab->zName = sqlite3DbStrDup(db, "old_table"); |
| |
| |
| struct RenameCtx { |
| Table *pTab; |
| const char *zOld; |
| }; |
| |
| struct RenameCtx *pRename = sqlite3DbMallocZero(db, sizeof(struct RenameCtx)); |
| pRename->pTab = pTab; |
| |
| Walker walker = {0}; |
| walker.pParse = &parse; |
| walker.u.pRename = (void*)pRename; |
| |
| |
| SrcList *pSrc = sqlite3DbMallocZero(db, sizeof(SrcList)); |
| pSrc->nSrc = 0; |
| |
| Select select = {0}; |
| select.pSrc = pSrc; |
| select.selFlags = 0; |
| |
| int result = test_renameTableSelectCb(&walker, &select); |
| |
| TEST_ASSERT_EQUAL(WRC_Continue, result); |
| |
| sqlite3DbFree(db, pRename); |
| sqlite3DbFree(db, pSrc); |
| sqlite3DbFree(db, pTab->zName); |
| sqlite3DbFree(db, pTab); |
| sqlite3_close(db); |
| } |
|
|
| |
| void test_renameTableSelectCb_finds_table_reference(void) { |
| sqlite3 *db; |
| sqlite3_open(":memory:", &db); |
| |
| Parse parse = {0}; |
| parse.db = db; |
| |
| |
| Table *pTab = sqlite3DbMallocZero(db, sizeof(Table)); |
| pTab->zName = sqlite3DbStrDup(db, "old_table"); |
| |
| struct RenameCtx { |
| Table *pTab; |
| const char *zOld; |
| }; |
| |
| struct RenameCtx *pRename = sqlite3DbMallocZero(db, sizeof(struct RenameCtx)); |
| pRename->pTab = pTab; |
| |
| Walker walker = {0}; |
| walker.pParse = &parse; |
| walker.u.pRename = (void*)pRename; |
| |
| |
| SrcList *pSrc = sqlite3DbMallocZero(db, sizeof(SrcList) + sizeof(SrcItem)); |
| pSrc->nSrc = 1; |
| pSrc->a[0].pSTab = pTab; |
| pSrc->a[0].zName = "old_table"; |
| |
| Select select = {0}; |
| select.pSrc = pSrc; |
| select.selFlags = 0; |
| |
| int result = test_renameTableSelectCb(&walker, &select); |
| |
| |
| TEST_ASSERT_EQUAL(WRC_Continue, result); |
| |
| sqlite3DbFree(db, pRename); |
| sqlite3DbFree(db, pSrc); |
| sqlite3DbFree(db, pTab->zName); |
| sqlite3DbFree(db, pTab); |
| sqlite3_close(db); |
| } |
|
|
| |
| void test_renameTableSelectCb_table_not_found(void) { |
| sqlite3 *db; |
| sqlite3_open(":memory:", &db); |
| |
| Parse parse = {0}; |
| parse.db = db; |
| |
| |
| Table *pTab = sqlite3DbMallocZero(db, sizeof(Table)); |
| pTab->zName = sqlite3DbStrDup(db, "old_table"); |
| |
| struct RenameCtx { |
| Table *pTab; |
| const char *zOld; |
| }; |
| |
| struct RenameCtx *pRename = sqlite3DbMallocZero(db, sizeof(struct RenameCtx)); |
| pRename->pTab = pTab; |
| |
| Walker walker = {0}; |
| walker.pParse = &parse; |
| walker.u.pRename = (void*)pRename; |
| |
| |
| Table *pOtherTab = sqlite3DbMallocZero(db, sizeof(Table)); |
| pOtherTab->zName = sqlite3DbStrDup(db, "other_table"); |
| |
| SrcList *pSrc = sqlite3DbMallocZero(db, sizeof(SrcList) + sizeof(SrcItem)); |
| pSrc->nSrc = 1; |
| pSrc->a[0].pSTab = pOtherTab; |
| pSrc->a[0].zName = "other_table"; |
| |
| Select select = {0}; |
| select.pSrc = pSrc; |
| select.selFlags = 0; |
| |
| int result = test_renameTableSelectCb(&walker, &select); |
| |
| TEST_ASSERT_EQUAL(WRC_Continue, result); |
| |
| sqlite3DbFree(db, pRename); |
| sqlite3DbFree(db, pSrc); |
| sqlite3DbFree(db, pTab->zName); |
| sqlite3DbFree(db, pTab); |
| sqlite3DbFree(db, pOtherTab->zName); |
| sqlite3DbFree(db, pOtherTab); |
| sqlite3_close(db); |
| } |
|
|
| |
| void test_renameTableSelectCb_multiple_tables_found(void) { |
| sqlite3 *db; |
| sqlite3_open(":memory:", &db); |
| |
| Parse parse = {0}; |
| parse.db = db; |
| |
| |
| Table *pTab = sqlite3DbMallocZero(db, sizeof(Table)); |
| pTab->zName = sqlite3DbStrDup(db, "target_table"); |
| |
| struct RenameCtx { |
| Table *pTab; |
| const char *zOld; |
| }; |
| |
| struct RenameCtx *pRename = sqlite3DbMallocZero(db, sizeof(struct RenameCtx)); |
| pRename->pTab = pTab; |
| |
| Walker walker = {0}; |
| walker.pParse = &parse; |
| walker.u.pRename = (void*)pRename; |
| |
| |
| Table *pTab1 = sqlite3DbMallocZero(db, sizeof(Table)); |
| pTab1->zName = sqlite3DbStrDup(db, "table1"); |
| |
| Table *pTab2 = sqlite3DbMallocZero(db, sizeof(Table)); |
| pTab2->zName = sqlite3DbStrDup(db, "table2"); |
| |
| |
| SrcList *pSrc = sqlite3DbMallocZero(db, sizeof(SrcList) + 3 * sizeof(SrcItem)); |
| pSrc->nSrc = 3; |
| pSrc->a[0].pSTab = pTab1; |
| pSrc->a[0].zName = "table1"; |
| pSrc->a[1].pSTab = pTab; |
| pSrc->a[1].zName = "target_table"; |
| pSrc->a[2].pSTab = pTab2; |
| pSrc->a[2].zName = "table2"; |
| |
| Select select = {0}; |
| select.pSrc = pSrc; |
| select.selFlags = 0; |
| |
| int result = test_renameTableSelectCb(&walker, &select); |
| |
| TEST_ASSERT_EQUAL(WRC_Continue, result); |
| |
| sqlite3DbFree(db, pRename); |
| sqlite3DbFree(db, pSrc); |
| sqlite3DbFree(db, pTab->zName); |
| sqlite3DbFree(db, pTab); |
| sqlite3DbFree(db, pTab1->zName); |
| sqlite3DbFree(db, pTab1); |
| sqlite3DbFree(db, pTab2->zName); |
| sqlite3DbFree(db, pTab2); |
| sqlite3_close(db); |
| } |
|
|
| |
| void test_renameTableSelectCb_multiple_tables_not_found(void) { |
| sqlite3 *db; |
| sqlite3_open(":memory:", &db); |
| |
| Parse parse = {0}; |
| parse.db = db; |
| |
| |
| Table *pTab = sqlite3DbMallocZero(db, sizeof(Table)); |
| pTab->zName = sqlite3DbStrDup(db, "target_table"); |
| |
| struct RenameCtx { |
| Table *pTab; |
| const char *zOld; |
| }; |
| |
| struct RenameCtx *pRename = sqlite3DbMallocZero(db, sizeof(struct RenameCtx)); |
| pRename->pTab = pTab; |
| |
| Walker walker = {0}; |
| walker.pParse = &parse; |
| walker.u.pRename = (void*)pRename; |
| |
| |
| Table *pTab1 = sqlite3DbMallocZero(db, sizeof(Table)); |
| pTab1->zName = sqlite3DbStrDup(db, "table1"); |
| |
| Table *pTab2 = sqlite3DbMallocZero(db, sizeof(Table)); |
| pTab2->zName = sqlite3DbStrDup(db, "table2"); |
| |
| SrcList *pSrc = sqlite3DbMallocZero(db, sizeof(SrcList) + 2 * sizeof(SrcItem)); |
| pSrc->nSrc = 2; |
| pSrc->a[0].pSTab = pTab1; |
| pSrc->a[0].zName = "table1"; |
| pSrc->a[1].pSTab = pTab2; |
| pSrc->a[1].zName = "table2"; |
| |
| |
| Select select = {0}; |
| select.pSrc = pSrc; |
| select.selFlags = 0; |
| |
| int result = test_renameTableSelectCb(&walker, &select); |
| |
| TEST_ASSERT_EQUAL(WRC_Continue, result); |
| |
| sqlite3DbFree(db, pRename); |
| sqlite3DbFree(db, pSrc); |
| sqlite3DbFree(db, pTab->zName); |
| sqlite3DbFree(db, pTab); |
| sqlite3DbFree(db, pTab1->zName); |
| sqlite3DbFree(db, pTab1); |
| sqlite3DbFree(db, pTab2->zName); |
| sqlite3DbFree(db, pTab2); |
| sqlite3_close(db); |
| } |
|
|
| int main(void) { |
| UNITY_BEGIN(); |
| |
| RUN_TEST(test_renameTableSelectCb_prunes_view); |
| RUN_TEST(test_renameTableSelectCb_prunes_copycte); |
| RUN_TEST(test_renameTableSelectCb_prunes_view_and_cte); |
| RUN_TEST(test_renameTableSelectCb_null_srclist_aborts); |
| RUN_TEST(test_renameTableSelectCb_empty_srclist_continues); |
| RUN_TEST(test_renameTableSelectCb_finds_table_reference); |
| RUN_TEST(test_renameTableSelectCb_table_not_found); |
| RUN_TEST(test_renameTableSelectCb_multiple_tables_found); |
| RUN_TEST(test_renameTableSelectCb_multiple_tables_not_found); |
| |
| return UNITY_END(); |
| } |