Team Ai
Modelpublic

AryaWu/sqlite

sourceHugging Faceupdated 10mo agoView on Hugging Face
0likes
tests_prepare_sqlite3ParseObjectReset.c220 linesDownload Raw Back to tests
1#include "sqliteInt.h"2#include "unity.h"3#include <stdlib.h>4#include <string.h>5 6/* Globals for tracking cleanup callback activity */7static int g_cleanup_calls = 0;8static int g_cleanup_sum = 0;9static int g_cleanup_order[16];10static int g_cleanup_order_count = 0;11 12/* Cleanup callback used by ParseCleanup nodes */13static void test_cleanup_cb(sqlite3 *db, void *pPtr){14  int v = 0;15  if( pPtr ){16    v = *(int*)pPtr;17  }18  if( g_cleanup_order_count < (int)(sizeof(g_cleanup_order)/sizeof(g_cleanup_order[0])) ){19    g_cleanup_order[g_cleanup_order_count++] = v;20  }21  g_cleanup_sum += v;22  g_cleanup_calls++;23  /* Free payload memory with the same db allocator to avoid leaks */24  if( pPtr ){25    sqlite3DbFree(db, pPtr);26  }27}28 29void setUp(void) {30  g_cleanup_calls = 0;31  g_cleanup_sum = 0;32  g_cleanup_order_count = 0;33  memset(g_cleanup_order, 0, sizeof(g_cleanup_order));34}35 36void tearDown(void) {37  /* Nothing to clean here; each test cleans its own resources */38}39 40/* Helper to allocate and initialize a minimal ExprList that can be safely deleted */41static ExprList* alloc_min_exprlist(sqlite3 *db){42  ExprList *pList = (ExprList*)sqlite3DbMallocZero(db, sizeof(ExprList));43  return pList; /* nExpr==0, a==NULL is fine for sqlite3ExprListDelete */44}45 46/* Test: normal operation with all optional pointers present and two cleanup callbacks */47void test_sqlite3ParseObjectReset_cleans_and_updates_lookaside_partial(void) {48  sqlite3 *db = 0;49  TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_open(":memory:", &db));50 51  /* Allocate Parse via db allocator */52  Parse *p = (Parse*)sqlite3DbMallocZero(db, sizeof(Parse));53  TEST_ASSERT_NOT_NULL(p);54  p->db = db;55  p->nested = 0;56 57  /* Set lookaside state */58  db->lookaside.bDisable = 5;59  db->lookaside.szTrue = 321;60  db->lookaside.sz = 999;61 62  /* Prepare Parse bookkeeping */63  p->disableLookaside = 2;64  p->pOuterParse = 0;65  db->pParse = p;66 67  /* Optional pointers the function will free */68  p->aLabel = sqlite3DbMallocZero(db, 64);69  TEST_ASSERT_NOT_NULL(p->aLabel);70  p->pConstExpr = alloc_min_exprlist(db);71  TEST_ASSERT_NOT_NULL(p->pConstExpr);72#ifndef SQLITE_OMIT_SHARED_CACHE73  p->aTableLock = sqlite3DbMallocZero(db, sizeof(TableLock)*3);74  TEST_ASSERT_NOT_NULL(p->aTableLock);75#endif76 77  /* Build a pCleanup list with two nodes */78  int *v1 = (int*)sqlite3DbMallocZero(db, sizeof(int));79  int *v2 = (int*)sqlite3DbMallocZero(db, sizeof(int));80  TEST_ASSERT_NOT_NULL(v1);81  TEST_ASSERT_NOT_NULL(v2);82  *v1 = 7;83  *v2 = 9;84 85  ParseCleanup *n1 = (ParseCleanup*)sqlite3DbMallocZero(db, sizeof(ParseCleanup));86  ParseCleanup *n2 = (ParseCleanup*)sqlite3DbMallocZero(db, sizeof(ParseCleanup));87  TEST_ASSERT_NOT_NULL(n1);88  TEST_ASSERT_NOT_NULL(n2);89 90  n1->xCleanup = test_cleanup_cb;91  n1->pPtr = v1;92  n1->pNext = n2;93 94  n2->xCleanup = test_cleanup_cb;95  n2->pPtr = v2;96  n2->pNext = 0;97 98  p->pCleanup = n1;99 100  /* Call function under test */101  sqlite3ParseObjectReset(p);102 103  /* Verify cleanup callbacks executed in order and list cleared */104  TEST_ASSERT_EQUAL_INT(2, g_cleanup_calls);105  TEST_ASSERT_EQUAL_INT(2, g_cleanup_order_count);106  TEST_ASSERT_EQUAL_INT(7, g_cleanup_order[0]);107  TEST_ASSERT_EQUAL_INT(9, g_cleanup_order[1]);108  TEST_ASSERT_EQUAL_INT(16, g_cleanup_sum);109  TEST_ASSERT_NULL(p->pCleanup);110 111  /* Verify lookaside update: 5 - 2 = 3, sz should be 0 (non-zero bDisable) */112  TEST_ASSERT_EQUAL_INT(3, db->lookaside.bDisable);113  TEST_ASSERT_EQUAL_INT(0, db->lookaside.sz);114 115  /* db->pParse should be restored to pOuterParse (NULL here) */116  TEST_ASSERT_NULL(db->pParse);117 118  /* Cleanup */119  sqlite3DbFree(db, p);120  sqlite3_close(db);121}122 123/* Test: lookaside fully re-enabled (bDisable goes to 0) and outer parse restored */124void test_sqlite3ParseObjectReset_reenables_lookaside_and_restores_outer(void) {125  sqlite3 *db = 0;126  TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_open(":memory:", &db));127 128  Parse *p = (Parse*)sqlite3DbMallocZero(db, sizeof(Parse));129  Parse *outer = (Parse*)sqlite3DbMallocZero(db, sizeof(Parse));130  TEST_ASSERT_NOT_NULL(p);131  TEST_ASSERT_NOT_NULL(outer);132 133  p->db = db;134  p->nested = 0;135 136  /* lookaside initial: fully disabled by same amount as p->disableLookaside */137  db->lookaside.szTrue = 256;138  db->lookaside.bDisable = 4;139  db->lookaside.sz = 0;140 141  p->disableLookaside = 4;142  p->pOuterParse = outer;143  db->pParse = p;144 145  /* No optional pointers, no cleanup list */146  p->aLabel = 0;147  p->pConstExpr = 0;148#ifndef SQLITE_OMIT_SHARED_CACHE149  p->aTableLock = 0;150#endif151  p->pCleanup = 0;152 153  sqlite3ParseObjectReset(p);154 155  /* After reset: bDisable==0 and sz==szTrue */156  TEST_ASSERT_EQUAL_INT(0, db->lookaside.bDisable);157  TEST_ASSERT_EQUAL_INT(db->lookaside.szTrue, db->lookaside.sz);158 159  /* db->pParse set to outer */160  TEST_ASSERT_EQUAL_PTR(outer, db->pParse);161 162  /* pCleanup remains NULL */163  TEST_ASSERT_NULL(p->pCleanup);164 165  sqlite3DbFree(db, p);166  sqlite3DbFree(db, outer);167  sqlite3_close(db);168}169 170/* Test: handles NULL optional pointers, zero disableLookaside, and non-zero remaining bDisable */171void test_sqlite3ParseObjectReset_null_fields_and_no_lookaside_change(void) {172  sqlite3 *db = 0;173  TEST_ASSERT_EQUAL_INT(SQLITE_OK, sqlite3_open(":memory:", &db));174 175  Parse *p = (Parse*)sqlite3DbMallocZero(db, sizeof(Parse));176  TEST_ASSERT_NOT_NULL(p);177  p->db = db;178  p->nested = 0;179 180  /* Start with bDisable non-zero and no disableLookaside to remove */181  db->lookaside.szTrue = 128;182  db->lookaside.bDisable = 1;183  db->lookaside.sz = 0; /* non-zero disable means sz should remain 0 */184 185  p->disableLookaside = 0;186  p->pOuterParse = 0;187  db->pParse = p;188 189  /* All optional pointers NULL; no cleanup list */190  p->aLabel = 0;191  p->pConstExpr = 0;192#ifndef SQLITE_OMIT_SHARED_CACHE193  p->aTableLock = 0;194#endif195  p->pCleanup = 0;196 197  sqlite3ParseObjectReset(p);198 199  /* No change in bDisable; sz remains 0 since bDisable != 0 */200  TEST_ASSERT_EQUAL_INT(1, db->lookaside.bDisable);201  TEST_ASSERT_EQUAL_INT(0, db->lookaside.sz);202 203  /* db->pParse becomes pOuterParse (NULL) */204  TEST_ASSERT_NULL(db->pParse);205 206  /* Still no cleanup executed / list remains NULL */207  TEST_ASSERT_EQUAL_INT(0, g_cleanup_calls);208  TEST_ASSERT_NULL(p->pCleanup);209 210  sqlite3DbFree(db, p);211  sqlite3_close(db);212}213 214int main(void) {215  UNITY_BEGIN();216  RUN_TEST(test_sqlite3ParseObjectReset_cleans_and_updates_lookaside_partial);217  RUN_TEST(test_sqlite3ParseObjectReset_reenables_lookaside_and_restores_outer);218  RUN_TEST(test_sqlite3ParseObjectReset_null_fields_and_no_lookaside_change);219  return UNITY_END();220}