AryaWu/sqlite
0
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}