|
|
#include "sqliteInt.h" |
|
|
#include "unity.h" |
|
|
#include <stdlib.h> |
|
|
#include <string.h> |
|
|
|
|
|
|
|
|
extern void test_renameWalkTrigger(Walker *pWalker, Trigger *pTrigger); |
|
|
|
|
|
|
|
|
typedef struct CallbackState { |
|
|
|
|
|
int nExprCalls; |
|
|
int nSelectCalls; |
|
|
|
|
|
|
|
|
int hitWhen; |
|
|
int hitWhere; |
|
|
int hitList1; |
|
|
int hitList2; |
|
|
int hitUpTarget1; |
|
|
int hitUpSet1; |
|
|
int hitUpWhere; |
|
|
int hitUpTargetWhere; |
|
|
int hitSel1; |
|
|
int hitSel2; |
|
|
|
|
|
|
|
|
int unexpectedExpr; |
|
|
int unexpectedSelect; |
|
|
|
|
|
|
|
|
Expr *pWhen; |
|
|
Expr *pWhere; |
|
|
Expr *pList1; |
|
|
Expr *pList2; |
|
|
Expr *pUpTarget1; |
|
|
Expr *pUpSet1; |
|
|
Expr *pUpWhere; |
|
|
Expr *pUpTargetWhere; |
|
|
Select *pSel1; |
|
|
Select *pSel2; |
|
|
} CallbackState; |
|
|
|
|
|
static CallbackState gCb; |
|
|
|
|
|
|
|
|
static int testExprCallback(Walker *pWalker, Expr *pExpr){ |
|
|
(void)pWalker; |
|
|
gCb.nExprCalls++; |
|
|
if( pExpr==gCb.pWhen ) gCb.hitWhen++; |
|
|
else if( pExpr==gCb.pWhere ) gCb.hitWhere++; |
|
|
else if( pExpr==gCb.pList1 ) gCb.hitList1++; |
|
|
else if( pExpr==gCb.pList2 ) gCb.hitList2++; |
|
|
else if( pExpr==gCb.pUpTarget1 ) gCb.hitUpTarget1++; |
|
|
else if( pExpr==gCb.pUpSet1 ) gCb.hitUpSet1++; |
|
|
else if( pExpr==gCb.pUpWhere ) gCb.hitUpWhere++; |
|
|
else if( pExpr==gCb.pUpTargetWhere ) gCb.hitUpTargetWhere++; |
|
|
else gCb.unexpectedExpr++; |
|
|
return WRC_Continue; |
|
|
} |
|
|
static int testSelectCallback(Walker *pWalker, Select *pSelect){ |
|
|
(void)pWalker; |
|
|
gCb.nSelectCalls++; |
|
|
if( pSelect==gCb.pSel1 ) gCb.hitSel1++; |
|
|
else if( pSelect==gCb.pSel2 ) gCb.hitSel2++; |
|
|
else gCb.unexpectedSelect++; |
|
|
return WRC_Continue; |
|
|
} |
|
|
|
|
|
|
|
|
static Expr *mkLeafExpr(void){ |
|
|
Expr *p = (Expr*)sqlite3_malloc(sizeof(Expr)); |
|
|
TEST_ASSERT_NOT_NULL_MESSAGE(p, "sqlite3_malloc Expr failed"); |
|
|
memset(p, 0, sizeof(Expr)); |
|
|
p->op = TK_NULL; |
|
|
return p; |
|
|
} |
|
|
static Select *mkEmptySelect(void){ |
|
|
Select *p = (Select*)sqlite3_malloc(sizeof(Select)); |
|
|
TEST_ASSERT_NOT_NULL_MESSAGE(p, "sqlite3_malloc Select failed"); |
|
|
memset(p, 0, sizeof(Select)); |
|
|
return p; |
|
|
} |
|
|
static ExprList *mkExprList1(Expr *e1){ |
|
|
ExprList *p = (ExprList*)sqlite3_malloc(sizeof(ExprList)); |
|
|
TEST_ASSERT_NOT_NULL_MESSAGE(p, "sqlite3_malloc ExprList failed"); |
|
|
memset(p, 0, sizeof(ExprList)); |
|
|
p->nExpr = 1; |
|
|
p->nAlloc = 1; |
|
|
p->a = (ExprList_item*)sqlite3_malloc(sizeof(ExprList_item) * 1); |
|
|
TEST_ASSERT_NOT_NULL_MESSAGE(p->a, "sqlite3_malloc ExprList_item[1] failed"); |
|
|
memset(p->a, 0, sizeof(ExprList_item) * 1); |
|
|
p->a[0].pExpr = e1; |
|
|
return p; |
|
|
} |
|
|
static ExprList *mkExprList2(Expr *e1, Expr *e2){ |
|
|
ExprList *p = (ExprList*)sqlite3_malloc(sizeof(ExprList)); |
|
|
TEST_ASSERT_NOT_NULL_MESSAGE(p, "sqlite3_malloc ExprList failed"); |
|
|
memset(p, 0, sizeof(ExprList)); |
|
|
p->nExpr = 2; |
|
|
p->nAlloc = 2; |
|
|
p->a = (ExprList_item*)sqlite3_malloc(sizeof(ExprList_item) * 2); |
|
|
TEST_ASSERT_NOT_NULL_MESSAGE(p->a, "sqlite3_malloc ExprList_item[2] failed"); |
|
|
memset(p->a, 0, sizeof(ExprList_item) * 2); |
|
|
p->a[0].pExpr = e1; |
|
|
p->a[1].pExpr = e2; |
|
|
return p; |
|
|
} |
|
|
static void freeExprList(ExprList *p){ |
|
|
if( p ){ |
|
|
sqlite3_free(p->a); |
|
|
sqlite3_free(p); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void setUp(void){ |
|
|
memset(&gCb, 0, sizeof(gCb)); |
|
|
} |
|
|
void tearDown(void){ |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
void test_renameWalkTrigger_nulls(void){ |
|
|
Trigger *tr = (Trigger*)sqlite3_malloc(sizeof(Trigger)); |
|
|
TEST_ASSERT_NOT_NULL(tr); |
|
|
memset(tr, 0, sizeof(Trigger)); |
|
|
|
|
|
Walker w; |
|
|
memset(&w, 0, sizeof(w)); |
|
|
w.xExprCallback = testExprCallback; |
|
|
w.xSelectCallback = testSelectCallback; |
|
|
|
|
|
test_renameWalkTrigger(&w, tr); |
|
|
|
|
|
TEST_ASSERT_EQUAL_INT(0, gCb.nExprCalls); |
|
|
TEST_ASSERT_EQUAL_INT(0, gCb.nSelectCalls); |
|
|
TEST_ASSERT_EQUAL_INT(0, gCb.unexpectedExpr); |
|
|
TEST_ASSERT_EQUAL_INT(0, gCb.unexpectedSelect); |
|
|
|
|
|
sqlite3_free(tr); |
|
|
} |
|
|
|
|
|
|
|
|
void test_renameWalkTrigger_basic_fields(void){ |
|
|
|
|
|
Expr *eWhen = mkLeafExpr(); |
|
|
Expr *eWhere = mkLeafExpr(); |
|
|
Expr *eList1 = mkLeafExpr(); |
|
|
Expr *eList2 = mkLeafExpr(); |
|
|
ExprList *pList = mkExprList2(eList1, eList2); |
|
|
Select *pSel = mkEmptySelect(); |
|
|
|
|
|
|
|
|
TriggerStep *st = (TriggerStep*)sqlite3_malloc(sizeof(TriggerStep)); |
|
|
TEST_ASSERT_NOT_NULL(st); |
|
|
memset(st, 0, sizeof(TriggerStep)); |
|
|
st->pSelect = pSel; |
|
|
st->pWhere = eWhere; |
|
|
st->pExprList = pList; |
|
|
|
|
|
|
|
|
Trigger *tr = (Trigger*)sqlite3_malloc(sizeof(Trigger)); |
|
|
TEST_ASSERT_NOT_NULL(tr); |
|
|
memset(tr, 0, sizeof(Trigger)); |
|
|
tr->pWhen = eWhen; |
|
|
tr->step_list = st; |
|
|
|
|
|
|
|
|
gCb.pWhen = eWhen; |
|
|
gCb.pWhere = eWhere; |
|
|
gCb.pList1 = eList1; |
|
|
gCb.pList2 = eList2; |
|
|
gCb.pSel1 = pSel; |
|
|
|
|
|
Walker w; |
|
|
memset(&w, 0, sizeof(w)); |
|
|
w.xExprCallback = testExprCallback; |
|
|
w.xSelectCallback = testSelectCallback; |
|
|
|
|
|
test_renameWalkTrigger(&w, tr); |
|
|
|
|
|
|
|
|
TEST_ASSERT_EQUAL_INT(4, gCb.nExprCalls); |
|
|
TEST_ASSERT_EQUAL_INT(1, gCb.nSelectCalls); |
|
|
|
|
|
TEST_ASSERT_EQUAL_INT(1, gCb.hitWhen); |
|
|
TEST_ASSERT_EQUAL_INT(1, gCb.hitWhere); |
|
|
TEST_ASSERT_EQUAL_INT(1, gCb.hitList1); |
|
|
TEST_ASSERT_EQUAL_INT(1, gCb.hitList2); |
|
|
TEST_ASSERT_EQUAL_INT(1, gCb.hitSel1); |
|
|
|
|
|
TEST_ASSERT_EQUAL_INT(0, gCb.unexpectedExpr); |
|
|
TEST_ASSERT_EQUAL_INT(0, gCb.unexpectedSelect); |
|
|
|
|
|
|
|
|
sqlite3_free(eWhen); |
|
|
sqlite3_free(eWhere); |
|
|
sqlite3_free(eList1); |
|
|
sqlite3_free(eList2); |
|
|
freeExprList(pList); |
|
|
sqlite3_free(pSel); |
|
|
sqlite3_free(st); |
|
|
sqlite3_free(tr); |
|
|
} |
|
|
|
|
|
|
|
|
void test_renameWalkTrigger_upsert_fields(void){ |
|
|
|
|
|
Expr *eUpTarget1 = mkLeafExpr(); |
|
|
Expr *eUpSet1 = mkLeafExpr(); |
|
|
Expr *eUpWhere = mkLeafExpr(); |
|
|
Expr *eUpTargetWhere = mkLeafExpr(); |
|
|
ExprList *pTarget = mkExprList1(eUpTarget1); |
|
|
ExprList *pSet = mkExprList1(eUpSet1); |
|
|
|
|
|
Upsert *pUp = (Upsert*)sqlite3_malloc(sizeof(Upsert)); |
|
|
TEST_ASSERT_NOT_NULL(pUp); |
|
|
memset(pUp, 0, sizeof(Upsert)); |
|
|
pUp->pUpsertTarget = pTarget; |
|
|
pUp->pUpsertSet = pSet; |
|
|
pUp->pUpsertWhere = eUpWhere; |
|
|
pUp->pUpsertTargetWhere = eUpTargetWhere; |
|
|
|
|
|
|
|
|
TriggerStep *st = (TriggerStep*)sqlite3_malloc(sizeof(TriggerStep)); |
|
|
TEST_ASSERT_NOT_NULL(st); |
|
|
memset(st, 0, sizeof(TriggerStep)); |
|
|
st->pUpsert = pUp; |
|
|
|
|
|
Trigger *tr = (Trigger*)sqlite3_malloc(sizeof(Trigger)); |
|
|
TEST_ASSERT_NOT_NULL(tr); |
|
|
memset(tr, 0, sizeof(Trigger)); |
|
|
tr->step_list = st; |
|
|
|
|
|
|
|
|
gCb.pUpTarget1 = eUpTarget1; |
|
|
gCb.pUpSet1 = eUpSet1; |
|
|
gCb.pUpWhere = eUpWhere; |
|
|
gCb.pUpTargetWhere = eUpTargetWhere; |
|
|
|
|
|
Walker w; |
|
|
memset(&w, 0, sizeof(w)); |
|
|
w.xExprCallback = testExprCallback; |
|
|
w.xSelectCallback = testSelectCallback; |
|
|
|
|
|
test_renameWalkTrigger(&w, tr); |
|
|
|
|
|
|
|
|
TEST_ASSERT_EQUAL_INT(4, gCb.nExprCalls); |
|
|
TEST_ASSERT_EQUAL_INT(0, gCb.nSelectCalls); |
|
|
|
|
|
TEST_ASSERT_EQUAL_INT(1, gCb.hitUpTarget1); |
|
|
TEST_ASSERT_EQUAL_INT(1, gCb.hitUpSet1); |
|
|
TEST_ASSERT_EQUAL_INT(1, gCb.hitUpWhere); |
|
|
TEST_ASSERT_EQUAL_INT(1, gCb.hitUpTargetWhere); |
|
|
|
|
|
TEST_ASSERT_EQUAL_INT(0, gCb.unexpectedExpr); |
|
|
TEST_ASSERT_EQUAL_INT(0, gCb.unexpectedSelect); |
|
|
|
|
|
|
|
|
sqlite3_free(eUpTarget1); |
|
|
sqlite3_free(eUpSet1); |
|
|
sqlite3_free(eUpWhere); |
|
|
sqlite3_free(eUpTargetWhere); |
|
|
freeExprList(pTarget); |
|
|
freeExprList(pSet); |
|
|
sqlite3_free(pUp); |
|
|
sqlite3_free(st); |
|
|
sqlite3_free(tr); |
|
|
} |
|
|
|
|
|
|
|
|
void test_renameWalkTrigger_multiple_steps(void){ |
|
|
Select *pSel = mkEmptySelect(); |
|
|
Expr *eWhere2 = mkLeafExpr(); |
|
|
|
|
|
TriggerStep *st1 = (TriggerStep*)sqlite3_malloc(sizeof(TriggerStep)); |
|
|
TEST_ASSERT_NOT_NULL(st1); |
|
|
memset(st1, 0, sizeof(TriggerStep)); |
|
|
st1->pSelect = pSel; |
|
|
|
|
|
TriggerStep *st2 = (TriggerStep*)sqlite3_malloc(sizeof(TriggerStep)); |
|
|
TEST_ASSERT_NOT_NULL(st2); |
|
|
memset(st2, 0, sizeof(TriggerStep)); |
|
|
st2->pWhere = eWhere2; |
|
|
|
|
|
st1->pNext = st2; |
|
|
|
|
|
Trigger *tr = (Trigger*)sqlite3_malloc(sizeof(Trigger)); |
|
|
TEST_ASSERT_NOT_NULL(tr); |
|
|
memset(tr, 0, sizeof(Trigger)); |
|
|
tr->step_list = st1; |
|
|
|
|
|
|
|
|
gCb.pSel1 = pSel; |
|
|
gCb.pWhere = eWhere2; |
|
|
|
|
|
Walker w; |
|
|
memset(&w, 0, sizeof(w)); |
|
|
w.xExprCallback = testExprCallback; |
|
|
w.xSelectCallback = testSelectCallback; |
|
|
|
|
|
test_renameWalkTrigger(&w, tr); |
|
|
|
|
|
TEST_ASSERT_EQUAL_INT(1, gCb.nSelectCalls); |
|
|
TEST_ASSERT_EQUAL_INT(1, gCb.nExprCalls); |
|
|
TEST_ASSERT_EQUAL_INT(1, gCb.hitSel1); |
|
|
TEST_ASSERT_EQUAL_INT(1, gCb.hitWhere); |
|
|
TEST_ASSERT_EQUAL_INT(0, gCb.unexpectedExpr); |
|
|
TEST_ASSERT_EQUAL_INT(0, gCb.unexpectedSelect); |
|
|
|
|
|
|
|
|
sqlite3_free(pSel); |
|
|
sqlite3_free(eWhere2); |
|
|
sqlite3_free(st1); |
|
|
sqlite3_free(st2); |
|
|
sqlite3_free(tr); |
|
|
} |
|
|
|
|
|
int main(void){ |
|
|
UNITY_BEGIN(); |
|
|
RUN_TEST(test_renameWalkTrigger_nulls); |
|
|
RUN_TEST(test_renameWalkTrigger_basic_fields); |
|
|
RUN_TEST(test_renameWalkTrigger_upsert_fields); |
|
|
RUN_TEST(test_renameWalkTrigger_multiple_steps); |
|
|
return UNITY_END(); |
|
|
} |