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