AryaWu/sqlite
0
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}