Team Ai
Modelpublic

AryaWu/sqlite

sourceHugging Faceupdated 10mo agoView on Hugging Face
0likes
tests_expr_sqlite3ExprImpliesNonNullRow.c188 linesDownload Raw Back to tests
1#include "sqliteInt.h"2#include "unity.h"3#include <string.h>4#include <stdlib.h>5 6/* Helper allocation for Expr nodes */7static Expr* exprAlloc(int op){8  Expr *p = (Expr*)sqlite3_malloc(sizeof(Expr));9  TEST_ASSERT_NOT_NULL_MESSAGE(p, "sqlite3_malloc for Expr failed");10  memset(p, 0, sizeof(Expr));11  p->op = (u8)op;12  return p;13}14 15static Expr* makeColumn(int iTab, int iCol){16  Expr *p = exprAlloc(TK_COLUMN);17  /* Set the cursor (table) and column */18  p->iTable = iTab;19  p->iColumn = iCol;20  return p;21}22 23static Expr* makeNotNull(Expr *pLeft){24  Expr *p = exprAlloc(TK_NOTNULL);25  p->pLeft = pLeft;26  return p;27}28 29static Expr* makeAnd(Expr *a, Expr *b){30  Expr *p = exprAlloc(TK_AND);31  p->pLeft = a;32  p->pRight = b;33  return p;34}35 36static Expr* makeEq(Expr *a, Expr *b){37  Expr *p = exprAlloc(TK_EQ);38  p->pLeft = a;39  p->pRight = b;40  return p;41}42 43static Expr* makeIntConst(int v){44  Expr *p = exprAlloc(TK_INTEGER);45  /* Integer value is stored in a union within Expr in SQLite.46     We do not need to set it for these tests since the walker47     only needs the presence of a RHS expression. */48  (void)v;49  return p;50}51 52/* Deep-free helper for our allocated trees */53static void freeExprDeep(Expr *p){54  if( p==0 ) return;55  freeExprDeep(p->pLeft);56  freeExprDeep(p->pRight);57  /* We did not allocate any pList, pSelect, or other substructures. */58  sqlite3_free(p);59}60 61/* Unity fixtures */62void setUp(void) {63  /* No setup required */64}65void tearDown(void) {66  /* No tear-down required */67}68 69/* Tests */70 71void test_sqlite3ExprImpliesNonNullRow_null_expr_returns_0(void){72  int rc = sqlite3ExprImpliesNonNullRow(NULL, 1, 0);73  TEST_ASSERT_EQUAL_INT(0, rc);74}75 76void test_sqlite3ExprImpliesNonNullRow_notnull_on_target_column_returns_1(void){77  /* WHERE t1.a IS NOT NULL */78  int iTab = 3;79  Expr *col = makeColumn(iTab, 0);80  Expr *nn = makeNotNull(col);81 82  int rc0 = sqlite3ExprImpliesNonNullRow(nn, iTab, 0);83  TEST_ASSERT_EQUAL_INT(1, rc0);84 85  int rc1 = sqlite3ExprImpliesNonNullRow(nn, iTab, 1);86  TEST_ASSERT_EQUAL_INT(1, rc1);87 88  freeExprDeep(nn); /* frees col as well */89}90 91void test_sqlite3ExprImpliesNonNullRow_and_chain_right_term_implies_returns_1(void){92  /* WHERE (t2.b IS NOT NULL) AND (t1.a IS NOT NULL) */93  int iTab1 = 5; /* target table */94  int iTab2 = 6; /* other table */95 96  Expr *t2col = makeColumn(iTab2, 0);97  Expr *t2isnn = makeNotNull(t2col);98 99  Expr *t1col = makeColumn(iTab1, 1);100  Expr *t1isnn = makeNotNull(t1col);101 102  Expr *andExpr = makeAnd(t2isnn, t1isnn);103 104  int rc = sqlite3ExprImpliesNonNullRow(andExpr, iTab1, 0);105  TEST_ASSERT_EQUAL_INT(1, rc);106 107  freeExprDeep(andExpr);108}109 110void test_sqlite3ExprImpliesNonNullRow_and_chain_left_term_implies_returns_1(void){111  /* WHERE (t1.a IS NOT NULL) AND (t2.b IS NOT NULL) */112  int iTab1 = 7; /* target table */113  int iTab2 = 8; /* other table */114 115  Expr *t1col = makeColumn(iTab1, 2);116  Expr *t1isnn = makeNotNull(t1col);117 118  Expr *t2col = makeColumn(iTab2, 3);119  Expr *t2isnn = makeNotNull(t2col);120 121  Expr *andExpr = makeAnd(t1isnn, t2isnn);122 123  int rc = sqlite3ExprImpliesNonNullRow(andExpr, iTab1, 0);124  TEST_ASSERT_EQUAL_INT(1, rc);125 126  freeExprDeep(andExpr);127}128 129void test_sqlite3ExprImpliesNonNullRow_eq_on_target_column_returns_1(void){130  /* WHERE t1.a = 5 */131  int iTab = 9;132  Expr *col = makeColumn(iTab, 0);133  Expr *cst = makeIntConst(5);134  Expr *eq = makeEq(col, cst);135 136  int rc = sqlite3ExprImpliesNonNullRow(eq, iTab, 0);137  TEST_ASSERT_EQUAL_INT(1, rc);138 139  freeExprDeep(eq);140}141 142void test_sqlite3ExprImpliesNonNullRow_outer_on_flag_excludes_term_returns_0(void){143  /* Term marked EP_OuterON should be excluded from analysis */144  int iTab = 10;145  Expr *col = makeColumn(iTab, 0);146  Expr *nn = makeNotNull(col);147  nn->flags |= EP_OuterON;148 149  int rc = sqlite3ExprImpliesNonNullRow(nn, iTab, 0);150  TEST_ASSERT_EQUAL_INT(0, rc);151 152  freeExprDeep(nn);153}154 155void test_sqlite3ExprImpliesNonNullRow_other_table_only_returns_0(void){156  /* WHERE t2.b IS NOT NULL  with iTab = t1 cursor */157  int iTabTarget = 11;158  int iTabOther = 12;159 160  Expr *col = makeColumn(iTabOther, 1);161  Expr *nn = makeNotNull(col);162 163  int rc = sqlite3ExprImpliesNonNullRow(nn, iTabTarget, 0);164  TEST_ASSERT_EQUAL_INT(0, rc);165 166  freeExprDeep(nn);167}168 169void test_sqlite3ExprImpliesNonNullRow_constant_expr_returns_0(void){170  /* WHERE 1 */171  Expr *one = makeIntConst(1);172  int rc = sqlite3ExprImpliesNonNullRow(one, 0, 0);173  TEST_ASSERT_EQUAL_INT(0, rc);174  freeExprDeep(one);175}176 177int main(void){178  UNITY_BEGIN();179  RUN_TEST(test_sqlite3ExprImpliesNonNullRow_null_expr_returns_0);180  RUN_TEST(test_sqlite3ExprImpliesNonNullRow_notnull_on_target_column_returns_1);181  RUN_TEST(test_sqlite3ExprImpliesNonNullRow_and_chain_right_term_implies_returns_1);182  RUN_TEST(test_sqlite3ExprImpliesNonNullRow_and_chain_left_term_implies_returns_1);183  RUN_TEST(test_sqlite3ExprImpliesNonNullRow_eq_on_target_column_returns_1);184  RUN_TEST(test_sqlite3ExprImpliesNonNullRow_outer_on_flag_excludes_term_returns_0);185  RUN_TEST(test_sqlite3ExprImpliesNonNullRow_other_table_only_returns_0);186  RUN_TEST(test_sqlite3ExprImpliesNonNullRow_constant_expr_returns_0);187  return UNITY_END();188}