|
|
#include "sqliteInt.h" |
|
|
#include "unity.h" |
|
|
#include <stdlib.h> |
|
|
#include <string.h> |
|
|
|
|
|
|
|
|
extern int test_renameResolveTrigger(Parse *pParse); |
|
|
|
|
|
|
|
|
static void execSQL(sqlite3 *db, const char *sql){ |
|
|
int rc = sqlite3_exec(db, sql, 0, 0, 0); |
|
|
TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
} |
|
|
|
|
|
static void initParseAndTriggerWithTable(sqlite3 **pDb, Parse *pParse, Trigger **ppTrig, const char *zTable){ |
|
|
sqlite3 *db = 0; |
|
|
int rc = sqlite3_open(":memory:", &db); |
|
|
TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
|
|
|
char sql[256]; |
|
|
sqlite3_snprintf(sizeof(sql), sql, "CREATE TABLE %s(a, b);", zTable); |
|
|
execSQL(db, sql); |
|
|
|
|
|
memset(pParse, 0, sizeof(*pParse)); |
|
|
pParse->db = db; |
|
|
|
|
|
Trigger *pTrig = (Trigger*)sqlite3DbMallocZero(db, sizeof(Trigger)); |
|
|
TEST_ASSERT_NOT_NULL(pTrig); |
|
|
|
|
|
Table *pTab = sqlite3FindTable(db, zTable, "main"); |
|
|
TEST_ASSERT_NOT_NULL(pTab); |
|
|
pTrig->pTabSchema = pTab->pSchema; |
|
|
pTrig->table = sqlite3DbStrDup(db, zTable); |
|
|
TEST_ASSERT_NOT_NULL(pTrig->table); |
|
|
pTrig->op = TK_DELETE; |
|
|
pTrig->pWhen = 0; |
|
|
pTrig->step_list = 0; |
|
|
|
|
|
pParse->pNewTrigger = pTrig; |
|
|
|
|
|
*pDb = db; |
|
|
*ppTrig = pTrig; |
|
|
} |
|
|
|
|
|
static Token makeToken(const char *z){ |
|
|
Token t; |
|
|
t.z = z; |
|
|
t.n = (int)strlen(z); |
|
|
return t; |
|
|
} |
|
|
|
|
|
void setUp(void) { |
|
|
|
|
|
} |
|
|
void tearDown(void) { |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
void test_renameResolveTrigger_basic_ok(void){ |
|
|
sqlite3 *db = 0; |
|
|
Parse sParse; |
|
|
Trigger *pTrig = 0; |
|
|
|
|
|
initParseAndTriggerWithTable(&db, &sParse, &pTrig, "t1"); |
|
|
|
|
|
pTrig->op = TK_INSERT; |
|
|
|
|
|
int rc = test_renameResolveTrigger(&sParse); |
|
|
TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
TEST_ASSERT_NOT_NULL(sParse.pTriggerTab); |
|
|
TEST_ASSERT_EQUAL_INT(TK_INSERT, sParse.eTriggerOp); |
|
|
|
|
|
|
|
|
sqlite3DbFree(db, pTrig->table); |
|
|
sqlite3DbFree(db, pTrig); |
|
|
sqlite3_close(db); |
|
|
} |
|
|
|
|
|
|
|
|
void test_renameResolveTrigger_when_constant_ok(void){ |
|
|
sqlite3 *db = 0; |
|
|
Parse sParse; |
|
|
Trigger *pTrig = 0; |
|
|
|
|
|
initParseAndTriggerWithTable(&db, &sParse, &pTrig, "t1"); |
|
|
|
|
|
|
|
|
Token t1 = makeToken("1"); |
|
|
pTrig->pWhen = sqlite3ExprAlloc(db, TK_INTEGER, &t1, 0); |
|
|
TEST_ASSERT_NOT_NULL(pTrig->pWhen); |
|
|
|
|
|
int rc = test_renameResolveTrigger(&sParse); |
|
|
TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
|
|
|
|
|
|
sqlite3ExprDelete(db, pTrig->pWhen); |
|
|
sqlite3DbFree(db, pTrig->table); |
|
|
sqlite3DbFree(db, pTrig); |
|
|
sqlite3_close(db); |
|
|
} |
|
|
|
|
|
|
|
|
void test_renameResolveTrigger_when_bad_column_error(void){ |
|
|
sqlite3 *db = 0; |
|
|
Parse sParse; |
|
|
Trigger *pTrig = 0; |
|
|
|
|
|
initParseAndTriggerWithTable(&db, &sParse, &pTrig, "t1"); |
|
|
|
|
|
|
|
|
Token tBad = makeToken("nosuchcol"); |
|
|
pTrig->pWhen = sqlite3ExprAlloc(db, TK_ID, &tBad, 0); |
|
|
TEST_ASSERT_NOT_NULL(pTrig->pWhen); |
|
|
|
|
|
int rc = test_renameResolveTrigger(&sParse); |
|
|
TEST_ASSERT_NOT_EQUAL_INT(SQLITE_OK, rc); |
|
|
|
|
|
|
|
|
sqlite3ExprDelete(db, pTrig->pWhen); |
|
|
sqlite3DbFree(db, pTrig->table); |
|
|
sqlite3DbFree(db, pTrig); |
|
|
sqlite3_close(db); |
|
|
} |
|
|
|
|
|
|
|
|
void test_renameResolveTrigger_step_with_select_ok(void){ |
|
|
sqlite3 *db = 0; |
|
|
Parse sParse; |
|
|
Trigger *pTrig = 0; |
|
|
|
|
|
initParseAndTriggerWithTable(&db, &sParse, &pTrig, "t1"); |
|
|
|
|
|
TriggerStep *pStep = (TriggerStep*)sqlite3DbMallocZero(db, sizeof(TriggerStep)); |
|
|
TEST_ASSERT_NOT_NULL(pStep); |
|
|
|
|
|
pStep->pSelect = sqlite3SelectNew(&sParse, 0, 0, 0, 0, 0, 0, 0, 0); |
|
|
TEST_ASSERT_NOT_NULL(pStep->pSelect); |
|
|
|
|
|
pTrig->step_list = pStep; |
|
|
|
|
|
int rc = test_renameResolveTrigger(&sParse); |
|
|
TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
|
|
|
|
|
|
sqlite3SelectDelete(db, pStep->pSelect); |
|
|
sqlite3DbFree(db, pStep); |
|
|
sqlite3DbFree(db, pTrig->table); |
|
|
sqlite3DbFree(db, pTrig); |
|
|
sqlite3_close(db); |
|
|
} |
|
|
|
|
|
|
|
|
void test_renameResolveTrigger_step_with_src_and_where_ok(void){ |
|
|
sqlite3 *db = 0; |
|
|
Parse sParse; |
|
|
Trigger *pTrig = 0; |
|
|
|
|
|
initParseAndTriggerWithTable(&db, &sParse, &pTrig, "t1"); |
|
|
|
|
|
TriggerStep *pStep = (TriggerStep*)sqlite3DbMallocZero(db, sizeof(TriggerStep)); |
|
|
TEST_ASSERT_NOT_NULL(pStep); |
|
|
|
|
|
|
|
|
SrcList *pSrc = (SrcList*)sqlite3DbMallocZero(db, sizeof(SrcList)); |
|
|
TEST_ASSERT_NOT_NULL(pSrc); |
|
|
pSrc->nSrc = 1; |
|
|
pSrc->a[0].zName = sqlite3DbStrDup(db, "t1"); |
|
|
TEST_ASSERT_NOT_NULL(pSrc->a[0].zName); |
|
|
pSrc->a[0].zDatabase = sqlite3DbStrDup(db, "main"); |
|
|
TEST_ASSERT_NOT_NULL(pSrc->a[0].zDatabase); |
|
|
|
|
|
pStep->pSrc = pSrc; |
|
|
|
|
|
|
|
|
Token tA = makeToken("a"); |
|
|
pStep->pWhere = sqlite3ExprAlloc(db, TK_ID, &tA, 0); |
|
|
TEST_ASSERT_NOT_NULL(pStep->pWhere); |
|
|
|
|
|
pTrig->step_list = pStep; |
|
|
|
|
|
int rc = test_renameResolveTrigger(&sParse); |
|
|
TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
|
|
|
|
|
|
sqlite3ExprDelete(db, pStep->pWhere); |
|
|
sqlite3SrcListDelete(db, pStep->pSrc); |
|
|
sqlite3DbFree(db, pStep); |
|
|
sqlite3DbFree(db, pTrig->table); |
|
|
sqlite3DbFree(db, pTrig); |
|
|
sqlite3_close(db); |
|
|
} |
|
|
|
|
|
int main(void){ |
|
|
UNITY_BEGIN(); |
|
|
RUN_TEST(test_renameResolveTrigger_basic_ok); |
|
|
RUN_TEST(test_renameResolveTrigger_when_constant_ok); |
|
|
RUN_TEST(test_renameResolveTrigger_when_bad_column_error); |
|
|
RUN_TEST(test_renameResolveTrigger_step_with_select_ok); |
|
|
RUN_TEST(test_renameResolveTrigger_step_with_src_and_where_ok); |
|
|
return UNITY_END(); |
|
|
} |