AryaWu/sqlite
0
1#include "sqliteInt.h"2#include "unity.h"3#include <stdlib.h>4#include <string.h>5 6/* Helper: allocate and zero memory via sqlite3_malloc */7static void *smalloc(size_t n){8 void *p = sqlite3_malloc((int)n);9 TEST_ASSERT_NOT_NULL_MESSAGE(p, "sqlite3_malloc failed");10 memset(p, 0, n);11 return p;12}13 14/* Helper: create an integer literal expression using EP_IntValue */15static Expr *make_int_expr(int v){16 Expr *p = (Expr*)smalloc(sizeof(Expr));17 memset(p, 0, sizeof(Expr));18 p->op = TK_INTEGER;19 p->flags = EP_IntValue;20 p->u.iValue = v;21 return p;22}23 24/* Helper: create a column expression */25static Expr *make_column_expr(int iTab, int iCol){26 Expr *p = (Expr*)smalloc(sizeof(Expr));27 memset(p, 0, sizeof(Expr));28 p->op = TK_COLUMN;29 p->iTable = iTab;30 p->iColumn = iCol;31 return p;32}33 34/* Helper: wrap expression in a TK_COLLATE node */35static Expr *wrap_collate(Expr *inner, const char *zColl){36 Expr *p = (Expr*)smalloc(sizeof(Expr));37 memset(p, 0, sizeof(Expr));38 p->op = TK_COLLATE;39 p->pLeft = inner;40 p->u.zToken = (char*)zColl;41 return p;42}43 44/* Helper: allocate an ExprList with n entries */45static ExprList *make_exprlistN(Expr **arr, u8 *sortFlags, int n){46 size_t itemSize = sizeof(((ExprList*)0)->a[0]);47 size_t sz = sizeof(ExprList) + (n>0 ? (size_t)(n-1)*itemSize : 0);48 ExprList *p = (ExprList*)smalloc(sz);49 memset(p, 0, sz);50 p->nExpr = n;51 for(int i=0;i<n;i++){52 p->a[i].pExpr = arr[i];53 p->a[i].fg.sortFlags = sortFlags ? sortFlags[i] : 0;54 }55 return p;56}57 58static ExprList *make_exprlist1(Expr *e0, u8 s0){59 Expr *arr[1] = { e0 };60 u8 sf[1] = { s0 };61 return make_exprlistN(arr, sf, 1);62}63 64static ExprList *make_exprlist2(Expr *e0, u8 s0, Expr *e1, u8 s1){65 Expr *arr[2] = { e0, e1 };66 u8 sf[2] = { s0, s1 };67 return make_exprlistN(arr, sf, 2);68}69 70void setUp(void) {71 /* No global setup required */72}73 74void tearDown(void) {75 /* No global teardown required */76}77 78/* Test: both lists NULL => 0 */79void test_sqlite3ExprListCompare_both_null_returns_0(void){80 int rc = sqlite3ExprListCompare(NULL, NULL, 0);81 TEST_ASSERT_EQUAL_INT(0, rc);82}83 84/* Test: one NULL, one not => 1 (both orders) */85void test_sqlite3ExprListCompare_one_null_returns_1(void){86 Expr *e = make_int_expr(5);87 ExprList *pA = make_exprlist1(e, 0);88 int rc1 = sqlite3ExprListCompare(pA, NULL, 0);89 int rc2 = sqlite3ExprListCompare(NULL, pA, 0);90 TEST_ASSERT_EQUAL_INT(1, rc1);91 TEST_ASSERT_EQUAL_INT(1, rc2);92 sqlite3_free(pA);93 sqlite3_free(e);94}95 96/* Test: length mismatch => 1 */97void test_sqlite3ExprListCompare_length_mismatch_returns_1(void){98 Expr *e1 = make_int_expr(1);99 Expr *e2 = make_int_expr(2);100 ExprList *p1 = make_exprlist1(e1, 0);101 ExprList *p2 = make_exprlist2(e1, 0, e2, 0);102 int rc = sqlite3ExprListCompare(p1, p2, 0);103 TEST_ASSERT_EQUAL_INT(1, rc);104 sqlite3_free(p1);105 sqlite3_free(p2);106 sqlite3_free(e1);107 sqlite3_free(e2);108}109 110/* Test: sortFlags mismatch on corresponding items => 1 */111void test_sqlite3ExprListCompare_sortFlags_mismatch_returns_1(void){112 Expr *a1 = make_int_expr(10);113 Expr *b1 = make_int_expr(10);114 ExprList *pA = make_exprlist1(a1, 0x01);115 ExprList *pB = make_exprlist1(b1, 0x02);116 int rc = sqlite3ExprListCompare(pA, pB, 0);117 TEST_ASSERT_EQUAL_INT(1, rc);118 sqlite3_free(pA);119 sqlite3_free(pB);120 sqlite3_free(a1);121 sqlite3_free(b1);122}123 124/* Test: identical expressions across list => 0 */125void test_sqlite3ExprListCompare_equal_ints_returns_0(void){126 Expr *a0 = make_int_expr(5);127 Expr *a1 = make_int_expr(7);128 Expr *b0 = make_int_expr(5);129 Expr *b1 = make_int_expr(7);130 ExprList *pA = make_exprlist2(a0, 0, a1, 0);131 ExprList *pB = make_exprlist2(b0, 0, b1, 0);132 int rc = sqlite3ExprListCompare(pA, pB, 0);133 TEST_ASSERT_EQUAL_INT(0, rc);134 sqlite3_free(pA);135 sqlite3_free(pB);136 sqlite3_free(a0);137 sqlite3_free(a1);138 sqlite3_free(b0);139 sqlite3_free(b1);140}141 142/* Test: integer values differ => propagate sqlite3ExprCompare's 2 */143void test_sqlite3ExprListCompare_int_value_mismatch_returns_2(void){144 Expr *a = make_int_expr(5);145 Expr *b = make_int_expr(6);146 ExprList *pA = make_exprlist1(a, 0);147 ExprList *pB = make_exprlist1(b, 0);148 int rc = sqlite3ExprListCompare(pA, pB, 0);149 TEST_ASSERT_EQUAL_INT(2, rc);150 sqlite3_free(pA);151 sqlite3_free(pB);152 sqlite3_free(a);153 sqlite3_free(b);154}155 156/* Test: TK_COLUMN with pB.iTable = -1 and iTab equals pA.iTable => equal (0) */157void test_sqlite3ExprListCompare_column_itab_special_case_returns_0(void){158 int iTab = 7;159 int iCol = 3;160 Expr *a = make_column_expr(iTab, iCol);161 Expr *b = make_column_expr(-1, iCol);162 ExprList *pA = make_exprlist1(a, 0);163 ExprList *pB = make_exprlist1(b, 0);164 int rc = sqlite3ExprListCompare(pA, pB, iTab);165 TEST_ASSERT_EQUAL_INT(0, rc);166 sqlite3_free(pA);167 sqlite3_free(pB);168 sqlite3_free(a);169 sqlite3_free(b);170}171 172/* Test: only top-level COLLATE difference => sqlite3ExprCompare returns 1, propagate 1 */173void test_sqlite3ExprListCompare_top_level_collate_returns_1(void){174 Expr *baseA = make_int_expr(42);175 Expr *baseB = make_int_expr(42);176 Expr *bColl = wrap_collate(baseB, "BINARY");177 ExprList *pA = make_exprlist1(baseA, 0);178 ExprList *pB = make_exprlist1(bColl, 0);179 int rc = sqlite3ExprListCompare(pA, pB, 0);180 TEST_ASSERT_EQUAL_INT(1, rc);181 sqlite3_free(pA);182 sqlite3_free(pB);183 sqlite3_free(baseA);184 /* Free both the collate wrapper and its inner expression */185 sqlite3_free(bColl->pLeft);186 sqlite3_free(bColl);187}188 189/* Test: multi-element list where second element differs => propagate 2 */190void test_sqlite3ExprListCompare_second_item_mismatch_returns_2(void){191 Expr *a0 = make_int_expr(1);192 Expr *a1 = make_int_expr(2);193 Expr *b0 = make_int_expr(1);194 Expr *b1 = make_int_expr(3); /* mismatch here */195 ExprList *pA = make_exprlist2(a0, 0, a1, 0);196 ExprList *pB = make_exprlist2(b0, 0, b1, 0);197 int rc = sqlite3ExprListCompare(pA, pB, 0);198 TEST_ASSERT_EQUAL_INT(2, rc);199 sqlite3_free(pA);200 sqlite3_free(pB);201 sqlite3_free(a0);202 sqlite3_free(a1);203 sqlite3_free(b0);204 sqlite3_free(b1);205}206 207int main(void){208 UNITY_BEGIN();209 RUN_TEST(test_sqlite3ExprListCompare_both_null_returns_0);210 RUN_TEST(test_sqlite3ExprListCompare_one_null_returns_1);211 RUN_TEST(test_sqlite3ExprListCompare_length_mismatch_returns_1);212 RUN_TEST(test_sqlite3ExprListCompare_sortFlags_mismatch_returns_1);213 RUN_TEST(test_sqlite3ExprListCompare_equal_ints_returns_0);214 RUN_TEST(test_sqlite3ExprListCompare_int_value_mismatch_returns_2);215 RUN_TEST(test_sqlite3ExprListCompare_column_itab_special_case_returns_0);216 RUN_TEST(test_sqlite3ExprListCompare_top_level_collate_returns_1);217 RUN_TEST(test_sqlite3ExprListCompare_second_item_mismatch_returns_2);218 return UNITY_END();219}