AryaWu/sqlite
0
1#include "sqliteInt.h"2#include "unity.h"3#include <stdlib.h>4#include <string.h>5 6/* Prototype for the wrapper provided in the module */7int test_exprImpliesNotNull(const Parse *pParse, const Expr *p, const Expr *pNN, int iTab, int seenNot);8 9/* Helpers to build expressions */10 11static Expr* newExprOp0(sqlite3 *db, int op){12 Expr *p = (Expr*)sqlite3DbMallocZero(db, sizeof(Expr));13 TEST_ASSERT_NOT_NULL(p);14 p->op = (u8)op;15 return p;16}17 18static Expr* newExprColumn(sqlite3 *db, int iTable, int iColumn){19 Expr *p = newExprOp0(db, TK_COLUMN);20 p->iTable = iTable;21 p->iColumn = iColumn;22 return p;23}24 25static Expr* newExprUnary(sqlite3 *db, int op, Expr *pLeft){26 Expr *p = newExprOp0(db, op);27 p->pLeft = pLeft;28 return p;29}30 31static Expr* newExprBinary(sqlite3 *db, int op, Expr *pLeft, Expr *pRight){32 Expr *p = newExprOp0(db, op);33 p->pLeft = pLeft;34 p->pRight = pRight;35 return p;36}37 38static Expr* newExprInteger(sqlite3 *db, int val){39 Expr *p = newExprOp0(db, TK_INTEGER);40 /* No need to set EP_IntValue; tests don't rely on integer comparisons */41 p->u.iValue = val;42 return p;43}44 45static ExprList* newExprListN(Parse *pParse, int n, Expr **apExpr){46 ExprList *pList = 0;47 for(int i=0; i<n; i++){48 pList = sqlite3ExprListAppend(pParse, pList, apExpr[i]);49 }50 return pList;51}52 53static Expr* newExprInWithList(Parse *pParse, Expr *pLhs, ExprList *pList){54 Expr *pIn = newExprOp0(pParse->db, TK_IN);55 pIn->pLeft = pLhs;56 pIn->x.pList = pList; /* EP_xIsSelect is not set => list form */57 return pIn;58}59 60static Expr* newExprInWithSelect(Parse *pParse, Expr *pLhs){61 sqlite3 *db = pParse->db;62 Expr *pIn = newExprOp0(db, TK_IN);63 pIn->pLeft = pLhs;64 pIn->flags |= EP_xIsSelect; /* Indicate x is a Select */65 /* Provide a minimal dummy Select to satisfy any debug asserts */66 Select *pSel = (Select*)sqlite3DbMallocZero(db, sizeof(Select));67 pIn->x.pSelect = pSel;68 return pIn;69}70 71static Expr* newExprBetween(Parse *pParse, Expr *pLhs, Expr *pLower, Expr *pUpper){72 Expr *pBetween = newExprOp0(pParse->db, TK_BETWEEN);73 pBetween->pLeft = pLhs;74 Expr *bounds[2] = { pLower, pUpper };75 pBetween->x.pList = newExprListN(pParse, 2, bounds);76 return pBetween;77}78 79/* Unity fixtures */80void setUp(void) {81 /* No global setup */82}83void tearDown(void) {84 /* No global teardown */85}86 87/* Tests */88 89static void test_exprImpliesNotNull_equal_nonnull_returns_true(void){90 sqlite3 *db = 0;91 Parse parse;92 memset(&parse, 0, sizeof(parse));93 TEST_ASSERT_EQUAL(SQLITE_OK, sqlite3_open(":memory:", &db));94 parse.db = db;95 96 Expr *p = newExprColumn(db, 1, 0);97 Expr *pNN = newExprColumn(db, 1, 0);98 99 int rc = test_exprImpliesNotNull(&parse, p, pNN, 0, 0);100 TEST_ASSERT_TRUE(rc!=0);101 102 sqlite3ExprDelete(db, p);103 sqlite3ExprDelete(db, pNN);104 sqlite3_close(db);105}106 107static void test_exprImpliesNotNull_equal_null_returns_false(void){108 sqlite3 *db = 0;109 Parse parse; memset(&parse, 0, sizeof(parse));110 TEST_ASSERT_EQUAL(SQLITE_OK, sqlite3_open(":memory:", &db));111 parse.db = db;112 113 Expr *p = newExprOp0(db, TK_NULL);114 Expr *pNN = newExprOp0(db, TK_NULL);115 116 int rc = test_exprImpliesNotNull(&parse, p, pNN, 0, 0);117 TEST_ASSERT_EQUAL_INT(0, rc);118 119 sqlite3ExprDelete(db, p);120 sqlite3ExprDelete(db, pNN);121 sqlite3_close(db);122}123 124static void test_exprImpliesNotNull_plus_depends_on_left(void){125 sqlite3 *db = 0;126 Parse parse; memset(&parse, 0, sizeof(parse));127 TEST_ASSERT_EQUAL(SQLITE_OK, sqlite3_open(":memory:", &db)); parse.db = db;128 129 Expr *a_for_p = newExprColumn(db, 2, 3);130 Expr *a_for_pNN = newExprColumn(db, 2, 3);131 Expr *five = newExprInteger(db, 5);132 Expr *p = newExprBinary(db, TK_PLUS, a_for_p, five);133 134 int rc = test_exprImpliesNotNull(&parse, p, a_for_pNN, 0, 0);135 TEST_ASSERT_TRUE(rc!=0);136 137 sqlite3ExprDelete(db, p);138 sqlite3ExprDelete(db, a_for_pNN);139 sqlite3_close(db);140}141 142static void test_exprImpliesNotNull_plus_depends_on_right(void){143 sqlite3 *db=0; Parse parse; memset(&parse,0,sizeof(parse));144 TEST_ASSERT_EQUAL(SQLITE_OK, sqlite3_open(":memory:", &db)); parse.db=db;145 146 Expr *five = newExprInteger(db, 5);147 Expr *a_for_p = newExprColumn(db, 4, 1);148 Expr *a_for_pNN = newExprColumn(db, 4, 1);149 Expr *p = newExprBinary(db, TK_PLUS, five, a_for_p);150 151 int rc = test_exprImpliesNotNull(&parse, p, a_for_pNN, 0, 0);152 TEST_ASSERT_TRUE(rc!=0);153 154 sqlite3ExprDelete(db, p);155 sqlite3ExprDelete(db, a_for_pNN);156 sqlite3_close(db);157}158 159static void test_exprImpliesNotNull_not_depends_on_child(void){160 sqlite3 *db=0; Parse parse; memset(&parse,0,sizeof(parse));161 TEST_ASSERT_EQUAL(SQLITE_OK, sqlite3_open(":memory:", &db)); parse.db=db;162 163 Expr *a_for_p = newExprColumn(db, 7, 2);164 Expr *a_for_pNN = newExprColumn(db, 7, 2);165 Expr *p = newExprUnary(db, TK_NOT, a_for_p);166 167 int rc = test_exprImpliesNotNull(&parse, p, a_for_pNN, 0, 0);168 TEST_ASSERT_TRUE(rc!=0);169 170 sqlite3ExprDelete(db, p);171 sqlite3ExprDelete(db, a_for_pNN);172 sqlite3_close(db);173}174 175static void test_exprImpliesNotNull_in_list_depends_on_left(void){176 sqlite3 *db=0; Parse parse; memset(&parse,0,sizeof(parse));177 TEST_ASSERT_EQUAL(SQLITE_OK, sqlite3_open(":memory:", &db)); parse.db=db;178 179 Expr *a_for_p = newExprColumn(db, 3, 9);180 Expr *a_for_pNN = newExprColumn(db, 3, 9);181 Expr *one = newExprInteger(db, 1);182 Expr *arr[1] = { one };183 ExprList *list = newExprListN(&parse, 1, arr);184 Expr *p = newExprInWithList(&parse, a_for_p, list);185 186 int rc = test_exprImpliesNotNull(&parse, p, a_for_pNN, 0, 0);187 TEST_ASSERT_TRUE(rc!=0);188 189 sqlite3ExprDelete(db, p);190 sqlite3ExprDelete(db, a_for_pNN);191 sqlite3_close(db);192}193 194static void test_exprImpliesNotNull_in_select_seenNot_true_returns_0(void){195 sqlite3 *db=0; Parse parse; memset(&parse,0,sizeof(parse));196 TEST_ASSERT_EQUAL(SQLITE_OK, sqlite3_open(":memory:", &db)); parse.db=db;197 198 Expr *a_for_p = newExprColumn(db, 5, 5);199 Expr *a_for_pNN = newExprColumn(db, 5, 5);200 Expr *p = newExprInWithSelect(&parse, a_for_p);201 202 int rc = test_exprImpliesNotNull(&parse, p, a_for_pNN, 0, 1);203 TEST_ASSERT_EQUAL_INT(0, rc);204 205 sqlite3ExprDelete(db, p);206 sqlite3ExprDelete(db, a_for_pNN);207 sqlite3_close(db);208}209 210static void test_exprImpliesNotNull_in_select_seenNot_false_falls_through_left(void){211 sqlite3 *db=0; Parse parse; memset(&parse,0,sizeof(parse));212 TEST_ASSERT_EQUAL(SQLITE_OK, sqlite3_open(":memory:", &db)); parse.db=db;213 214 Expr *a_for_p = newExprColumn(db, 8, 6);215 Expr *a_for_pNN = newExprColumn(db, 8, 6);216 Expr *p = newExprInWithSelect(&parse, a_for_p);217 218 int rc = test_exprImpliesNotNull(&parse, p, a_for_pNN, 0, 0);219 TEST_ASSERT_TRUE(rc!=0);220 221 sqlite3ExprDelete(db, p);222 sqlite3ExprDelete(db, a_for_pNN);223 sqlite3_close(db);224}225 226static void test_exprImpliesNotNull_between_seenNot_true_returns_0(void){227 sqlite3 *db=0; Parse parse; memset(&parse,0,sizeof(parse));228 TEST_ASSERT_EQUAL(SQLITE_OK, sqlite3_open(":memory:", &db)); parse.db=db;229 230 Expr *a_for_p = newExprColumn(db, 1, 1);231 Expr *low = newExprInteger(db, 1);232 Expr *high = newExprInteger(db, 2);233 Expr *p = newExprBetween(&parse, a_for_p, low, high);234 Expr *a_for_pNN = newExprColumn(db, 1, 1);235 236 int rc = test_exprImpliesNotNull(&parse, p, a_for_pNN, 0, 1);237 TEST_ASSERT_EQUAL_INT(0, rc);238 239 sqlite3ExprDelete(db, p);240 sqlite3ExprDelete(db, a_for_pNN);241 sqlite3_close(db);242}243 244static void test_exprImpliesNotNull_between_bound_implies_not_null(void){245 sqlite3 *db=0; Parse parse; memset(&parse,0,sizeof(parse));246 TEST_ASSERT_EQUAL(SQLITE_OK, sqlite3_open(":memory:", &db)); parse.db=db;247 248 Expr *lhs = newExprColumn(db, 2, 2);249 Expr *b_for_bound = newExprColumn(db, 9, 9);250 Expr *b_for_pNN = newExprColumn(db, 9, 9);251 Expr *upper = newExprInteger(db, 100);252 Expr *p = newExprBetween(&parse, lhs, b_for_bound, upper);253 254 int rc = test_exprImpliesNotNull(&parse, p, b_for_pNN, 0, 0);255 TEST_ASSERT_TRUE(rc!=0);256 257 sqlite3ExprDelete(db, p);258 sqlite3ExprDelete(db, b_for_pNN);259 sqlite3_close(db);260}261 262static void test_exprImpliesNotNull_between_left_implies_when_bounds_not(void){263 sqlite3 *db=0; Parse parse; memset(&parse,0,sizeof(parse));264 TEST_ASSERT_EQUAL(SQLITE_OK, sqlite3_open(":memory:", &db)); parse.db=db;265 266 Expr *a_for_p = newExprColumn(db, 11, 3);267 Expr *a_for_pNN = newExprColumn(db, 11, 3);268 Expr *low = newExprInteger(db, 0);269 Expr *high = newExprInteger(db, 10);270 Expr *p = newExprBetween(&parse, a_for_p, low, high);271 272 int rc = test_exprImpliesNotNull(&parse, p, a_for_pNN, 0, 0);273 TEST_ASSERT_TRUE(rc!=0);274 275 sqlite3ExprDelete(db, p);276 sqlite3ExprDelete(db, a_for_pNN);277 sqlite3_close(db);278}279 280static void test_exprImpliesNotNull_between_no_match_returns_0(void){281 sqlite3 *db=0; Parse parse; memset(&parse,0,sizeof(parse));282 TEST_ASSERT_EQUAL(SQLITE_OK, sqlite3_open(":memory:", &db)); parse.db=db;283 284 Expr *x = newExprColumn(db, 20, 1);285 Expr *a_for_pNN = newExprColumn(db, 21, 1);286 Expr *low = newExprInteger(db, 5);287 Expr *high = newExprInteger(db, 6);288 Expr *p = newExprBetween(&parse, x, low, high);289 290 int rc = test_exprImpliesNotNull(&parse, p, a_for_pNN, 0, 0);291 TEST_ASSERT_EQUAL_INT(0, rc);292 293 sqlite3ExprDelete(db, p);294 sqlite3ExprDelete(db, a_for_pNN);295 sqlite3_close(db);296}297 298static void test_exprImpliesNotNull_truth_is_operator_uses_left(void){299 sqlite3 *db=0; Parse parse; memset(&parse,0,sizeof(parse));300 TEST_ASSERT_EQUAL(SQLITE_OK, sqlite3_open(":memory:", &db)); parse.db=db;301 302 Expr *a_for_p = newExprColumn(db, 30, 7);303 Expr *a_for_pNN = newExprColumn(db, 30, 7);304 Expr *p = newExprUnary(db, TK_TRUTH, a_for_p);305 p->op2 = TK_IS;306 307 int rc = test_exprImpliesNotNull(&parse, p, a_for_pNN, 0, 0);308 TEST_ASSERT_TRUE(rc!=0);309 310 sqlite3ExprDelete(db, p);311 sqlite3ExprDelete(db, a_for_pNN);312 sqlite3_close(db);313}314 315static void test_exprImpliesNotNull_truth_not_is_returns_0(void){316 sqlite3 *db=0; Parse parse; memset(&parse,0,sizeof(parse));317 TEST_ASSERT_EQUAL(SQLITE_OK, sqlite3_open(":memory:", &db)); parse.db=db;318 319 Expr *a_for_p = newExprColumn(db, 31, 8);320 Expr *a_for_pNN = newExprColumn(db, 31, 8);321 Expr *p = newExprUnary(db, TK_TRUTH, a_for_p);322 p->op2 = TK_ISNOT;323 324 int rc = test_exprImpliesNotNull(&parse, p, a_for_pNN, 0, 0);325 TEST_ASSERT_EQUAL_INT(0, rc);326 327 sqlite3ExprDelete(db, p);328 sqlite3ExprDelete(db, a_for_pNN);329 sqlite3_close(db);330}331 332static void test_exprImpliesNotNull_iTab_match_when_pNN_iTable_minus1(void){333 sqlite3 *db=0; Parse parse; memset(&parse,0,sizeof(parse));334 TEST_ASSERT_EQUAL(SQLITE_OK, sqlite3_open(":memory:", &db)); parse.db=db;335 336 /* p has iTable=7, pNN has iTable=-1; with iTab=7 they should compare equal */337 Expr *p = newExprColumn(db, 7, 0);338 Expr *pNN = newExprColumn(db, -1, 0);339 340 int rc = test_exprImpliesNotNull(&parse, p, pNN, 7, 0);341 TEST_ASSERT_TRUE(rc!=0);342 343 sqlite3ExprDelete(db, p);344 sqlite3ExprDelete(db, pNN);345 sqlite3_close(db);346}347 348static void test_exprImpliesNotNull_iTab_mismatch_fails(void){349 sqlite3 *db=0; Parse parse; memset(&parse,0,sizeof(parse));350 TEST_ASSERT_EQUAL(SQLITE_OK, sqlite3_open(":memory:", &db)); parse.db=db;351 352 Expr *p = newExprColumn(db, 7, 0);353 Expr *pNN = newExprColumn(db, -1, 0);354 355 int rc = test_exprImpliesNotNull(&parse, p, pNN, 4, 0);356 TEST_ASSERT_EQUAL_INT(0, rc);357 358 sqlite3ExprDelete(db, p);359 sqlite3ExprDelete(db, pNN);360 sqlite3_close(db);361}362 363static void test_exprImpliesNotNull_star_depends_on_left_or_right(void){364 sqlite3 *db=0; Parse parse; memset(&parse,0,sizeof(parse));365 TEST_ASSERT_EQUAL(SQLITE_OK, sqlite3_open(":memory:", &db)); parse.db=db;366 367 Expr *a_for_p = newExprColumn(db, 12, 12);368 Expr *a_for_pNN = newExprColumn(db, 12, 12);369 Expr *two = newExprInteger(db, 2);370 Expr *p = newExprBinary(db, TK_STAR, a_for_p, two);371 372 int rc = test_exprImpliesNotNull(&parse, p, a_for_pNN, 0, 0);373 TEST_ASSERT_TRUE(rc!=0);374 375 sqlite3ExprDelete(db, p);376 sqlite3ExprDelete(db, a_for_pNN);377 sqlite3_close(db);378}379 380/* Unity main */381int main(void){382 UNITY_BEGIN();383 RUN_TEST(test_exprImpliesNotNull_equal_nonnull_returns_true);384 RUN_TEST(test_exprImpliesNotNull_equal_null_returns_false);385 RUN_TEST(test_exprImpliesNotNull_plus_depends_on_left);386 RUN_TEST(test_exprImpliesNotNull_plus_depends_on_right);387 RUN_TEST(test_exprImpliesNotNull_not_depends_on_child);388 RUN_TEST(test_exprImpliesNotNull_in_list_depends_on_left);389 RUN_TEST(test_exprImpliesNotNull_in_select_seenNot_true_returns_0);390 RUN_TEST(test_exprImpliesNotNull_in_select_seenNot_false_falls_through_left);391 RUN_TEST(test_exprImpliesNotNull_between_seenNot_true_returns_0);392 RUN_TEST(test_exprImpliesNotNull_between_bound_implies_not_null);393 RUN_TEST(test_exprImpliesNotNull_between_left_implies_when_bounds_not);394 RUN_TEST(test_exprImpliesNotNull_between_no_match_returns_0);395 RUN_TEST(test_exprImpliesNotNull_truth_is_operator_uses_left);396 RUN_TEST(test_exprImpliesNotNull_truth_not_is_returns_0);397 RUN_TEST(test_exprImpliesNotNull_iTab_match_when_pNN_iTable_minus1);398 RUN_TEST(test_exprImpliesNotNull_iTab_mismatch_fails);399 RUN_TEST(test_exprImpliesNotNull_star_depends_on_left_or_right);400 return UNITY_END();401}