AryaWu/sqlite
0
1#include "sqliteInt.h"2#include "unity.h"3#include <string.h>4 5/* Unity hooks */6void setUp(void) {7 /* No setup required */8}9void tearDown(void) {10 /* No teardown required */11}12 13/* Helpers to quickly build expressions */14static void initExpr(Expr *p, int op){15 memset(p, 0, sizeof(*p));16 p->op = (u8)op;17}18 19static void initTokenExpr(Expr *p, int op, const char *z){20 initExpr(p, op);21 p->u.zToken = (char*)z; /* safe to use string literals in tests */22}23 24static void initIntValueExpr(Expr *p, i64 v){25 initExpr(p, TK_INTEGER);26 p->flags |= EP_IntValue;27 p->u.iValue = v;28}29 30/* Tests */31 32void test_sqlite3ExprCompare_null_pointers_equal(void){33 TEST_ASSERT_EQUAL_INT(0, sqlite3ExprCompare(NULL, NULL, NULL, 0));34}35 36void test_sqlite3ExprCompare_one_null_pointer_unequal(void){37 Expr a;38 initExpr(&a, TK_NULL);39 TEST_ASSERT_EQUAL_INT(2, sqlite3ExprCompare(NULL, &a, NULL, 0));40 TEST_ASSERT_EQUAL_INT(2, sqlite3ExprCompare(NULL, NULL, &a, 0));41}42 43void test_sqlite3ExprCompare_intvalue_equal_and_notequal(void){44 Expr a, b, c;45 initIntValueExpr(&a, 42);46 initIntValueExpr(&b, 42);47 initIntValueExpr(&c, 43);48 TEST_ASSERT_EQUAL_INT(0, sqlite3ExprCompare(NULL, &a, &b, 0));49 TEST_ASSERT_EQUAL_INT(2, sqlite3ExprCompare(NULL, &a, &c, 0));50 51 /* Only one side EP_IntValue => must be different */52 Expr d;53 initExpr(&d, TK_INTEGER);54 d.flags &= ~EP_IntValue;55 d.u.iValue = 42; /* ignored since EP_IntValue not set */56 TEST_ASSERT_EQUAL_INT(2, sqlite3ExprCompare(NULL, &a, &d, 0));57}58 59void test_sqlite3ExprCompare_top_level_collate_returns_1(void){60 /* pA = COLLATE(NOCASE, column), pB = column => expect 1 */61 Expr colA, collA, colB;62 initExpr(&colA, TK_COLUMN);63 colA.iTable = 3; colA.iColumn = 5;64 65 initTokenExpr(&collA, TK_COLLATE, "nocase");66 collA.pLeft = &colA;67 68 initExpr(&colB, TK_COLUMN);69 colB.iTable = 3; colB.iColumn = 5;70 71 TEST_ASSERT_EQUAL_INT(1, sqlite3ExprCompare(NULL, &collA, &colB, 0));72}73 74void test_sqlite3ExprCompare_function_name_case_insensitive_equal(void){75 Expr a, b;76 initTokenExpr(&a, TK_FUNCTION, "ABS");77 initTokenExpr(&b, TK_FUNCTION, "abs");78 /* With no args and no window funcs, names equal ignoring case */79 TEST_ASSERT_EQUAL_INT(0, sqlite3ExprCompare(NULL, &a, &b, 0));80}81 82void test_sqlite3ExprCompare_string_token_equality_and_inequality(void){83 Expr a, b, c;84 initTokenExpr(&a, TK_STRING, "hello");85 initTokenExpr(&b, TK_STRING, "hello");86 initTokenExpr(&c, TK_STRING, "world");87 TEST_ASSERT_EQUAL_INT(0, sqlite3ExprCompare(NULL, &a, &b, 0));88 TEST_ASSERT_EQUAL_INT(2, sqlite3ExprCompare(NULL, &a, &c, 0));89}90 91void test_sqlite3ExprCompare_distinct_commuted_flags_mismatch(void){92 Expr a, b;93 initExpr(&a, TK_COLUMN);94 initExpr(&b, TK_COLUMN);95 a.iTable = b.iTable = 1;96 a.iColumn = b.iColumn = 2;97 98 a.flags |= EP_Distinct;99 b.flags &= ~EP_Distinct;100 TEST_ASSERT_EQUAL_INT(2, sqlite3ExprCompare(NULL, &a, &b, 0));101 102 /* Also test EP_Commuted mismatch */103 a.flags &= ~EP_Distinct;104 a.flags |= EP_Commuted;105 b.flags &= ~EP_Commuted;106 TEST_ASSERT_EQUAL_INT(2, sqlite3ExprCompare(NULL, &a, &b, 0));107}108 109void test_sqlite3ExprCompare_left_child_mismatch(void){110 Expr a, b, la, lb;111 initExpr(&la, TK_INTEGER); la.flags |= EP_IntValue; la.u.iValue = 1;112 initExpr(&lb, TK_INTEGER); lb.flags |= EP_IntValue; lb.u.iValue = 2;113 114 initExpr(&a, TK_EQ);115 a.pLeft = &la;116 117 initExpr(&b, TK_EQ);118 b.pLeft = &lb;119 120 TEST_ASSERT_EQUAL_INT(2, sqlite3ExprCompare(NULL, &a, &b, 0));121}122 123void test_sqlite3ExprCompare_right_child_mismatch(void){124 Expr a, b, ra, rb;125 initExpr(&ra, TK_INTEGER); ra.flags |= EP_IntValue; ra.u.iValue = 7;126 initExpr(&rb, TK_INTEGER); rb.flags |= EP_IntValue; rb.u.iValue = 8;127 128 initExpr(&a, TK_EQ);129 a.pRight = &ra;130 131 initExpr(&b, TK_EQ);132 b.pRight = &rb;133 134 TEST_ASSERT_EQUAL_INT(2, sqlite3ExprCompare(NULL, &a, &b, 0));135}136 137void test_sqlite3ExprCompare_iColumn_mismatch(void){138 Expr a, b;139 initExpr(&a, TK_COLUMN);140 initExpr(&b, TK_COLUMN);141 a.iTable = b.iTable = 1;142 a.iColumn = 0;143 b.iColumn = 1;144 TEST_ASSERT_EQUAL_INT(2, sqlite3ExprCompare(NULL, &a, &b, 0));145}146 147void test_sqlite3ExprCompare_truth_op2_mismatch(void){148 Expr a, b;149 initExpr(&a, TK_TRUTH);150 initExpr(&b, TK_TRUTH);151 a.iTable = b.iTable = 0;152 a.iColumn = b.iColumn = 0;153 a.op2 = 1;154 b.op2 = 2;155 TEST_ASSERT_EQUAL_INT(2, sqlite3ExprCompare(NULL, &a, &b, 0));156}157 158void test_sqlite3ExprCompare_iTable_mismatch_and_wildcard_match(void){159 /* Mismatch without wildcard: should be 2 */160 Expr a, b;161 initExpr(&a, TK_COLUMN);162 initExpr(&b, TK_COLUMN);163 a.iColumn = b.iColumn = 3;164 a.iTable = 5;165 b.iTable = 6;166 TEST_ASSERT_EQUAL_INT(2, sqlite3ExprCompare(NULL, &a, &b, 0));167 168 /* Wildcard: pB->iTable == -1 and iTab equals pA->iTable => equal */169 b.iTable = -1;170 TEST_ASSERT_EQUAL_INT(0, sqlite3ExprCompare(NULL, &a, &b, 5));171}172 173void test_sqlite3ExprCompare_agg_column_vs_column_special_case(void){174 /* pA: TK_AGG_COLUMN with iTable==iTab; pB: TK_COLUMN with iTable<0 */175 Expr a, b;176 initExpr(&a, TK_AGG_COLUMN);177 initExpr(&b, TK_COLUMN);178 a.iTable = 7;179 b.iTable = -2; /* any negative */180 a.iColumn = b.iColumn = 4;181 /* Should match due to special-case and subsequent wildcard rule */182 TEST_ASSERT_EQUAL_INT(0, sqlite3ExprCompare(NULL, &a, &b, 7));183}184 185void test_sqlite3ExprCompare_collate_name_mismatch(void){186 Expr leftA, leftB, collA, collB;187 initExpr(&leftA, TK_COLUMN);188 leftA.iTable = 1; leftA.iColumn = 2;189 leftB = leftA;190 191 initTokenExpr(&collA, TK_COLLATE, "nocase");192 collA.pLeft = &leftA;193 194 initTokenExpr(&collB, TK_COLLATE, "binary");195 collB.pLeft = &leftB;196 197 TEST_ASSERT_EQUAL_INT(2, sqlite3ExprCompare(NULL, &collA, &collB, 0));198}199 200void test_sqlite3ExprCompare_null_constants_equal(void){201 Expr a, b;202 initExpr(&a, TK_NULL);203 initExpr(&b, TK_NULL);204 TEST_ASSERT_EQUAL_INT(0, sqlite3ExprCompare(NULL, &a, &b, 0));205}206 207void test_sqlite3ExprCompare_ep_xIsSelect_short_circuit(void){208 Expr a, b;209 initExpr(&a, TK_STRING);210 initExpr(&b, TK_STRING);211 a.u.zToken = "x";212 b.u.zToken = "x";213 a.flags |= EP_xIsSelect;214 TEST_ASSERT_EQUAL_INT(2, sqlite3ExprCompare(NULL, &a, &b, 0));215}216 217/* main */218int main(void){219 UNITY_BEGIN();220 RUN_TEST(test_sqlite3ExprCompare_null_pointers_equal);221 RUN_TEST(test_sqlite3ExprCompare_one_null_pointer_unequal);222 RUN_TEST(test_sqlite3ExprCompare_intvalue_equal_and_notequal);223 RUN_TEST(test_sqlite3ExprCompare_top_level_collate_returns_1);224 RUN_TEST(test_sqlite3ExprCompare_function_name_case_insensitive_equal);225 RUN_TEST(test_sqlite3ExprCompare_string_token_equality_and_inequality);226 RUN_TEST(test_sqlite3ExprCompare_distinct_commuted_flags_mismatch);227 RUN_TEST(test_sqlite3ExprCompare_left_child_mismatch);228 RUN_TEST(test_sqlite3ExprCompare_right_child_mismatch);229 RUN_TEST(test_sqlite3ExprCompare_iColumn_mismatch);230 RUN_TEST(test_sqlite3ExprCompare_truth_op2_mismatch);231 RUN_TEST(test_sqlite3ExprCompare_iTable_mismatch_and_wildcard_match);232 RUN_TEST(test_sqlite3ExprCompare_agg_column_vs_column_special_case);233 RUN_TEST(test_sqlite3ExprCompare_collate_name_mismatch);234 RUN_TEST(test_sqlite3ExprCompare_null_constants_equal);235 RUN_TEST(test_sqlite3ExprCompare_ep_xIsSelect_short_circuit);236 return UNITY_END();237}