| #include "sqliteInt.h" |
| #include "unity.h" |
| #include <string.h> |
| #include <stdlib.h> |
|
|
| |
| extern void test_renameColumnParseError( |
| sqlite3_context *pCtx, |
| const char *zWhen, |
| sqlite3_value *pType, |
| sqlite3_value *pObject, |
| Parse *pParse |
| ); |
|
|
| static void init_text_value(sqlite3 *db, Mem *pMem, const char *z){ |
| memset(pMem, 0, sizeof(*pMem)); |
| |
| sqlite3VdbeMemInit(pMem, db, 0); |
| |
| sqlite3VdbeMemSetStr(pMem, z, -1, SQLITE_UTF8, SQLITE_STATIC); |
| } |
|
|
| void setUp(void) { |
| |
| } |
|
|
| void tearDown(void) { |
| |
| } |
|
|
| static void common_check_and_cleanup( |
| sqlite3 *db, Mem *pType, Mem *pObj, Mem *pOut, |
| const char *expected |
| ){ |
| const unsigned char *zResU8 = sqlite3_value_text((sqlite3_value*)pOut); |
| TEST_ASSERT_NOT_NULL(zResU8); |
| TEST_ASSERT_EQUAL_STRING(expected, (const char*)zResU8); |
|
|
| |
| sqlite3VdbeMemRelease(pType); |
| sqlite3VdbeMemRelease(pObj); |
| sqlite3VdbeMemRelease(pOut); |
|
|
| |
| sqlite3_close(db); |
| } |
|
|
| void test_renameColumnParseError_basic_no_when(void) { |
| sqlite3 *db = NULL; |
| int rc = sqlite3_open(":memory:", &db); |
| TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
| |
| Mem typeMem, objMem, outMem; |
| init_text_value(db, &typeMem, "table"); |
| init_text_value(db, &objMem, "t1"); |
| sqlite3VdbeMemInit(&outMem, db, 0); |
|
|
| sqlite3_context ctx; |
| memset(&ctx, 0, sizeof(ctx)); |
| ctx.db = db; |
| ctx.pOut = &outMem; |
|
|
| Parse parse; |
| memset(&parse, 0, sizeof(parse)); |
| parse.db = db; |
| parse.zErrMsg = (char*)"no such column x"; |
|
|
| |
| test_renameColumnParseError(&ctx, "", (sqlite3_value*)&typeMem, (sqlite3_value*)&objMem, &parse); |
|
|
| |
| TEST_ASSERT_EQUAL_INT(SQLITE_ERROR, ctx.isError); |
| const char *expected = "error in table t1: no such column x"; |
| common_check_and_cleanup(db, &typeMem, &objMem, &outMem, expected); |
| } |
|
|
| void test_renameColumnParseError_with_when(void) { |
| sqlite3 *db = NULL; |
| int rc = sqlite3_open(":memory:", &db); |
| TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
| Mem typeMem, objMem, outMem; |
| init_text_value(db, &typeMem, "trigger"); |
| init_text_value(db, &objMem, "tr1"); |
| sqlite3VdbeMemInit(&outMem, db, 0); |
|
|
| sqlite3_context ctx; |
| memset(&ctx, 0, sizeof(ctx)); |
| ctx.db = db; |
| ctx.pOut = &outMem; |
|
|
| Parse parse; |
| memset(&parse, 0, sizeof(parse)); |
| parse.db = db; |
| parse.zErrMsg = (char*)"parse error"; |
|
|
| const char *zWhen = "after rename"; |
|
|
| test_renameColumnParseError(&ctx, zWhen, (sqlite3_value*)&typeMem, (sqlite3_value*)&objMem, &parse); |
|
|
| TEST_ASSERT_EQUAL_INT(SQLITE_ERROR, ctx.isError); |
| const char *expected = "error in trigger tr1 after rename: parse error"; |
| common_check_and_cleanup(db, &typeMem, &objMem, &outMem, expected); |
| } |
|
|
| void test_renameColumnParseError_special_chars_and_spaces(void) { |
| sqlite3 *db = NULL; |
| int rc = sqlite3_open(":memory:", &db); |
| TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
| Mem typeMem, objMem, outMem; |
| init_text_value(db, &typeMem, "view"); |
| init_text_value(db, &objMem, "my view"); |
| sqlite3VdbeMemInit(&outMem, db, 0); |
|
|
| sqlite3_context ctx; |
| memset(&ctx, 0, sizeof(ctx)); |
| ctx.db = db; |
| ctx.pOut = &outMem; |
|
|
| Parse parse; |
| memset(&parse, 0, sizeof(parse)); |
| parse.db = db; |
| |
| parse.zErrMsg = (char*)"bad token % at position: 3 in \"SELECT\""; |
|
|
| const char *zWhen = "on line 1"; |
|
|
| test_renameColumnParseError(&ctx, zWhen, (sqlite3_value*)&typeMem, (sqlite3_value*)&objMem, &parse); |
|
|
| TEST_ASSERT_EQUAL_INT(SQLITE_ERROR, ctx.isError); |
| const char *expected = "error in view my view on line 1: bad token % at position: 3 in \"SELECT\""; |
| common_check_and_cleanup(db, &typeMem, &objMem, &outMem, expected); |
| } |
|
|
| int main(void) { |
| UNITY_BEGIN(); |
| RUN_TEST(test_renameColumnParseError_basic_no_when); |
| RUN_TEST(test_renameColumnParseError_with_when); |
| RUN_TEST(test_renameColumnParseError_special_chars_and_spaces); |
| return UNITY_END(); |
| } |