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