|
|
#include "sqliteInt.h" |
|
|
#include "unity.h" |
|
|
#include <stdlib.h> |
|
|
#include <string.h> |
|
|
|
|
|
|
|
|
extern void test_renameColumnElistNames( |
|
|
Parse *pParse, |
|
|
RenameCtx *pCtx, |
|
|
const ExprList *pEList, |
|
|
const char *zOld |
|
|
); |
|
|
|
|
|
|
|
|
static void openDbAndInitParse(sqlite3 **ppDb, Parse *pParse){ |
|
|
sqlite3 *db = 0; |
|
|
int rc = sqlite3_open(":memory:", &db); |
|
|
TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
memset(pParse, 0, sizeof(*pParse)); |
|
|
pParse->db = db; |
|
|
*ppDb = db; |
|
|
} |
|
|
|
|
|
|
|
|
static Expr* makeIdExpr(sqlite3 *db, const char *z){ |
|
|
Token t; |
|
|
t.z = z; |
|
|
t.n = (int)strlen(z); |
|
|
return sqlite3ExprAlloc(db, TK_ID, &t, 0); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static const char* appendExprWithAlias(Parse *pParse, ExprList **ppList, const char *zExpr, const char *zAlias){ |
|
|
ExprList *pList = *ppList; |
|
|
Expr *pExpr = makeIdExpr(pParse->db, zExpr ? zExpr : "x"); |
|
|
pList = sqlite3ExprListAppend(pParse, pList, pExpr); |
|
|
TEST_ASSERT_NOT_NULL(pList); |
|
|
Token aliasTok; |
|
|
aliasTok.z = zAlias; |
|
|
aliasTok.n = (int)strlen(zAlias); |
|
|
sqlite3ExprListSetName(pParse, pList, &aliasTok, 1); |
|
|
*ppList = pList; |
|
|
|
|
|
return pList->a[pList->nExpr-1].zEName; |
|
|
} |
|
|
|
|
|
|
|
|
static void mapNameToken(Parse *pParse, const char *zName, const char *zTok){ |
|
|
Token t; |
|
|
t.z = zTok; |
|
|
t.n = (int)strlen(zTok); |
|
|
sqlite3RenameTokenMap(pParse, (void*)zName, &t); |
|
|
} |
|
|
|
|
|
void setUp(void) { |
|
|
|
|
|
} |
|
|
|
|
|
void tearDown(void) { |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
void test_renameColumnElistNames_null_list(void){ |
|
|
sqlite3 *db = 0; |
|
|
Parse sParse; |
|
|
openDbAndInitParse(&db, &sParse); |
|
|
|
|
|
RenameCtx ctx; |
|
|
memset(&ctx, 0, sizeof(ctx)); |
|
|
|
|
|
ctx.pParse = &sParse; |
|
|
|
|
|
test_renameColumnElistNames(&sParse, &ctx, NULL, "x"); |
|
|
TEST_ASSERT_EQUAL_INT(0, ctx.nList); |
|
|
|
|
|
sqlite3_close(db); |
|
|
} |
|
|
|
|
|
|
|
|
void test_renameColumnElistNames_no_matches(void){ |
|
|
sqlite3 *db = 0; |
|
|
Parse sParse; |
|
|
openDbAndInitParse(&db, &sParse); |
|
|
|
|
|
ExprList *pList = NULL; |
|
|
const char *zA = appendExprWithAlias(&sParse, &pList, "col1", "A"); |
|
|
const char *zB = appendExprWithAlias(&sParse, &pList, "col2", "B"); |
|
|
const char *zC = appendExprWithAlias(&sParse, &pList, "col3", "C"); |
|
|
|
|
|
|
|
|
mapNameToken(&sParse, zA, "TOK_A"); |
|
|
mapNameToken(&sParse, zB, "TOK_B"); |
|
|
mapNameToken(&sParse, zC, "TOK_C"); |
|
|
|
|
|
RenameCtx ctx; |
|
|
memset(&ctx, 0, sizeof(ctx)); |
|
|
ctx.pParse = &sParse; |
|
|
|
|
|
test_renameColumnElistNames(&sParse, &ctx, pList, "Z"); |
|
|
TEST_ASSERT_EQUAL_INT(0, ctx.nList); |
|
|
|
|
|
sqlite3ExprListDelete(sParse.db, pList); |
|
|
sqlite3_close(db); |
|
|
} |
|
|
|
|
|
|
|
|
void test_renameColumnElistNames_single_match_case_insensitive(void){ |
|
|
sqlite3 *db = 0; |
|
|
Parse sParse; |
|
|
openDbAndInitParse(&db, &sParse); |
|
|
|
|
|
ExprList *pList = NULL; |
|
|
const char *zFoo = appendExprWithAlias(&sParse, &pList, "col1", "Foo"); |
|
|
const char *zBar = appendExprWithAlias(&sParse, &pList, "col2", "Bar"); |
|
|
|
|
|
mapNameToken(&sParse, zFoo, "TOK_FOO"); |
|
|
mapNameToken(&sParse, zBar, "TOK_BAR"); |
|
|
|
|
|
RenameCtx ctx; |
|
|
memset(&ctx, 0, sizeof(ctx)); |
|
|
ctx.pParse = &sParse; |
|
|
|
|
|
test_renameColumnElistNames(&sParse, &ctx, pList, "fOO"); |
|
|
TEST_ASSERT_EQUAL_INT(1, ctx.nList); |
|
|
TEST_ASSERT_NOT_NULL(ctx.aList); |
|
|
TEST_ASSERT_TRUE(ctx.aList[0].n > 0); |
|
|
|
|
|
|
|
|
sqlite3DbFree(sParse.db, ctx.aList); |
|
|
sqlite3ExprListDelete(sParse.db, pList); |
|
|
sqlite3_close(db); |
|
|
} |
|
|
|
|
|
|
|
|
void test_renameColumnElistNames_multiple_matches(void){ |
|
|
sqlite3 *db = 0; |
|
|
Parse sParse; |
|
|
openDbAndInitParse(&db, &sParse); |
|
|
|
|
|
ExprList *pList = NULL; |
|
|
const char *zX1 = appendExprWithAlias(&sParse, &pList, "c1", "x"); |
|
|
const char *zX2 = appendExprWithAlias(&sParse, &pList, "c2", "X"); |
|
|
const char *zY = appendExprWithAlias(&sParse, &pList, "c3", "y"); |
|
|
const char *zX3 = appendExprWithAlias(&sParse, &pList, "c4", "x"); |
|
|
|
|
|
mapNameToken(&sParse, zX1, "TOK_X1"); |
|
|
mapNameToken(&sParse, zX2, "TOK_X2"); |
|
|
mapNameToken(&sParse, zY, "TOK_Y"); |
|
|
mapNameToken(&sParse, zX3, "TOK_X3"); |
|
|
|
|
|
RenameCtx ctx; |
|
|
memset(&ctx, 0, sizeof(ctx)); |
|
|
ctx.pParse = &sParse; |
|
|
|
|
|
test_renameColumnElistNames(&sParse, &ctx, pList, "x"); |
|
|
TEST_ASSERT_EQUAL_INT(3, ctx.nList); |
|
|
|
|
|
sqlite3DbFree(sParse.db, ctx.aList); |
|
|
sqlite3ExprListDelete(sParse.db, pList); |
|
|
sqlite3_close(db); |
|
|
} |
|
|
|
|
|
|
|
|
void test_renameColumnElistNames_ignores_non_ENAME_NAME(void){ |
|
|
sqlite3 *db = 0; |
|
|
Parse sParse; |
|
|
openDbAndInitParse(&db, &sParse); |
|
|
|
|
|
ExprList *pList = NULL; |
|
|
const char *zTgtIgnored = appendExprWithAlias(&sParse, &pList, "c1", "tgt"); |
|
|
const char *zTgtMatch = appendExprWithAlias(&sParse, &pList, "c2", "tgt"); |
|
|
|
|
|
|
|
|
TEST_ASSERT_TRUE(pList->nExpr >= 2); |
|
|
pList->a[0].fg.eEName = ENAME_SPAN; |
|
|
|
|
|
|
|
|
mapNameToken(&sParse, zTgtIgnored, "TOK_IGN"); |
|
|
mapNameToken(&sParse, zTgtMatch, "TOK_MATCH"); |
|
|
|
|
|
RenameCtx ctx; |
|
|
memset(&ctx, 0, sizeof(ctx)); |
|
|
ctx.pParse = &sParse; |
|
|
|
|
|
test_renameColumnElistNames(&sParse, &ctx, pList, "TGT"); |
|
|
TEST_ASSERT_EQUAL_INT(1, ctx.nList); |
|
|
|
|
|
sqlite3DbFree(sParse.db, ctx.aList); |
|
|
sqlite3ExprListDelete(sParse.db, pList); |
|
|
sqlite3_close(db); |
|
|
} |
|
|
|
|
|
|
|
|
void test_renameColumnElistNames_ignores_null_zEName(void){ |
|
|
sqlite3 *db = 0; |
|
|
Parse sParse; |
|
|
openDbAndInitParse(&db, &sParse); |
|
|
|
|
|
ExprList *pList = NULL; |
|
|
const char *zGood = appendExprWithAlias(&sParse, &pList, "c2", "Alive"); |
|
|
|
|
|
|
|
|
(void)appendExprWithAlias(&sParse, &pList, "cNULL", "NullName"); |
|
|
pList->a[pList->nExpr-1].zEName = NULL; |
|
|
|
|
|
pList->a[0].fg.eEName = ENAME_NAME; |
|
|
pList->a[1].fg.eEName = ENAME_NAME; |
|
|
|
|
|
mapNameToken(&sParse, zGood, "TOK_ALIVE"); |
|
|
|
|
|
RenameCtx ctx; |
|
|
memset(&ctx, 0, sizeof(ctx)); |
|
|
ctx.pParse = &sParse; |
|
|
|
|
|
test_renameColumnElistNames(&sParse, &ctx, pList, "Alive"); |
|
|
TEST_ASSERT_EQUAL_INT(1, ctx.nList); |
|
|
|
|
|
sqlite3DbFree(sParse.db, ctx.aList); |
|
|
sqlite3ExprListDelete(sParse.db, pList); |
|
|
sqlite3_close(db); |
|
|
} |
|
|
|
|
|
int main(void){ |
|
|
UNITY_BEGIN(); |
|
|
RUN_TEST(test_renameColumnElistNames_null_list); |
|
|
RUN_TEST(test_renameColumnElistNames_no_matches); |
|
|
RUN_TEST(test_renameColumnElistNames_single_match_case_insensitive); |
|
|
RUN_TEST(test_renameColumnElistNames_multiple_matches); |
|
|
RUN_TEST(test_renameColumnElistNames_ignores_non_ENAME_NAME); |
|
|
RUN_TEST(test_renameColumnElistNames_ignores_null_zEName); |
|
|
return UNITY_END(); |
|
|
} |