|
|
#include "sqliteInt.h" |
|
|
#include "unity.h" |
|
|
#include <string.h> |
|
|
#include <stdlib.h> |
|
|
|
|
|
|
|
|
extern int test_alterFindCol(Parse *pParse, Table *pTab, Token *pCol, int *piCol); |
|
|
|
|
|
|
|
|
static int denyAuthorizer(void *p, int code, |
|
|
const char *z1, const char *z2, |
|
|
const char *z3, const char *z4){ |
|
|
(void)p; (void)code; (void)z1; (void)z2; (void)z3; (void)z4; |
|
|
return SQLITE_DENY; |
|
|
} |
|
|
|
|
|
void setUp(void) { |
|
|
|
|
|
} |
|
|
|
|
|
void tearDown(void) { |
|
|
|
|
|
} |
|
|
|
|
|
static sqlite3* open_memory_db(void){ |
|
|
sqlite3 *db = 0; |
|
|
int rc = sqlite3_open(":memory:", &db); |
|
|
TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
TEST_ASSERT_NOT_NULL(db); |
|
|
return db; |
|
|
} |
|
|
|
|
|
static Table* create_table_and_get_handle(sqlite3 *db, const char *sqlCreate, const char *zName, const char *zDb){ |
|
|
int rc = sqlite3_exec(db, sqlCreate, 0, 0, 0); |
|
|
TEST_ASSERT_EQUAL_INT_MESSAGE(SQLITE_OK, rc, "CREATE TABLE failed"); |
|
|
Table *pTab = sqlite3FindTable(db, zName, zDb); |
|
|
TEST_ASSERT_NOT_NULL_MESSAGE(pTab, "sqlite3FindTable returned NULL"); |
|
|
return pTab; |
|
|
} |
|
|
|
|
|
static void free_parse_error_if_any(sqlite3 *db, Parse *pParse){ |
|
|
if( pParse && pParse->zErrMsg ){ |
|
|
sqlite3DbFree(db, pParse->zErrMsg); |
|
|
pParse->zErrMsg = 0; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void test_alterFindCol_finds_existing_column_index(void){ |
|
|
sqlite3 *db = open_memory_db(); |
|
|
Table *pTab = create_table_and_get_handle(db, "CREATE TABLE t1(a, b, c);", "t1", "main"); |
|
|
|
|
|
Parse sParse; |
|
|
memset(&sParse, 0, sizeof(sParse)); |
|
|
sParse.db = db; |
|
|
|
|
|
Token tok; |
|
|
tok.z = "b"; |
|
|
tok.n = 1; |
|
|
|
|
|
int iCol = -999; |
|
|
int rc = test_alterFindCol(&sParse, pTab, &tok, &iCol); |
|
|
TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
TEST_ASSERT_EQUAL_INT(1, iCol); |
|
|
|
|
|
free_parse_error_if_any(db, &sParse); |
|
|
sqlite3_close(db); |
|
|
} |
|
|
|
|
|
|
|
|
void test_alterFindCol_nonexistent_column(void){ |
|
|
sqlite3 *db = open_memory_db(); |
|
|
Table *pTab = create_table_and_get_handle(db, "CREATE TABLE t2(x, y);", "t2", "main"); |
|
|
|
|
|
Parse sParse; |
|
|
memset(&sParse, 0, sizeof(sParse)); |
|
|
sParse.db = db; |
|
|
|
|
|
Token tok; |
|
|
tok.z = "z"; |
|
|
tok.n = 1; |
|
|
|
|
|
int iCol = -777; |
|
|
int rc = test_alterFindCol(&sParse, pTab, &tok, &iCol); |
|
|
TEST_ASSERT_EQUAL_INT(SQLITE_ERROR, rc); |
|
|
TEST_ASSERT_EQUAL_INT(-1, iCol); |
|
|
|
|
|
free_parse_error_if_any(db, &sParse); |
|
|
sqlite3_close(db); |
|
|
} |
|
|
|
|
|
|
|
|
void test_alterFindCol_case_insensitive(void){ |
|
|
sqlite3 *db = open_memory_db(); |
|
|
Table *pTab = create_table_and_get_handle(db, "CREATE TABLE t3(ColA, CoLb, colC);", "t3", "main"); |
|
|
|
|
|
Parse sParse; |
|
|
memset(&sParse, 0, sizeof(sParse)); |
|
|
sParse.db = db; |
|
|
|
|
|
|
|
|
Token tok; |
|
|
tok.z = "COLB"; |
|
|
tok.n = (int)strlen(tok.z); |
|
|
|
|
|
int iCol = -5; |
|
|
int rc = test_alterFindCol(&sParse, pTab, &tok, &iCol); |
|
|
TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
TEST_ASSERT_EQUAL_INT(1, iCol); |
|
|
|
|
|
free_parse_error_if_any(db, &sParse); |
|
|
sqlite3_close(db); |
|
|
} |
|
|
|
|
|
|
|
|
void test_alterFindCol_empty_token_errors(void){ |
|
|
sqlite3 *db = open_memory_db(); |
|
|
Table *pTab = create_table_and_get_handle(db, "CREATE TABLE t4(a, b);", "t4", "main"); |
|
|
|
|
|
Parse sParse; |
|
|
memset(&sParse, 0, sizeof(sParse)); |
|
|
sParse.db = db; |
|
|
|
|
|
Token tok; |
|
|
tok.z = ""; |
|
|
tok.n = 0; |
|
|
|
|
|
int iCol = 12345; |
|
|
int rc = test_alterFindCol(&sParse, pTab, &tok, &iCol); |
|
|
|
|
|
|
|
|
TEST_ASSERT(rc == SQLITE_ERROR || rc == SQLITE_NOMEM); |
|
|
TEST_ASSERT_EQUAL_INT(-1, iCol); |
|
|
|
|
|
free_parse_error_if_any(db, &sParse); |
|
|
sqlite3_close(db); |
|
|
} |
|
|
|
|
|
|
|
|
void test_alterFindCol_authorizer_denies_but_returns_ok(void){ |
|
|
sqlite3 *db = open_memory_db(); |
|
|
Table *pTab = create_table_and_get_handle(db, "CREATE TABLE t5(a, b);", "t5", "main"); |
|
|
|
|
|
|
|
|
int rcSet = sqlite3_set_authorizer(db, denyAuthorizer, 0); |
|
|
TEST_ASSERT_EQUAL_INT(SQLITE_OK, rcSet); |
|
|
|
|
|
Parse sParse; |
|
|
memset(&sParse, 0, sizeof(sParse)); |
|
|
sParse.db = db; |
|
|
|
|
|
Token tok; |
|
|
tok.z = "a"; |
|
|
tok.n = 1; |
|
|
|
|
|
int iCol = -1; |
|
|
int rc = test_alterFindCol(&sParse, pTab, &tok, &iCol); |
|
|
|
|
|
TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
TEST_ASSERT_EQUAL_INT(0, iCol); |
|
|
|
|
|
|
|
|
sqlite3_set_authorizer(db, 0, 0); |
|
|
|
|
|
free_parse_error_if_any(db, &sParse); |
|
|
sqlite3_close(db); |
|
|
} |
|
|
|
|
|
int main(void) { |
|
|
UNITY_BEGIN(); |
|
|
RUN_TEST(test_alterFindCol_finds_existing_column_index); |
|
|
RUN_TEST(test_alterFindCol_nonexistent_column); |
|
|
RUN_TEST(test_alterFindCol_case_insensitive); |
|
|
RUN_TEST(test_alterFindCol_empty_token_errors); |
|
|
RUN_TEST(test_alterFindCol_authorizer_denies_but_returns_ok); |
|
|
return UNITY_END(); |
|
|
} |