Skip to content

Commit fb5d2aa

Browse files
committed
Parser errors with inequalities #13
1 parent c6400b1 commit fb5d2aa

File tree

6 files changed

+60
-24
lines changed

6 files changed

+60
-24
lines changed

Makefile

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ help:
1313

1414
.PHONY: build
1515
build:
16-
mkdir -p build
1716
$(CC) -o build/libcrossdb.so -fPIC -shared -lpthread -O2 src/crossdb.c
1817
$(CC) -o build/xdb-cli src/xdb-cli.c -lpthread -O2
1918
cp include/crossdb.h build/

src/core/xdb_conn.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ xdb_conn_init (xdb_conn_t* pConn)
2424
pConn->bAutoCommit = true;
2525
pConn->conn_stdout = stdout;
2626
xdb_lv2bmp_init (&pConn->dbTrans_bmp);
27+
xdb_atomic_inc (&s_xdb_conn_count);
2728
}
2829

2930
xdb_conn_t*
@@ -50,7 +51,6 @@ xdb_open (const char *dbpath)
5051
}
5152
}
5253

53-
xdb_atomic_inc (&s_xdb_conn_count);
5454
return pConn;
5555
}
5656

@@ -77,7 +77,7 @@ xdb_close (xdb_conn_t* pConn)
7777

7878
xdb_atomic_dec (&s_xdb_conn_count);
7979

80-
if (0 == s_xdb_conn_count) {
80+
if (1 == s_xdb_conn_count) {
8181
xdb_exit ();
8282
}
8383
}

src/core/xdb_sysdb.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,3 +224,10 @@ xdb_sysdb_init ()
224224

225225
return XDB_OK;
226226
}
227+
228+
XDB_STATIC void
229+
xdb_sysdb_exit ()
230+
{
231+
xdb_close (s_xdb_sysdb_pConn);
232+
s_xdb_sysdb_pConn = NULL;
233+
}

src/crossdb.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ xdb_exit ()
103103
// Close all opened DBs
104104
s_xdb_bInit = false;
105105
xdb_close_all_db (NULL);
106+
xdb_sysdb_exit ();
106107

107108
return XDB_OK;
108109
}

src/parser/xdb_parser_dml.c

Lines changed: 49 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -266,40 +266,65 @@ xdb_parse_limit (xdb_conn_t* pConn, xdb_stmt_select_t *pStmt, xdb_token_t *pTkn)
266266
return -XDB_E_STMT;
267267
}
268268

