| #include "sqliteInt.h" |
| #include "unity.h" |
| #include <stdlib.h> |
| #include <string.h> |
|
|
| |
| void setUp(void) { |
| |
| } |
| void tearDown(void) { |
| |
| } |
|
|
| |
| static void initParse(Parse *pParse, sqlite3 *db, const char *zCons){ |
| memset(pParse, 0, sizeof(*pParse)); |
| pParse->db = db; |
| if( zCons ){ |
| |
| pParse->sLastToken.z = zCons + strlen(zCons); |
| pParse->sLastToken.n = 0; |
| } |
| } |
|
|
| |
| static SrcList* makeSrcList(sqlite3 *db, const char *zDb, const char *zTab){ |
| SrcList *p = 0; |
| Token tTab, tDb; |
| tTab.z = zTab; |
| tTab.n = (int)strlen(zTab); |
| if( zDb ){ |
| tDb.z = zDb; |
| tDb.n = (int)strlen(zDb); |
| p = sqlite3SrcListAppend(db, 0, &tTab, &tDb); |
| }else{ |
| p = sqlite3SrcListAppend(db, 0, &tTab, 0); |
| } |
| return p; |
| } |
|
|
| |
| static void freeParseError(sqlite3 *db, Parse *pParse){ |
| if( pParse->zErrMsg ){ |
| sqlite3DbFree(db, pParse->zErrMsg); |
| pParse->zErrMsg = 0; |
| } |
| } |
|
|
| |
| static void test_sqlite3AlterSetNotNull_table_not_found(void){ |
| sqlite3 *db = 0; |
| int rc = sqlite3_open(":memory:", &db); |
| TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
| |
| const char *zCons = "NOT NULL -- trailing comment"; |
| Parse sParse; |
| initParse(&sParse, db, zCons); |
|
|
| SrcList *pSrc = makeSrcList(db, 0, "nosuchtable"); |
| TEST_ASSERT_NOT_NULL(pSrc); |
| Token colTok; |
| colTok.z = "a"; |
| colTok.n = 1; |
| Token firstTok; |
| firstTok.z = zCons; |
| firstTok.n = 3; |
|
|
| |
| sqlite3AlterSetNotNull(&sParse, pSrc, &colTok, &firstTok); |
|
|
| |
| TEST_ASSERT_TRUE(sParse.nErr > 0); |
| TEST_ASSERT_NOT_NULL(sParse.zErrMsg); |
| TEST_ASSERT_NULL(sParse.pVdbe); |
|
|
| |
| freeParseError(db, &sParse); |
| sqlite3SrcListDelete(db, pSrc); |
| sqlite3_close(db); |
| } |
|
|
| |
| static void test_sqlite3AlterSetNotNull_column_not_found(void){ |
| sqlite3 *db = 0; |
| int rc = sqlite3_open(":memory:", &db); |
| TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
| rc = sqlite3_exec(db, "CREATE TABLE t(a, b);", 0, 0, 0); |
| TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
| const char *zCons = "NOT NULL -- trim me"; |
| Parse sParse; |
| initParse(&sParse, db, zCons); |
|
|
| SrcList *pSrc = makeSrcList(db, 0, "t"); |
| TEST_ASSERT_NOT_NULL(pSrc); |
| Token colTok; |
| colTok.z = "c"; |
| colTok.n = 1; |
| Token firstTok; |
| firstTok.z = zCons; |
| firstTok.n = 3; |
|
|
| sqlite3AlterSetNotNull(&sParse, pSrc, &colTok, &firstTok); |
|
|
| |
| TEST_ASSERT_TRUE(sParse.nErr > 0); |
| TEST_ASSERT_NOT_NULL(sParse.zErrMsg); |
| if( sParse.zErrMsg ){ |
| TEST_ASSERT_NOT_NULL(strstr(sParse.zErrMsg, "no such column")); |
| } |
| TEST_ASSERT_NULL(sParse.pVdbe); |
|
|
| |
| freeParseError(db, &sParse); |
| sqlite3SrcListDelete(db, pSrc); |
| sqlite3_close(db); |
| } |
|
|
| |
| static void test_sqlite3AlterSetNotNull_success_creates_vdbe_program(void){ |
| sqlite3 *db = 0; |
| int rc = sqlite3_open(":memory:", &db); |
| TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
| rc = sqlite3_exec(db, "CREATE TABLE t(a, b);", 0, 0, 0); |
| TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
| rc = sqlite3_exec(db, "INSERT INTO t(a,b) VALUES(1,2),(3,4);", 0, 0, 0); |
| TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc); |
|
|
| const char *zCons = "NOT NULL -- ensure trimming and comment handling"; |
| Parse sParse; |
| initParse(&sParse, db, zCons); |
|
|
| SrcList *pSrc = makeSrcList(db, 0, "t"); |
| TEST_ASSERT_NOT_NULL(pSrc); |
|
|
| Token colTok; |
| colTok.z = "a"; |
| colTok.n = 1; |
|
|
| Token firstTok; |
| firstTok.z = zCons; |
| firstTok.n = 3; |
|
|
| sqlite3AlterSetNotNull(&sParse, pSrc, &colTok, &firstTok); |
|
|
| |
| TEST_ASSERT_EQUAL_INT(0, sParse.nErr); |
| TEST_ASSERT_NULL(sParse.zErrMsg); |
| TEST_ASSERT_NOT_NULL(sParse.pVdbe); |
|
|
| |
| if( sParse.pVdbe ){ |
| int nOp = sqlite3VdbeCurrentAddr(sParse.pVdbe); |
| TEST_ASSERT_TRUE(nOp > 0); |
| } |
|
|
| |
| if( sParse.pVdbe ){ |
| sqlite3VdbeDelete(sParse.pVdbe); |
| sParse.pVdbe = 0; |
| } |
| sqlite3SrcListDelete(db, pSrc); |
| sqlite3_close(db); |
| } |
|
|
| |
| int main(void){ |
| UNITY_BEGIN(); |
| RUN_TEST(test_sqlite3AlterSetNotNull_table_not_found); |
| RUN_TEST(test_sqlite3AlterSetNotNull_column_not_found); |
| RUN_TEST(test_sqlite3AlterSetNotNull_success_creates_vdbe_program); |
| return UNITY_END(); |
| } |