Team Ai
Modelpublic

AryaWu/sqlite

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