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