Team Ai
Modelpublic

AryaWu/sqlite

sourceHugging Faceupdated 10mo agoView on Hugging Face
0likes
tests_expr_exprCodeVector.c160 linesDownload Raw Back to tests
1#include "sqliteInt.h"2#include "unity.h"3#include <string.h>4#include <stdlib.h>5 6/* Prototype of the wrapper added in the module */7int test_exprCodeVector(Parse *pParse, Expr *p, int *piFreeable);8 9static void initParse(sqlite3 **pDb, Parse *pParse){10  int rc = sqlite3_open(":memory:", pDb);11  TEST_ASSERT_EQUAL_INT(SQLITE_OK, rc);12  memset(pParse, 0, sizeof(*pParse));13  pParse->db = *pDb;14  pParse->okConstFactor = 0; /* ensure constants are not factored to init */15  Vdbe *v = sqlite3VdbeCreate(pParse);16  TEST_ASSERT_NOT_NULL(v);17  pParse->pVdbe = v;18}19 20static void cleanupParse(sqlite3 *db, Parse *pParse){21  if( pParse->pVdbe ){22    sqlite3VdbeDelete(pParse->pVdbe);23    pParse->pVdbe = 0;24  }25  if( db ){26    sqlite3_close(db);27  }28}29 30static Expr* makeIntExpr(sqlite3 *db, const char *z){31  Expr *p = sqlite3Expr(db, TK_INTEGER, z);32  TEST_ASSERT_NOT_NULL(p);33  return p;34}35 36static ExprList* makeIntExprList(Parse *pParse, const char **vals, int nVals){37  ExprList *pList = 0;38  for(int i=0; i<nVals; i++){39    Expr *pE = makeIntExpr(pParse->db, vals[i]);40    pList = sqlite3ExprListAppend(pParse, pList, pE);41    TEST_ASSERT_NOT_NULL(pList);42  }43  return pList;44}45 46static Expr* makeVectorExpr(Parse *pParse, ExprList *pList){47  Expr *p = sqlite3ExprAlloc(pParse->db, TK_VECTOR, 0, 0);48  TEST_ASSERT_NOT_NULL(p);49  p->x.pList = pList; /* vector elements */50  return p;51}52 53static Expr* makeSelectVectorExpr(Parse *pParse, ExprList *pEList){54  /* Create a minimal Select object with just an expression list of constants */55  Select *pSel = (Select*)sqlite3DbMallocZero(pParse->db, sizeof(Select));56  TEST_ASSERT_NOT_NULL(pSel);57  pSel->pEList = pEList;58 59  Expr *p = sqlite3ExprAlloc(pParse->db, TK_SELECT, 0, 0);60  TEST_ASSERT_NOT_NULL(p);61  p->x.pSelect = pSel;62  return p;63}64 65void setUp(void) {66  /* empty */67}68 69void tearDown(void) {70  /* empty */71}72 73/* Test: nResult==1 (scalar), should use sqlite3ExprCodeTemp:74** - returns a temporary register75** - piFreeable equals returned register76*/77void test_exprCodeVector_scalar_temp_register(void){78  sqlite3 *db = 0;79  Parse parse;80  initParse(&db, &parse);81 82  Expr *pScalar = makeIntExpr(db, "7");83  int freeable = -1;84  int beforeMem = parse.nMem;85 86  int reg = test_exprCodeVector(&parse, pScalar, &freeable);87 88  TEST_ASSERT_TRUE(reg > 0);89  TEST_ASSERT_EQUAL_INT(reg, freeable);90  /* nMem may increase due to temp regs and subroutines; ensure non-negative */91  TEST_ASSERT_TRUE(parse.nMem >= beforeMem);92 93  sqlite3ExprDelete(db, pScalar);94  cleanupParse(db, &parse);95}96 97/* Test: nResult>1, non-select vector (TK_VECTOR with 2 elements)98** - returns first of a new block of nResult registers (nMem+1 before call)99** - piFreeable==0100** - nMem grows by at least nResult101*/102void test_exprCodeVector_vector_list_two_elements(void){103  sqlite3 *db = 0;104  Parse parse;105  initParse(&db, &parse);106 107  const char *vals[2] = { "1", "2" };108  ExprList *pList = makeIntExprList(&parse, vals, 2);109  Expr *pVec = makeVectorExpr(&parse, pList);110 111  int freeable = -1;112  int beforeMem = parse.nMem;113  int reg = test_exprCodeVector(&parse, pVec, &freeable);114 115  TEST_ASSERT_TRUE(reg > 0);116  TEST_ASSERT_EQUAL_INT(0, freeable);117  TEST_ASSERT_EQUAL_INT(beforeMem + 1, reg);118  TEST_ASSERT_TRUE(parse.nMem >= beforeMem + 2);119 120  sqlite3ExprDelete(db, pVec); /* also frees pList and contained exprs */121  cleanupParse(db, &parse);122}123 124/* Test: nResult>1, select vector (TK_SELECT with 2 result columns)125** - forces sqlite3CodeSubselect path126** - returns register index equal to pExpr->iTable127** - piFreeable==0128** - nMem grows by at least number of columns129*/130void test_exprCodeVector_select_two_columns(void){131  sqlite3 *db = 0;132  Parse parse;133  initParse(&db, &parse);134 135  const char *vals[2] = { "5", "6" };136  ExprList *pEList = makeIntExprList(&parse, vals, 2);137  Expr *pSelExpr = makeSelectVectorExpr(&parse, pEList);138 139  int freeable = -1;140  int beforeMem = parse.nMem;141 142  int reg = test_exprCodeVector(&parse, pSelExpr, &freeable);143 144  TEST_ASSERT_TRUE(reg > 0);145  TEST_ASSERT_EQUAL_INT(0, freeable);146  TEST_ASSERT_EQUAL_INT(reg, pSelExpr->iTable);147  TEST_ASSERT_TRUE(parse.nMem >= beforeMem + 2);148  TEST_ASSERT_EQUAL_INT(0, parse.nErr);149 150  sqlite3ExprDelete(db, pSelExpr); /* also frees Select and EList */151  cleanupParse(db, &parse);152}153 154int main(void) {155  UNITY_BEGIN();156  RUN_TEST(test_exprCodeVector_scalar_temp_register);157  RUN_TEST(test_exprCodeVector_vector_list_two_elements);158  RUN_TEST(test_exprCodeVector_select_two_columns);159  return UNITY_END();160}