| | #include "sqliteInt.h" |
| | #include "unity.h" |
| | #include <string.h> |
| | #include <stdlib.h> |
| |
|
| | |
| | extern void test_renameTableTest(sqlite3_context*, int, sqlite3_value**); |
| |
|
| | static sqlite3 *gDb = NULL; |
| |
|
| | |
| | static void unit_rename_table_test(sqlite3_context *ctx, int argc, sqlite3_value **argv){ |
| | |
| | test_renameTableTest(ctx, argc, argv); |
| | } |
| |
|
| | static void exec_ok(const char *sql){ |
| | char *errmsg = NULL; |
| | int rc = sqlite3_exec(gDb, sql, 0, 0, &errmsg); |
| | if( rc!=SQLITE_OK ){ |
| | const char *msg = errmsg ? errmsg : "exec failed"; |
| | TEST_FAIL_MESSAGE(msg); |
| | } |
| | sqlite3_free(errmsg); |
| | } |
| |
|
| | |
| | |
| | static int call_unit_fn( |
| | const char *zDb, |
| | const char *zInput, |
| | const char *zType, |
| | const char *zName, |
| | int isTemp, |
| | const char *zWhen, |
| | int bNoDQS, |
| | sqlite3_stmt **ppStmt, |
| | int *pColType |
| | ){ |
| | char *sql = sqlite3_mprintf( |
| | "SELECT unit_rename_table_test(%Q,%Q,%Q,%Q,%d,%Q,%d)", |
| | zDb, zInput, zType, zName, isTemp, zWhen, bNoDQS |
| | ); |
| | TEST_ASSERT_NOT_NULL(sql); |
| |
|
| | sqlite3_stmt *stmt = NULL; |
| | int rc = sqlite3_prepare_v2(gDb, sql, -1, &stmt, 0); |
| | sqlite3_free(sql); |
| | TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
| |
|
| | rc = sqlite3_step(stmt); |
| | if( rc==SQLITE_ROW ){ |
| | if( pColType ) *pColType = sqlite3_column_type(stmt, 0); |
| | } |
| | if( ppStmt ) *ppStmt = stmt; else sqlite3_finalize(stmt); |
| | return rc; |
| | } |
| |
|
| | void setUp(void) { |
| | int rc = sqlite3_open(":memory:", &gDb); |
| | TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
| | |
| | rc = sqlite3_create_function(gDb, "unit_rename_table_test", 7, SQLITE_UTF8, |
| | NULL, unit_rename_table_test, NULL, NULL); |
| | TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
| | } |
| |
|
| | void tearDown(void) { |
| | if( gDb ){ |
| | sqlite3_close(gDb); |
| | gDb = NULL; |
| | } |
| | } |
| |
|
| | |
| | void test_renameTableTest_create_table_returns_null(void){ |
| | int colType = -1; |
| | sqlite3_stmt *stmt = NULL; |
| | int rc = call_unit_fn("main", "CREATE TABLE t1(a)", "table", "t1", 0, "when", 0, &stmt, &colType); |
| | TEST_ASSERT_EQUAL_INT(SQLITE_ROW, rc); |
| | TEST_ASSERT_EQUAL_INT(SQLITE_NULL, colType); |
| | sqlite3_finalize(stmt); |
| | } |
| |
|
| | |
| | void test_renameTableTest_invalid_sql_raises_error_without_writable_schema(void){ |
| | |
| | sqlite3_stmt *stmt = NULL; |
| | int rc = call_unit_fn("main", "CREATE TABLE t1(a", "table", "t1", 0, "when", 0, &stmt, NULL); |
| | TEST_ASSERT_EQUAL_INT(SQLITE_ERROR, rc); |
| | sqlite3_finalize(stmt); |
| | const char *errmsg = sqlite3_errmsg(gDb); |
| | TEST_ASSERT_NOT_NULL(errmsg); |
| | TEST_ASSERT_NOT_NULL(strstr(errmsg, "error in table t1 when:")); |
| | } |
| |
|
| | |
| | void test_renameTableTest_invalid_sql_returns_null_with_writable_schema(void){ |
| | exec_ok("PRAGMA writable_schema=ON"); |
| | int colType = -1; |
| | sqlite3_stmt *stmt = NULL; |
| | int rc = call_unit_fn("main", "CREATE TABLE t1(a", "table", "t1", 0, "when", 0, &stmt, &colType); |
| | TEST_ASSERT_EQUAL_INT(SQLITE_ROW, rc); |
| | TEST_ASSERT_EQUAL_INT(SQLITE_NULL, colType); |
| | sqlite3_finalize(stmt); |
| | exec_ok("PRAGMA writable_schema=OFF"); |
| | } |
| |
|
| | |
| | void test_renameTableTest_trigger_on_main_returns_1_in_main_db(void){ |
| | exec_ok("CREATE TABLE t1(x)"); |
| | const char *trigSql = "CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN SELECT 1; END"; |
| | int colType = -1; |
| | sqlite3_stmt *stmt = NULL; |
| | int rc = call_unit_fn("main", trigSql, "trigger", "tr1", 0, "when", 0, &stmt, &colType); |
| | TEST_ASSERT_EQUAL_INT(SQLITE_ROW, rc); |
| | TEST_ASSERT_EQUAL_INT(SQLITE_INTEGER, colType); |
| | TEST_ASSERT_EQUAL_INT(1, sqlite3_column_int(stmt, 0)); |
| | sqlite3_finalize(stmt); |
| | } |
| |
|
| | |
| | void test_renameTableTest_trigger_on_main_returns_null_in_temp_db(void){ |
| | exec_ok("CREATE TABLE t1(x)"); |
| | const char *trigSql = "CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN SELECT 1; END"; |
| | int colType = -1; |
| | sqlite3_stmt *stmt = NULL; |
| | int rc = call_unit_fn("temp", trigSql, "trigger", "tr1", 1, "when", 0, &stmt, &colType); |
| | TEST_ASSERT_EQUAL_INT(SQLITE_ROW, rc); |
| | TEST_ASSERT_EQUAL_INT(SQLITE_NULL, colType); |
| | sqlite3_finalize(stmt); |
| | } |
| |
|
| | |
| | void test_renameTableTest_trigger_on_temp_returns_1_in_temp_db(void){ |
| | exec_ok("CREATE TEMP TABLE t2(y)"); |
| | const char *trigSql = "CREATE TRIGGER tr2 AFTER INSERT ON t2 BEGIN SELECT 1; END"; |
| | int colType = -1; |
| | sqlite3_stmt *stmt = NULL; |
| | int rc = call_unit_fn("temp", trigSql, "trigger", "tr2", 1, "when", 0, &stmt, &colType); |
| | TEST_ASSERT_EQUAL_INT(SQLITE_ROW, rc); |
| | TEST_ASSERT_EQUAL_INT(SQLITE_INTEGER, colType); |
| | TEST_ASSERT_EQUAL_INT(1, sqlite3_column_int(stmt, 0)); |
| | sqlite3_finalize(stmt); |
| | } |
| |
|
| | |
| | void test_renameTableTest_view_dqs_enabled_returns_null(void){ |
| | const char *viewSql = "CREATE VIEW v1 AS SELECT \"string\""; |
| | int colType = -1; |
| | sqlite3_stmt *stmt = NULL; |
| | int rc = call_unit_fn("main", viewSql, "view", "v1", 0, "when", 0, &stmt, &colType); |
| | TEST_ASSERT_EQUAL_INT(SQLITE_ROW, rc); |
| | TEST_ASSERT_EQUAL_INT(SQLITE_NULL, colType); |
| | sqlite3_finalize(stmt); |
| | } |
| |
|
| | |
| | void test_renameTableTest_view_dqs_disabled_raises_error(void){ |
| | const char *viewSql = "CREATE VIEW v1 AS SELECT \"string\""; |
| | sqlite3_stmt *stmt = NULL; |
| | int rc = call_unit_fn("main", viewSql, "view", "v1", 0, "when", 1, &stmt, NULL); |
| | TEST_ASSERT_EQUAL_INT(SQLITE_ERROR, rc); |
| | sqlite3_finalize(stmt); |
| | const char *errmsg = sqlite3_errmsg(gDb); |
| | TEST_ASSERT_NOT_NULL(errmsg); |
| | TEST_ASSERT_NOT_NULL(strstr(errmsg, "error in view v1 when:")); |
| | } |
| |
|
| | int main(void){ |
| | UNITY_BEGIN(); |
| | RUN_TEST(test_renameTableTest_create_table_returns_null); |
| | RUN_TEST(test_renameTableTest_invalid_sql_raises_error_without_writable_schema); |
| | RUN_TEST(test_renameTableTest_invalid_sql_returns_null_with_writable_schema); |
| | RUN_TEST(test_renameTableTest_trigger_on_main_returns_1_in_main_db); |
| | RUN_TEST(test_renameTableTest_trigger_on_main_returns_null_in_temp_db); |
| | RUN_TEST(test_renameTableTest_trigger_on_temp_returns_1_in_temp_db); |
| | RUN_TEST(test_renameTableTest_view_dqs_enabled_returns_null); |
| | RUN_TEST(test_renameTableTest_view_dqs_disabled_raises_error); |
| | return UNITY_END(); |
| | } |