AryaWu/sqlite
0
1#include "sqliteInt.h"2#include "unity.h"3 4#include <string.h>5#include <stdlib.h>6#include <ctype.h>7 8static sqlite3* open_memory_db(void){9 sqlite3 *db = 0;10 int rc = sqlite3_open(":memory:", &db);11 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);12 TEST_ASSERT_NOT_NULL(db);13 return db;14}15 16void setUp(void) {17 /* Setup code here, or leave empty */18}19void tearDown(void) {20 /* Cleanup code here, or leave empty */21}22 23/* Helper to skip whitespace and semicolons */24static const char* skip_ws_semis(const char *z){25 while( z && *z && (isspace((unsigned char)*z) || *z==';') ){26 z++;27 }28 return z;29}30 31void test_sqlite3_prepare_v2_basic_valid_select(void){32 sqlite3 *db = open_memory_db();33 34 const char *sql = "SELECT 12345;";35 sqlite3_stmt *pStmt = NULL;36 const char *zTail = NULL;37 38 int rc = sqlite3_prepare_v2(db, sql, -1, &pStmt, &zTail);39 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);40 TEST_ASSERT_NOT_NULL(pStmt);41 TEST_ASSERT_NOT_NULL(zTail);42 43 rc = sqlite3_step(pStmt);44 TEST_ASSERT_EQUAL_INT(SQLITE_ROW, rc);45 TEST_ASSERT_EQUAL_INT(12345, sqlite3_column_int(pStmt, 0));46 47 rc = sqlite3_step(pStmt);48 TEST_ASSERT_EQUAL_INT(SQLITE_DONE, rc);49 50 rc = sqlite3_finalize(pStmt);51 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);52 pStmt = NULL;53 54 rc = sqlite3_close(db);55 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);56}57 58void test_sqlite3_prepare_v2_pzTail_multiple_statements(void){59 sqlite3 *db = open_memory_db();60 61 const char *sql = "SELECT 1; SELECT 2;";62 sqlite3_stmt *pStmt1 = NULL;63 const char *zTail = NULL;64 65 int rc = sqlite3_prepare_v2(db, sql, -1, &pStmt1, &zTail);66 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);67 TEST_ASSERT_NOT_NULL(pStmt1);68 TEST_ASSERT_NOT_NULL(zTail);69 70 /* zTail should reference the start (after skipping spaces and ';') of the second statement */71 const char *expectedSecond = strstr(sql, "SELECT 2");72 TEST_ASSERT_NOT_NULL(expectedSecond);73 const char *normalizedTail = skip_ws_semis(zTail);74 TEST_ASSERT_EQUAL_PTR(expectedSecond, normalizedTail);75 76 /* Execute first statement: expect 1 */77 rc = sqlite3_step(pStmt1);78 TEST_ASSERT_EQUAL_INT(SQLITE_ROW, rc);79 TEST_ASSERT_EQUAL_INT(1, sqlite3_column_int(pStmt1, 0));80 rc = sqlite3_step(pStmt1);81 TEST_ASSERT_EQUAL_INT(SQLITE_DONE, rc);82 TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_finalize(pStmt1));83 pStmt1 = NULL;84 85 /* Prepare the second statement directly from tail and execute: expect 2 */86 sqlite3_stmt *pStmt2 = NULL;87 const char *zTail2 = NULL;88 rc = sqlite3_prepare_v2(db, normalizedTail, -1, &pStmt2, &zTail2);89 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);90 TEST_ASSERT_NOT_NULL(pStmt2);91 92 rc = sqlite3_step(pStmt2);93 TEST_ASSERT_EQUAL_INT(SQLITE_ROW, rc);94 TEST_ASSERT_EQUAL_INT(2, sqlite3_column_int(pStmt2, 0));95 TEST_ASSERT_EQUAL_INT(SQLITE_DONE, sqlite3_step(pStmt2));96 TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_finalize(pStmt2));97 98 TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_close(db));99}100 101void test_sqlite3_prepare_v2_nBytes_truncated_prefix_only(void){102 sqlite3 *db = open_memory_db();103 104 char sql[] = "SELECT 7; SELECT 99;";105 /* Truncate right after the first semicolon so only "SELECT 7;" is provided */106 const char *semi = strchr(sql, ';');107 TEST_ASSERT_NOT_NULL(semi);108 int nBytes = (int)((semi - sql) + 1); /* include the semicolon */109 110 sqlite3_stmt *pStmt = NULL;111 const char *zTail = NULL;112 int rc = sqlite3_prepare_v2(db, sql, nBytes, &pStmt, &zTail);113 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);114 TEST_ASSERT_NOT_NULL(pStmt);115 116 /* Since the provided buffer ends exactly at the semicolon, zTail should be sql + nBytes */117 TEST_ASSERT_EQUAL_PTR(sql + nBytes, zTail);118 119 rc = sqlite3_step(pStmt);120 TEST_ASSERT_EQUAL_INT(SQLITE_ROW, rc);121 TEST_ASSERT_EQUAL_INT(7, sqlite3_column_int(pStmt, 0));122 TEST_ASSERT_EQUAL_INT(SQLITE_DONE, sqlite3_step(pStmt));123 TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_finalize(pStmt));124 125 TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_close(db));126}127 128void test_sqlite3_prepare_v2_zero_length_yields_no_statement(void){129 sqlite3 *db = open_memory_db();130 131 const char *sql = "SELECT 1;";132 sqlite3_stmt *pStmt = NULL;133 const char *zTail = NULL;134 135 int rc = sqlite3_prepare_v2(db, sql, 0, &pStmt, &zTail);136 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);137 TEST_ASSERT_NULL(pStmt);138 /* For empty input, pzTail should equal zSql */139 TEST_ASSERT_EQUAL_PTR(sql, zTail);140 141 TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_close(db));142}143 144void test_sqlite3_prepare_v2_null_sql_misuse(void){145 sqlite3 *db = open_memory_db();146 147 sqlite3_stmt *pStmt = NULL;148 const char *zTail = NULL;149 150 int rc = sqlite3_prepare_v2(db, NULL, -1, &pStmt, &zTail);151 TEST_ASSERT_EQUAL_INT(SQLITE_MISUSE, rc);152 TEST_ASSERT_NULL(pStmt);153 154 TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_close(db));155}156 157void test_sqlite3_prepare_v2_saves_original_sql_prefix(void){158 sqlite3 *db = open_memory_db();159 160 /* No whitespace between statements to make expected prefix well-defined */161 const char *sql = "SELECT 9+1;SELECT 2;";162 const char *semi = strchr(sql, ';');163 TEST_ASSERT_NOT_NULL(semi);164 size_t firstLen = (size_t)((semi - sql) + 1); /* include the semicolon */165 166 sqlite3_stmt *pStmt = NULL;167 const char *zTail = NULL;168 int rc = sqlite3_prepare_v2(db, sql, -1, &pStmt, &zTail);169 TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);170 TEST_ASSERT_NOT_NULL(pStmt);171 TEST_ASSERT_NOT_NULL(zTail);172 /* Expect tail to point immediately at the 'S' of the second SELECT */173 TEST_ASSERT_EQUAL_PTR(sql + firstLen, zTail);174 175 const char *saved = sqlite3_sql(pStmt);176 TEST_ASSERT_NOT_NULL(saved);177 178 /* The saved SQL should match exactly the first statement (including the semicolon) */179 char *expected = (char*)sqlite3_malloc((int)firstLen + 1);180 TEST_ASSERT_NOT_NULL(expected);181 memcpy(expected, sql, firstLen);182 expected[firstLen] = 0;183 184 TEST_ASSERT_EQUAL_STRING(expected, saved);185 186 sqlite3_free(expected);187 188 TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_finalize(pStmt));189 TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_close(db));190}191 192void test_sqlite3_prepare_v2_malformed_sql_error(void){193 sqlite3 *db = open_memory_db();194 195 const char *sql = "SELEC FROM;";196 sqlite3_stmt *pStmt = NULL;197 const char *zTail = NULL;198 199 int rc = sqlite3_prepare_v2(db, sql, -1, &pStmt, &zTail);200 TEST_ASSERT_NOT_EQUAL(SQLITE_OK, rc);201 TEST_ASSERT_NULL(pStmt);202 203 TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_close(db));204}205 206int main(void){207 UNITY_BEGIN();208 RUN_TEST(test_sqlite3_prepare_v2_basic_valid_select);209 RUN_TEST(test_sqlite3_prepare_v2_pzTail_multiple_statements);210 RUN_TEST(test_sqlite3_prepare_v2_nBytes_truncated_prefix_only);211 RUN_TEST(test_sqlite3_prepare_v2_zero_length_yields_no_statement);212 RUN_TEST(test_sqlite3_prepare_v2_null_sql_misuse);213 RUN_TEST(test_sqlite3_prepare_v2_saves_original_sql_prefix);214 RUN_TEST(test_sqlite3_prepare_v2_malformed_sql_error);215 return UNITY_END();216}