#include "sqliteInt.h" #include "unity.h" #include #include /* Wrapper for the static function provided by the build system */ extern int test_renameColumnExprCb(Walker *pWalker, Expr *pExpr); /* sqlite internal helper we rely on to seed the token-map */ extern void sqlite3RenameTokenMap(Parse*, void*, Token*); static void initParse(Parse *pParse, sqlite3 *db){ memset(pParse, 0, sizeof(*pParse)); pParse->db = db; } static void initWalkerCtx(Parse *pParse, Walker *pWalker, RenameCtx *pCtx, Table *pTab, int iCol){ memset(pWalker, 0, sizeof(*pWalker)); memset(pCtx, 0, sizeof(*pCtx)); pCtx->pTab = pTab; pCtx->iCol = iCol; pWalker->u.pRename = pCtx; pWalker->pParse = pParse; } static void mapTokenForExpr(Parse *pParse, Expr *pExpr, const char *zTok){ Token t; t.z = zTok; t.n = (int)strlen(zTok); sqlite3RenameTokenMap(pParse, (void*)pExpr, &t); } void setUp(void) { /* no-op */ } void tearDown(void) { /* no-op */ } /* Positive: TK_COLUMN match (iCol and pTab match) triggers token capture */ void test_renameColumnExprCb_column_match(void){ sqlite3 *db = 0; TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_open(":memory:", &db)); Parse parse; initParse(&parse, db); Walker w; RenameCtx ctx; Table tab; initWalkerCtx(&parse, &w, &ctx, &tab, 2); Expr e; memset(&e, 0, sizeof(e)); e.op = TK_COLUMN; e.iColumn = 2; e.y.pTab = &tab; mapTokenForExpr(&parse, &e, "coltok"); int rc = test_renameColumnExprCb(&w, &e); TEST_ASSERT_EQUAL_INT(WRC_Continue, rc); TEST_ASSERT_NOT_NULL(ctx.pList); TEST_ASSERT_EQUAL_PTR(&e, ctx.pList->p); sqlite3_close(db); } /* Positive: TK_TRIGGER match (iCol matches and pTriggerTab==pTab) triggers token capture */ void test_renameColumnExprCb_trigger_match(void){ sqlite3 *db = 0; TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_open(":memory:", &db)); Parse parse; initParse(&parse, db); Walker w; RenameCtx ctx; Table tab; initWalkerCtx(&parse, &w, &ctx, &tab, 5); parse.pTriggerTab = &tab; Expr e; memset(&e, 0, sizeof(e)); e.op = TK_TRIGGER; e.iColumn = 5; mapTokenForExpr(&parse, &e, "trigtok"); int rc = test_renameColumnExprCb(&w, &e); TEST_ASSERT_EQUAL_INT(WRC_Continue, rc); TEST_ASSERT_NOT_NULL(ctx.pList); TEST_ASSERT_EQUAL_PTR(&e, ctx.pList->p); sqlite3_close(db); } /* Negative: TK_COLUMN but iCol mismatch -> no token captured */ void test_renameColumnExprCb_column_mismatch_iCol(void){ sqlite3 *db = 0; TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_open(":memory:", &db)); Parse parse; initParse(&parse, db); Walker w; RenameCtx ctx; Table tab; initWalkerCtx(&parse, &w, &ctx, &tab, 1); Expr e; memset(&e, 0, sizeof(e)); e.op = TK_COLUMN; e.iColumn = 3; /* mismatch */ e.y.pTab = &tab; mapTokenForExpr(&parse, &e, "coltok"); int rc = test_renameColumnExprCb(&w, &e); TEST_ASSERT_EQUAL_INT(WRC_Continue, rc); TEST_ASSERT_NULL(ctx.pList); sqlite3_close(db); } /* Negative: TK_COLUMN with table mismatch -> no token captured */ void test_renameColumnExprCb_column_mismatch_table(void){ sqlite3 *db = 0; TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_open(":memory:", &db)); Parse parse; initParse(&parse, db); Walker w; RenameCtx ctx; Table tab1, tab2; initWalkerCtx(&parse, &w, &ctx, &tab1, 2); Expr e; memset(&e, 0, sizeof(e)); e.op = TK_COLUMN; e.iColumn = 2; e.y.pTab = &tab2; /* different table pointer */ mapTokenForExpr(&parse, &e, "coltok"); int rc = test_renameColumnExprCb(&w, &e); TEST_ASSERT_EQUAL_INT(WRC_Continue, rc); TEST_ASSERT_NULL(ctx.pList); sqlite3_close(db); } /* Negative: TK_TRIGGER with trigger table mismatch -> no token captured */ void test_renameColumnExprCb_trigger_mismatch_table(void){ sqlite3 *db = 0; TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_open(":memory:", &db)); Parse parse; initParse(&parse, db); Walker w; RenameCtx ctx; Table tab1, tab2; initWalkerCtx(&parse, &w, &ctx, &tab1, 4); parse.pTriggerTab = &tab2; /* different trigger table */ Expr e; memset(&e, 0, sizeof(e)); e.op = TK_TRIGGER; e.iColumn = 4; mapTokenForExpr(&parse, &e, "trigtok"); int rc = test_renameColumnExprCb(&w, &e); TEST_ASSERT_EQUAL_INT(WRC_Continue, rc); TEST_ASSERT_NULL(ctx.pList); sqlite3_close(db); } /* Negative: Unrelated opcode -> no token captured */ void test_renameColumnExprCb_other_opcode_noop(void){ sqlite3 *db = 0; TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_open(":memory:", &db)); Parse parse; initParse(&parse, db); Walker w; RenameCtx ctx; Table tab; initWalkerCtx(&parse, &w, &ctx, &tab, 0); Expr e; memset(&e, 0, sizeof(e)); e.op = TK_INTEGER; /* some non-matching opcode */ e.iColumn = 0; /* e.y.pTab unused for this opcode */ mapTokenForExpr(&parse, &e, "othertok"); int rc = test_renameColumnExprCb(&w, &e); TEST_ASSERT_EQUAL_INT(WRC_Continue, rc); TEST_ASSERT_NULL(ctx.pList); sqlite3_close(db); } int main(void){ UNITY_BEGIN(); RUN_TEST(test_renameColumnExprCb_column_match); RUN_TEST(test_renameColumnExprCb_trigger_match); RUN_TEST(test_renameColumnExprCb_column_mismatch_iCol); RUN_TEST(test_renameColumnExprCb_column_mismatch_table); RUN_TEST(test_renameColumnExprCb_trigger_mismatch_table); RUN_TEST(test_renameColumnExprCb_other_opcode_noop); return UNITY_END(); }