AryaWu/sqlite
0
1#include "sqliteInt.h"2#include "unity.h"3#include <string.h>4#include <stdlib.h>5 6/* Helper to create an ExprList_item with specified eEName and zEName */7static struct ExprList_item makeItem(const char *zQualified, int eEName){8 struct ExprList_item it;9 memset(&it, 0, sizeof(it));10 it.zEName = (char*)zQualified;11 it.fg.eEName = (u8)eEName;12 return it;13}14 15void setUp(void) {16 /* No global setup required */17}18 19void tearDown(void) {20 /* No global teardown required */21}22 23/* ENAME_TAB: Full match with case-insensitivity on db, table, column */24void test_sqlite3MatchEName_ENAME_TAB_full_match_case_insensitive(void) {25 struct ExprList_item it = makeItem("main.Users.Name", ENAME_TAB);26 int pb = 0;27 int rc = sqlite3MatchEName(&it, "NAME", "users", "MAIN", &pb);28 TEST_ASSERT_EQUAL_INT(1, rc);29 TEST_ASSERT_EQUAL_INT(0, pb); /* pbRowid unchanged for ENAME_TAB */30}31 32/* ENAME_TAB: zDb and zCol NULL act as wildcards */33void test_sqlite3MatchEName_ENAME_TAB_db_and_col_null(void) {34 struct ExprList_item it = makeItem("main.Users.Name", ENAME_TAB);35 int pb = 0;36 int rc = sqlite3MatchEName(&it, NULL, "Users", NULL, &pb);37 TEST_ASSERT_EQUAL_INT(1, rc);38 TEST_ASSERT_EQUAL_INT(0, pb);39}40 41/* ENAME_TAB: mismatch on database component */42void test_sqlite3MatchEName_ENAME_TAB_db_mismatch(void) {43 struct ExprList_item it = makeItem("main.Users.Name", ENAME_TAB);44 int pb = 0;45 int rc = sqlite3MatchEName(&it, "Name", "Users", "temp", &pb);46 TEST_ASSERT_EQUAL_INT(0, rc);47 TEST_ASSERT_EQUAL_INT(0, pb);48}49 50/* ENAME_TAB: mismatch on table component */51void test_sqlite3MatchEName_ENAME_TAB_table_mismatch(void) {52 struct ExprList_item it = makeItem("main.Users.Name", ENAME_TAB);53 int pb = 0;54 int rc = sqlite3MatchEName(&it, "Name", "Accounts", "main", &pb);55 TEST_ASSERT_EQUAL_INT(0, rc);56 TEST_ASSERT_EQUAL_INT(0, pb);57}58 59/* ENAME_TAB: mismatch on column component */60void test_sqlite3MatchEName_ENAME_TAB_column_mismatch(void) {61 struct ExprList_item it = makeItem("main.Users.Name", ENAME_TAB);62 int pb = 0;63 int rc = sqlite3MatchEName(&it, "Age", "Users", "main", &pb);64 TEST_ASSERT_EQUAL_INT(0, rc);65 TEST_ASSERT_EQUAL_INT(0, pb);66}67 68/* ENAME_TAB: ensure db name must be exact length (zDb[n]==0 enforcement) */69void test_sqlite3MatchEName_ENAME_TAB_db_length_mismatch(void) {70 struct ExprList_item it = makeItem("main.Users.Name", ENAME_TAB);71 int pb = 0;72 /* "mainX" should fail even though it starts with "main" */73 int rc = sqlite3MatchEName(&it, "Name", "Users", "mainX", &pb);74 TEST_ASSERT_EQUAL_INT(0, rc);75 TEST_ASSERT_EQUAL_INT(0, pb);76}77 78/* ENAME_TAB: zCol NULL matches any column */79void test_sqlite3MatchEName_ENAME_TAB_col_null_matches_any(void) {80 struct ExprList_item it = makeItem("main.Users.Name", ENAME_TAB);81 int pb = 0;82 int rc = sqlite3MatchEName(&it, NULL, "Users", "main", &pb);83 TEST_ASSERT_EQUAL_INT(1, rc);84 TEST_ASSERT_EQUAL_INT(0, pb);85}86 87/* ENAME_ROWID: zCol NULL acceptable, sets pbRowid=1 on success */88void test_sqlite3MatchEName_ENAME_ROWID_col_null_sets_pbRowid(void) {89 struct ExprList_item it = makeItem("main.T1.rowid", ENAME_ROWID);90 int pb = 0;91 int rc = sqlite3MatchEName(&it, NULL, "t1", "MAIN", &pb);92 TEST_ASSERT_EQUAL_INT(1, rc);93 TEST_ASSERT_EQUAL_INT(1, pb);94}95 96/* ENAME_ROWID: zCol is "rowid" (case-insensitive), sets pbRowid */97void test_sqlite3MatchEName_ENAME_ROWID_col_rowid_alias_rowid(void) {98 struct ExprList_item it = makeItem("main.T1._rowid_", ENAME_ROWID);99 int pb = 0;100 int rc = sqlite3MatchEName(&it, "ROWID", "t1", "main", &pb);101 TEST_ASSERT_EQUAL_INT(1, rc);102 TEST_ASSERT_EQUAL_INT(1, pb);103}104 105/* ENAME_ROWID: zCol is "oid" alias, sets pbRowid */106void test_sqlite3MatchEName_ENAME_ROWID_col_rowid_alias_oid(void) {107 struct ExprList_item it = makeItem("main.T1.rowid", ENAME_ROWID);108 int pb = 0;109 int rc = sqlite3MatchEName(&it, "oid", "T1", "MAIN", &pb);110 TEST_ASSERT_EQUAL_INT(1, rc);111 TEST_ASSERT_EQUAL_INT(1, pb);112}113 114/* ENAME_ROWID: zCol is not a rowid alias -> no match, pbRowid unchanged */115void test_sqlite3MatchEName_ENAME_ROWID_non_alias_col(void) {116 struct ExprList_item it = makeItem("main.T1.rowid", ENAME_ROWID);117 int pb = 0;118 int rc = sqlite3MatchEName(&it, "id", "t1", "main", &pb);119 TEST_ASSERT_EQUAL_INT(0, rc);120 TEST_ASSERT_EQUAL_INT(0, pb);121}122 123/* ENAME_ROWID: mismatch on db or table causes failure */124void test_sqlite3MatchEName_ENAME_ROWID_db_or_table_mismatch(void) {125 struct ExprList_item it = makeItem("main.T1.rowid", ENAME_ROWID);126 int pb = 0;127 int rc1 = sqlite3MatchEName(&it, NULL, "T2", "main", &pb);128 TEST_ASSERT_EQUAL_INT(0, rc1);129 TEST_ASSERT_EQUAL_INT(0, pb);130 131 pb = 0;132 int rc2 = sqlite3MatchEName(&it, NULL, "T1", "temp", &pb);133 TEST_ASSERT_EQUAL_INT(0, rc2);134 TEST_ASSERT_EQUAL_INT(0, pb);135}136 137/* ENAME_ROWID: pbRowid must be non-NULL; if NULL, function returns 0 early */138void test_sqlite3MatchEName_ENAME_ROWID_null_pbRowid_returns0(void) {139 struct ExprList_item it = makeItem("main.T1.rowid", ENAME_ROWID);140 int rc = sqlite3MatchEName(&it, NULL, "T1", "main", NULL);141 TEST_ASSERT_EQUAL_INT(0, rc);142}143 144int main(void) {145 UNITY_BEGIN();146 147 RUN_TEST(test_sqlite3MatchEName_ENAME_TAB_full_match_case_insensitive);148 RUN_TEST(test_sqlite3MatchEName_ENAME_TAB_db_and_col_null);149 RUN_TEST(test_sqlite3MatchEName_ENAME_TAB_db_mismatch);150 RUN_TEST(test_sqlite3MatchEName_ENAME_TAB_table_mismatch);151 RUN_TEST(test_sqlite3MatchEName_ENAME_TAB_column_mismatch);152 RUN_TEST(test_sqlite3MatchEName_ENAME_TAB_db_length_mismatch);153 RUN_TEST(test_sqlite3MatchEName_ENAME_TAB_col_null_matches_any);154 155 RUN_TEST(test_sqlite3MatchEName_ENAME_ROWID_col_null_sets_pbRowid);156 RUN_TEST(test_sqlite3MatchEName_ENAME_ROWID_col_rowid_alias_rowid);157 RUN_TEST(test_sqlite3MatchEName_ENAME_ROWID_col_rowid_alias_oid);158 RUN_TEST(test_sqlite3MatchEName_ENAME_ROWID_non_alias_col);159 RUN_TEST(test_sqlite3MatchEName_ENAME_ROWID_db_or_table_mismatch);160 RUN_TEST(test_sqlite3MatchEName_ENAME_ROWID_null_pbRowid_returns0);161 162 return UNITY_END();163}