| | #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(); |
| | } |