Team Ai
Modelpublic

AryaWu/sqlite

sourceHugging Faceupdated 10mo agoView on Hugging Face
0likes
tests_expr_exprImpliesNotNull.c401 linesDownload Raw Back to tests
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}