269+
270+
static xdb_op_t s_xdb_op_opposite[] = {
271+
[XDB_OP_EQ] = XDB_OP_EQ,
272+
[XDB_OP_NE] = XDB_OP_NE,
273+
[XDB_OP_LT] = XDB_OP_GT,
274+
[XDB_OP_GT] = XDB_OP_LT,
275+
[XDB_OP_LE] = XDB_OP_GE,
276+
[XDB_OP_GE] = XDB_OP_LE,
277+
};
278+
269279
XDB_STATIC int
270280
xdb_parse_where (xdb_conn_t* pConn, xdb_stmt_select_t *pStmt, xdb_token_t *pTkn)
271281
{
272-
uint8_t bmp[8];
282+
uint8_t bmp[8];
273283
xdb_tblm_t *pTblm = pStmt->pTblm;
274-
memset (bmp, 0 , sizeof(bmp));
275-
xdb_token_type type;
276-
284+
memset (bmp, 0, sizeof(bmp));
285+
xdb_token_type type;
286+
xdb_token_type vtype;
287+
int vlen, flen;
288+
xdb_op_t op;
289+
char *pVal, *pFldName;
290+
277291
do {
278292
type = xdb_next_token (pTkn);
279-
if (XDB_TOK_ID != type) {
280-
break;
293+
if (xdb_likely (XDB_TOK_ID == type)) {
294+
pFldName = pTkn->token;
295+
flen = pTkn->tk_len;
296+
op = xdb_next_token (pTkn);
297+
XDB_EXPECT (op >= XDB_OP_EQ && op <= XDB_OP_NE, XDB_E_STMT, "Unsupported operator");
298+
vtype = xdb_next_token (pTkn);
299+
pVal = pTkn->token;
300+
vlen = pTkn->tk_len;
301+
} else {
302+
vtype = type;
303+
pVal = pTkn->token;
304+
vlen = pTkn->tk_len;
305+
op = xdb_next_token (pTkn);
306+
XDB_EXPECT (op >= XDB_OP_EQ && op <= XDB_OP_NE, XDB_E_STMT, "Unsupported operator");
307+
op = s_xdb_op_opposite[op];
308+
type = xdb_next_token (pTkn);
309+
XDB_EXPECT (XDB_TOK_ID == type, XDB_E_STMT, "One val must be field");
310+
pFldName = pTkn->token;
311+
flen = pTkn->tk_len;
281312
}
282-
int fld_id = xdb_find_field (pStmt->pTblm, pTkn->token, pTkn->tk_len);
283-
XDB_EXPECT (fld_id>=0, XDB_E_STMT, "Can't find field '%s'", pTkn->token);
313+
int fld_id = xdb_find_field (pStmt->pTblm, pFldName, flen);
314+
XDB_EXPECT (fld_id>=0, XDB_E_STMT, "Can't find field '%s'", pFldName);
284315
xdb_filter_t *pFilter = &pStmt->filters[pStmt->filter_count];
285316
pStmt->pFilters[pStmt->filter_count++] = pFilter;
286317
//pFilter->fld_off = pField->fld_off;
287318
//pFilter->fld_type = pField->fld_type;
288319
xdb_field_t *pField = &pStmt->pTblm->pFields[fld_id];
289320
pFilter->pField = pField;
290321

291-
type = xdb_next_token (pTkn);
292-
//XDB_EXPECT (XDB_TOK_EQ == type, XDB_E_STMT, "Miss =");
293-
if (xdb_likely (XDB_TOK_EQ == type)) {
322+
if (xdb_likely (XDB_OP_EQ == op)) {
294323
bmp[fld_id>>3] |= (1<<(fld_id&7));
295-
pFilter->cmp_op = XDB_OP_EQ;
296-
} else {
297-
XDB_EXPECT (type > XDB_TOK_EQ && type <= XDB_TOK_NE, XDB_E_STMT, "Unsupported operator");
298-
pFilter->cmp_op = type;
299324
}
300-
type = xdb_next_token (pTkn);
325+
pFilter->cmp_op = op;
301326

302-
if (xdb_unlikely (XDB_TOK_QM == type)) {
327+
if (xdb_unlikely (XDB_TOK_QM == vtype)) {
303328
pFilter->val.fld_type = pField->fld_type;
304329
pFilter->val.val_type = pField->sup_type;
305330
pStmt->pBind[pStmt->bind_count++] = &pFilter->val;
@@ -309,19 +334,22 @@ xdb_parse_where (xdb_conn_t* pConn, xdb_stmt_select_t *pStmt, xdb_token_t *pTkn)
309334
case XDB_TYPE_BIGINT:
310335
case XDB_TYPE_TINYINT:
311336
case XDB_TYPE_SMALLINT:
312-
pFilter->val.ival = atoll (pTkn->token);
337+
XDB_EXPECT (XDB_TOK_NUM == vtype, XDB_E_STMT, "Expect Value");
338+
pFilter->val.ival = atoll (pVal);
313339
pFilter->val.val_type = XDB_TYPE_BIGINT;
314340
//xdb_print ("%s = %d\n", pField->fld_name.str, pFilter->val.ival);
315341
break;
316342
case XDB_TYPE_CHAR:
317-
pFilter->val.str.len = pTkn->tk_len;
318-
pFilter->val.str.ptr = pTkn->token;
343+
XDB_EXPECT (XDB_TOK_STR == vtype, XDB_E_STMT, "Expect Value");
344+
pFilter->val.str.len = vlen;
345+
pFilter->val.str.ptr = pVal;
319346
pFilter->val.val_type = XDB_TYPE_CHAR;
320347
//xdb_print ("%s = %s\n", pField->fld_name.str, pFilter->val.str.ptr);
321348
break;
322349
case XDB_TYPE_FLOAT:
323350
case XDB_TYPE_DOUBLE:
324-
pFilter->val.fval = atof (pTkn->token);
351+
XDB_EXPECT (XDB_TOK_NUM == vtype, XDB_E_STMT, "Expect Value");
352+
pFilter->val.fval = atof (pVal);
325353
pFilter->val.val_type = XDB_TYPE_DOUBLE;
326354
//xdb_print ("%s = %d\n", pField->fld_name.str, pFilter->val.ival);
327355
break;

src/parser/xdb_stmt.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ typedef enum xdb_op_t {
212212
XDB_OP_GT = XDB_TOK_GT, // >
213213
XDB_OP_GE = XDB_TOK_GE, // >=
214214
XDB_OP_NE = XDB_TOK_NE, // != <>
215+
XDB_OP_MAX = XDB_OP_NE,
215216
XDB_OP_ADD = XDB_TOK_ADD,
216217
XDB_OP_SUB = XDB_TOK_SUB,
217218
XDB_OP_MUL = XDB_TOK_MUL,

0 commit comments

Comments
 (0)