|
|
#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(); |
|
|
} |