|
|
#include "sqliteInt.h" |
|
|
#include "unity.h" |
|
|
#include <string.h> |
|
|
|
|
|
|
|
|
static sqlite3 *gDb = NULL; |
|
|
|
|
|
static Expr* make_id_expr(Parse *pParse, const char *zId){ |
|
|
Token t; |
|
|
t.z = (char*)zId; |
|
|
t.n = (int)strlen(zId); |
|
|
return sqlite3ExprAlloc(pParse->db, TK_ID, &t, 0); |
|
|
} |
|
|
|
|
|
static Expr* make_int_expr(Parse *pParse, const char *zNum){ |
|
|
Token t; |
|
|
t.z = (char*)zNum; |
|
|
t.n = (int)strlen(zNum); |
|
|
return sqlite3ExprAlloc(pParse->db, TK_INTEGER, &t, 0); |
|
|
} |
|
|
|
|
|
void setUp(void) { |
|
|
if (!gDb) { |
|
|
int rc = sqlite3_open(":memory:", &gDb); |
|
|
TEST_ASSERT_EQUAL_INT_MESSAGE(SQLITE_OK, rc, "Failed to open in-memory DB"); |
|
|
} |
|
|
} |
|
|
|
|
|
void tearDown(void) { |
|
|
if (gDb) { |
|
|
int rc = sqlite3_close(gDb); |
|
|
TEST_ASSERT_EQUAL_INT_MESSAGE(SQLITE_OK, rc, "Failed to close in-memory DB"); |
|
|
gDb = NULL; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
static void initParse(Parse *pParse){ |
|
|
memset(pParse, 0, sizeof(Parse)); |
|
|
pParse->db = gDb; |
|
|
|
|
|
pParse->eParseMode = PARSE_MODE_RENAME; |
|
|
} |
|
|
|
|
|
|
|
|
void test_sqlite3RenameExprUnmap_restores_mode_when_expr_null(void){ |
|
|
Parse sParse; |
|
|
initParse(&sParse); |
|
|
u8 orig = sParse.eParseMode; |
|
|
|
|
|
sqlite3RenameExprUnmap(&sParse, NULL); |
|
|
|
|
|
TEST_ASSERT_EQUAL_UINT8(orig, sParse.eParseMode); |
|
|
TEST_ASSERT_EQUAL_INT(0, sParse.nErr); |
|
|
} |
|
|
|
|
|
|
|
|
void test_sqlite3RenameExprUnmap_restores_mode_when_expr_simple(void){ |
|
|
Parse sParse; |
|
|
initParse(&sParse); |
|
|
|
|
|
Expr *pInt = make_int_expr(&sParse, "123"); |
|
|
TEST_ASSERT_NOT_NULL(pInt); |
|
|
|
|
|
u8 orig = sParse.eParseMode; |
|
|
sqlite3RenameExprUnmap(&sParse, pInt); |
|
|
|
|
|
TEST_ASSERT_EQUAL_UINT8(orig, sParse.eParseMode); |
|
|
TEST_ASSERT_EQUAL_INT(0, sParse.nErr); |
|
|
|
|
|
sqlite3ExprDelete(sParse.db, pInt); |
|
|
} |
|
|
|
|
|
|
|
|
void test_sqlite3RenameExprUnmap_does_not_modify_tree(void){ |
|
|
Parse sParse; |
|
|
initParse(&sParse); |
|
|
|
|
|
Expr *pA = make_id_expr(&sParse, "a"); |
|
|
Expr *pB = make_id_expr(&sParse, "b"); |
|
|
TEST_ASSERT_NOT_NULL(pA); |
|
|
TEST_ASSERT_NOT_NULL(pB); |
|
|
|
|
|
Expr *pPlus = sqlite3PExpr(&sParse, TK_PLUS, pA, pB); |
|
|
TEST_ASSERT_NOT_NULL(pPlus); |
|
|
|
|
|
Expr *pLeftBefore = pPlus->pLeft; |
|
|
Expr *pRightBefore = pPlus->pRight; |
|
|
|
|
|
sqlite3RenameExprUnmap(&sParse, pPlus); |
|
|
|
|
|
|
|
|
TEST_ASSERT_EQUAL_PTR(pLeftBefore, pPlus->pLeft); |
|
|
TEST_ASSERT_EQUAL_PTR(pRightBefore, pPlus->pRight); |
|
|
TEST_ASSERT_EQUAL_INT(0, sParse.nErr); |
|
|
|
|
|
sqlite3ExprDelete(sParse.db, pPlus); |
|
|
} |
|
|
|
|
|
|
|
|
void test_sqlite3RenameExprUnmap_handles_nested_tree_no_side_effects(void){ |
|
|
Parse sParse; |
|
|
initParse(&sParse); |
|
|
|
|
|
|
|
|
Expr *pA = make_id_expr(&sParse, "a"); |
|
|
Expr *pB = make_id_expr(&sParse, "b"); |
|
|
Expr *pPlus = sqlite3PExpr(&sParse, TK_PLUS, pA, pB); |
|
|
TEST_ASSERT_NOT_NULL(pA); |
|
|
TEST_ASSERT_NOT_NULL(pB); |
|
|
TEST_ASSERT_NOT_NULL(pPlus); |
|
|
|
|
|
Expr *pThree = make_int_expr(&sParse, "3"); |
|
|
TEST_ASSERT_NOT_NULL(pThree); |
|
|
|
|
|
|
|
|
Expr *pMul = sqlite3PExpr(&sParse, TK_STAR, pPlus, pThree); |
|
|
TEST_ASSERT_NOT_NULL(pMul); |
|
|
|
|
|
u8 orig = sParse.eParseMode; |
|
|
sqlite3RenameExprUnmap(&sParse, pMul); |
|
|
|
|
|
|
|
|
TEST_ASSERT_EQUAL_UINT8(orig, sParse.eParseMode); |
|
|
TEST_ASSERT_EQUAL_INT(0, sParse.nErr); |
|
|
|
|
|
|
|
|
TEST_ASSERT_EQUAL_PTR(pPlus, pMul->pLeft); |
|
|
TEST_ASSERT_EQUAL_PTR(pThree, pMul->pRight); |
|
|
|
|
|
sqlite3ExprDelete(sParse.db, pMul); |
|
|
} |
|
|
|
|
|
int main(void) { |
|
|
UNITY_BEGIN(); |
|
|
RUN_TEST(test_sqlite3RenameExprUnmap_restores_mode_when_expr_null); |
|
|
RUN_TEST(test_sqlite3RenameExprUnmap_restores_mode_when_expr_simple); |
|
|
RUN_TEST(test_sqlite3RenameExprUnmap_does_not_modify_tree); |
|
|
RUN_TEST(test_sqlite3RenameExprUnmap_handles_nested_tree_no_side_effects); |
|
|
return UNITY_END(); |
|
|
} |