| #include "sqliteInt.h" |
| #include "unity.h" |
| #include <stdlib.h> |
| #include <string.h> |
|
|
| |
| extern int test_renameParseSql( |
| Parse *p, |
| const char *zDb, |
| sqlite3 *db, |
| const char *zSql, |
| int bTemp |
| ); |
|
|
| |
| extern void sqlite3DeleteTable(sqlite3*, Table*); |
|
|
| void setUp(void) { |
| |
| } |
|
|
| void tearDown(void) { |
| |
| } |
|
|
| static void freeParseOutputs(sqlite3 *db, Parse *p){ |
| if( p->pNewTable ){ |
| sqlite3DeleteTable(db, p->pNewTable); |
| p->pNewTable = 0; |
| } |
| |
| } |
|
|
| |
| void test_renameParseSql_null_sql_returns_nomem_and_preserves_init_idb_and_flags(void) { |
| sqlite3 *db = 0; |
| int rc = sqlite3_open(":memory:", &db); |
| TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
| TEST_ASSERT_NOT_NULL(db); |
|
|
| Parse p; memset(&p, 0, sizeof(p)); |
|
|
| |
| db->init.iDb = 77; |
| u64 origFlags = db->flags = 0; |
|
|
| rc = test_renameParseSql(&p, "main", db, NULL, 0); |
| TEST_ASSERT_EQUAL_INT(SQLITE_NOMEM, rc); |
| TEST_ASSERT_EQUAL_UINT8(77, db->init.iDb); |
| TEST_ASSERT_EQUAL_UINT64(origFlags, db->flags); |
|
|
| sqlite3_close(db); |
| } |
|
|
| |
| void test_renameParseSql_non_create_returns_corrupt(void) { |
| sqlite3 *db = 0; |
| int rc = sqlite3_open(":memory:", &db); |
| TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
| TEST_ASSERT_NOT_NULL(db); |
|
|
| Parse p; memset(&p, 0, sizeof(p)); |
|
|
| const char *zSql = "DROP TABLE t1"; |
| rc = test_renameParseSql(&p, "main", db, zSql, 0); |
| TEST_ASSERT_EQUAL_INT(SQLITE_CORRUPT, rc); |
|
|
| sqlite3_close(db); |
| } |
|
|
| |
| void test_renameParseSql_create_table_main_schema_ok_and_fields(void) { |
| sqlite3 *db = 0; |
| int rc = sqlite3_open(":memory:", &db); |
| TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
| TEST_ASSERT_NOT_NULL(db); |
|
|
| Parse p; memset(&p, 0, sizeof(p)); |
|
|
| u64 origFlags = db->flags = 0; |
| const char *zSql = "CREATE TABLE t1(x INTEGER)"; |
|
|
| rc = test_renameParseSql(&p, "main", db, zSql, 0); |
| TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
| |
| TEST_ASSERT_EQUAL_INT(PARSE_MODE_RENAME, p.eParseMode); |
| TEST_ASSERT_EQUAL_INT(1, p.nQueryLoop); |
|
|
| |
| TEST_ASSERT_NOT_NULL(p.pNewTable); |
| TEST_ASSERT_NULL(p.pNewIndex); |
| TEST_ASSERT_NULL(p.pNewTrigger); |
|
|
| |
| TEST_ASSERT_EQUAL_PTR(db->aDb[0].pSchema, p.pNewTable->pSchema); |
|
|
| |
| TEST_ASSERT_EQUAL_UINT64(origFlags, db->flags); |
| TEST_ASSERT_EQUAL_UINT8(0, db->init.iDb); |
|
|
| freeParseOutputs(db, &p); |
| sqlite3_close(db); |
| } |
|
|
| |
| void test_renameParseSql_create_table_temp_schema_bTemp_true(void) { |
| sqlite3 *db = 0; |
| int rc = sqlite3_open(":memory:", &db); |
| TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
| TEST_ASSERT_NOT_NULL(db); |
|
|
| Parse p; memset(&p, 0, sizeof(p)); |
|
|
| u64 origFlags = db->flags = 0; |
| const char *zSql = "CREATE TABLE ttemp(y TEXT) /* a comment to toggle comments flag */"; |
|
|
| rc = test_renameParseSql(&p, "main", db, zSql, 1); |
| TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
| TEST_ASSERT_NOT_NULL(p.pNewTable); |
| TEST_ASSERT_NULL(p.pNewIndex); |
| TEST_ASSERT_NULL(p.pNewTrigger); |
|
|
| |
| TEST_ASSERT_EQUAL_PTR(db->aDb[1].pSchema, p.pNewTable->pSchema); |
|
|
| |
| TEST_ASSERT_EQUAL_UINT64(origFlags, db->flags); |
| TEST_ASSERT_EQUAL_UINT8(0, db->init.iDb); |
|
|
| freeParseOutputs(db, &p); |
| sqlite3_close(db); |
| } |
|
|
| |
| void test_renameParseSql_create_table_temp_schema_by_name(void) { |
| sqlite3 *db = 0; |
| int rc = sqlite3_open(":memory:", &db); |
| TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
| TEST_ASSERT_NOT_NULL(db); |
|
|
| Parse p; memset(&p, 0, sizeof(p)); |
|
|
| u64 origFlags = db->flags = 0; |
| const char *zSql = "CREATE TABLE ttemp2(z BLOB)"; |
|
|
| rc = test_renameParseSql(&p, "temp", db, zSql, 0); |
| TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
| TEST_ASSERT_NOT_NULL(p.pNewTable); |
| TEST_ASSERT_EQUAL_PTR(db->aDb[1].pSchema, p.pNewTable->pSchema); |
|
|
| TEST_ASSERT_EQUAL_UINT64(origFlags, db->flags); |
| TEST_ASSERT_EQUAL_UINT8(0, db->init.iDb); |
|
|
| freeParseOutputs(db, &p); |
| sqlite3_close(db); |
| } |
|
|
| |
| void test_renameParseSql_flags_restored_when_comments_flag_pre_set(void) { |
| sqlite3 *db = 0; |
| int rc = sqlite3_open(":memory:", &db); |
| TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
| TEST_ASSERT_NOT_NULL(db); |
|
|
| Parse p; memset(&p, 0, sizeof(p)); |
|
|
| db->flags = SQLITE_Comments; |
| u64 origFlags = db->flags; |
| const char *zSql = "CREATE TABLE c(a INTEGER) /* comment present */"; |
|
|
| rc = test_renameParseSql(&p, "main", db, zSql, 0); |
| TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
| TEST_ASSERT_NOT_NULL(p.pNewTable); |
| TEST_ASSERT_EQUAL_UINT64(origFlags, db->flags); |
| TEST_ASSERT_EQUAL_UINT8(0, db->init.iDb); |
|
|
| freeParseOutputs(db, &p); |
| sqlite3_close(db); |
| } |
|
|
| int main(void) { |
| UNITY_BEGIN(); |
| RUN_TEST(test_renameParseSql_null_sql_returns_nomem_and_preserves_init_idb_and_flags); |
| RUN_TEST(test_renameParseSql_non_create_returns_corrupt); |
| RUN_TEST(test_renameParseSql_create_table_main_schema_ok_and_fields); |
| RUN_TEST(test_renameParseSql_create_table_temp_schema_bTemp_true); |
| RUN_TEST(test_renameParseSql_create_table_temp_schema_by_name); |
| RUN_TEST(test_renameParseSql_flags_restored_when_comments_flag_pre_set); |
| return UNITY_END(); |
| } |