|
|
#include "sqliteInt.h" |
|
|
#include "unity.h" |
|
|
#include <string.h> |
|
|
#include <stdlib.h> |
|
|
|
|
|
|
|
|
static sqlite3 *gDb = NULL; |
|
|
static Parse gParse; |
|
|
|
|
|
|
|
|
static RenameToken* addRenameToken(void *p){ |
|
|
RenameToken *r = (RenameToken*)sqlite3_malloc(sizeof(RenameToken)); |
|
|
TEST_ASSERT_NOT_NULL(r); |
|
|
memset(r, 0, sizeof(*r)); |
|
|
r->p = p; |
|
|
r->pNext = gParse.pRename; |
|
|
gParse.pRename = r; |
|
|
return r; |
|
|
} |
|
|
|
|
|
|
|
|
static void freeAllRenameTokens(void){ |
|
|
RenameToken *p = gParse.pRename; |
|
|
while( p ){ |
|
|
RenameToken *pNext = p->pNext; |
|
|
sqlite3_free(p); |
|
|
p = pNext; |
|
|
} |
|
|
gParse.pRename = NULL; |
|
|
} |
|
|
|
|
|
void setUp(void) { |
|
|
int rc = sqlite3_open(":memory:", &gDb); |
|
|
TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
memset(&gParse, 0, sizeof(gParse)); |
|
|
gParse.db = gDb; |
|
|
gParse.pRename = NULL; |
|
|
} |
|
|
|
|
|
void tearDown(void) { |
|
|
freeAllRenameTokens(); |
|
|
if( gDb ){ |
|
|
int rc = sqlite3_close(gDb); |
|
|
TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
gDb = NULL; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
static ExprList* makeExprListWithAlias(Parse *pParse, int val, const char *alias){ |
|
|
char buf[32]; |
|
|
sqlite3_snprintf(sizeof(buf), buf, "%d", val); |
|
|
Expr *pExpr = sqlite3Expr(pParse->db, TK_INTEGER, buf); |
|
|
TEST_ASSERT_NOT_NULL(pExpr); |
|
|
ExprList *pList = sqlite3ExprListAppend(pParse, NULL, pExpr); |
|
|
TEST_ASSERT_NOT_NULL(pList); |
|
|
Token t; |
|
|
t.z = (char*)alias; |
|
|
t.n = (int)strlen(alias); |
|
|
sqlite3ExprListSetName(pParse, pList, &t, 1); |
|
|
return pList; |
|
|
} |
|
|
|
|
|
|
|
|
static void appendExprWithAlias(Parse *pParse, ExprList **ppList, int val, const char *alias){ |
|
|
char buf[32]; |
|
|
sqlite3_snprintf(sizeof(buf), buf, "%d", val); |
|
|
Expr *pExpr = sqlite3Expr(pParse->db, TK_INTEGER, buf); |
|
|
TEST_ASSERT_NOT_NULL(pExpr); |
|
|
*ppList = sqlite3ExprListAppend(pParse, *ppList, pExpr); |
|
|
TEST_ASSERT_NOT_NULL(*ppList); |
|
|
Token t; |
|
|
t.z = (char*)alias; |
|
|
t.n = (int)strlen(alias); |
|
|
sqlite3ExprListSetName(pParse, *ppList, &t, 1); |
|
|
} |
|
|
|
|
|
|
|
|
void test_sqlite3RenameExprlistUnmap_null_list_noop(void){ |
|
|
int dummy1 = 0x11; |
|
|
int dummy2 = 0x22; |
|
|
RenameToken *rt1 = addRenameToken(&dummy1); |
|
|
RenameToken *rt2 = addRenameToken(&dummy2); |
|
|
|
|
|
sqlite3RenameExprlistUnmap(&gParse, NULL); |
|
|
|
|
|
TEST_ASSERT_EQUAL_PTR(&dummy1, rt1->p); |
|
|
TEST_ASSERT_EQUAL_PTR(&dummy2, rt2->p); |
|
|
} |
|
|
|
|
|
|
|
|
void test_sqlite3RenameExprlistUnmap_unmaps_expr_nodes_and_aliases(void){ |
|
|
|
|
|
ExprList *pList = makeExprListWithAlias(&gParse, 1, "a"); |
|
|
appendExprWithAlias(&gParse, &pList, 2, "b"); |
|
|
|
|
|
|
|
|
TEST_ASSERT_TRUE(pList->nExpr >= 2); |
|
|
char *zName0 = pList->a[0].zEName; |
|
|
char *zName1 = pList->a[1].zEName; |
|
|
TEST_ASSERT_NOT_NULL(zName0); |
|
|
TEST_ASSERT_NOT_NULL(zName1); |
|
|
Expr *pExpr0 = pList->a[0].pExpr; |
|
|
TEST_ASSERT_NOT_NULL(pExpr0); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int unrelatedDummy = 0xABCD; |
|
|
RenameToken *rtExpr = addRenameToken((void*)pExpr0); |
|
|
RenameToken *rtName0 = addRenameToken((void*)zName0); |
|
|
RenameToken *rtName1 = addRenameToken((void*)zName1); |
|
|
RenameToken *rtUnrelated = addRenameToken(&unrelatedDummy); |
|
|
|
|
|
|
|
|
sqlite3RenameExprlistUnmap(&gParse, pList); |
|
|
|
|
|
|
|
|
TEST_ASSERT_NULL(rtExpr->p); |
|
|
TEST_ASSERT_NULL(rtName0->p); |
|
|
TEST_ASSERT_NULL(rtName1->p); |
|
|
TEST_ASSERT_EQUAL_PTR(&unrelatedDummy, rtUnrelated->p); |
|
|
|
|
|
sqlite3ExprListDelete(gDb, pList); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void test_sqlite3RenameExprlistUnmap_no_matching_tokens(void){ |
|
|
ExprList *pList = makeExprListWithAlias(&gParse, 3, "c"); |
|
|
|
|
|
int other = 123; |
|
|
RenameToken *rtOther = addRenameToken(&other); |
|
|
|
|
|
|
|
|
TEST_ASSERT_NOT_NULL(pList->a[0].pExpr); |
|
|
TEST_ASSERT_NOT_NULL(pList->a[0].zEName); |
|
|
TEST_ASSERT_NOT_EQUAL_PTR(pList->a[0].pExpr, rtOther->p); |
|
|
TEST_ASSERT_NOT_EQUAL_PTR(pList->a[0].zEName, rtOther->p); |
|
|
|
|
|
sqlite3RenameExprlistUnmap(&gParse, pList); |
|
|
|
|
|
|
|
|
TEST_ASSERT_EQUAL_PTR(&other, rtOther->p); |
|
|
|
|
|
sqlite3ExprListDelete(gDb, pList); |
|
|
} |
|
|
|
|
|
int main(void) { |
|
|
UNITY_BEGIN(); |
|
|
RUN_TEST(test_sqlite3RenameExprlistUnmap_null_list_noop); |
|
|
RUN_TEST(test_sqlite3RenameExprlistUnmap_unmaps_expr_nodes_and_aliases); |
|
|
RUN_TEST(test_sqlite3RenameExprlistUnmap_no_matching_tokens); |
|
|
return UNITY_END(); |
|
|
} |