@@ -266,40 +266,65 @@ xdb_parse_limit (xdb_conn_t* pConn, xdb_stmt_select_t *pStmt, xdb_token_t *pTkn)
266
266
return - XDB_E_STMT ;
267
267
}
268
268
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
+
269
279
XDB_STATIC int
270
280
xdb_parse_where (xdb_conn_t * pConn , xdb_stmt_select_t * pStmt , xdb_token_t * pTkn )
271
281
{
272
- uint8_t bmp [8 ];
282
+ uint8_t bmp [8 ];
273
283
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
+
277
291
do {
278
292
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 ;
281
312
}
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 );
284
315
xdb_filter_t * pFilter = & pStmt -> filters [pStmt -> filter_count ];
285
316
pStmt -> pFilters [pStmt -> filter_count ++ ] = pFilter ;
286
317
//pFilter->fld_off = pField->fld_off;
287
318
//pFilter->fld_type = pField->fld_type;
288
319
xdb_field_t * pField = & pStmt -> pTblm -> pFields [fld_id ];
289
320
pFilter -> pField = pField ;
290
321
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 )) {
294
323
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 ;
299
324
}
300
- type = xdb_next_token ( pTkn ) ;
325
+ pFilter -> cmp_op = op ;
301
326
302
- if (xdb_unlikely (XDB_TOK_QM == type )) {
327
+ if (xdb_unlikely (XDB_TOK_QM == vtype )) {
303
328
pFilter -> val .fld_type = pField -> fld_type ;
304
329
pFilter -> val .val_type = pField -> sup_type ;
305
330
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)
309
334
case XDB_TYPE_BIGINT :
310
335
case XDB_TYPE_TINYINT :
311
336
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 );
313
339
pFilter -> val .val_type = XDB_TYPE_BIGINT ;
314
340
//xdb_print ("%s = %d\n", pField->fld_name.str, pFilter->val.ival);
315
341
break ;
316
342
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 ;
319
346
pFilter -> val .val_type = XDB_TYPE_CHAR ;
320
347
//xdb_print ("%s = %s\n", pField->fld_name.str, pFilter->val.str.ptr);
321
348
break ;
322
349
case XDB_TYPE_FLOAT :
323
350
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 );
325
353
pFilter -> val .val_type = XDB_TYPE_DOUBLE ;
326
354
//xdb_print ("%s = %d\n", pField->fld_name.str, pFilter->val.ival);
327
355
break ;
0 commit comments