| #include "sqliteInt.h" |
| #include "unity.h" |
| #include <string.h> |
| #include <stdlib.h> |
|
|
| |
| extern int test_renameColumnExprCb(Walker *pWalker, Expr *pExpr); |
|
|
| |
| 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) { |
| |
| } |
|
|
| void tearDown(void) { |
| |
| } |
|
|
| |
| 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); |
| } |
|
|
| |
| 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); |
| } |
|
|
| |
| 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; |
| 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); |
| } |
|
|
| |
| 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; |
|
|
| 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); |
| } |
|
|
| |
| 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; |
|
|
| 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); |
| } |
|
|
| |
| 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; |
| e.iColumn = 0; |
| |
|
|
| 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(); |
| } |