Team Ai
Modelpublic

AryaWu/sqlite

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