sqlite / tests /tests_alter_renameColumnExprCb.c
AryaWu's picture
Upload folder using huggingface_hub
7510827 verified
#include "sqliteInt.h"
#include "unity.h"
#include <string.h>
#include <stdlib.h>
/* 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();
}