Team Ai
Modelpublic

AryaWu/sqlite

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