Parse WHERE clause — builds expression tree */
| 1307 | |
| 1308 | /* Parse WHERE clause — builds expression tree */ |
| 1309 | static int parse_where(parser_t *p, cbm_where_clause_t **out) { |
| 1310 | if (!match(p, TOK_WHERE)) { |
| 1311 | *out = NULL; |
| 1312 | return 0; |
| 1313 | } |
| 1314 | |
| 1315 | cbm_where_clause_t *w = calloc(CBM_ALLOC_ONE, sizeof(cbm_where_clause_t)); |
| 1316 | w->root = parse_or_expr(p); |
| 1317 | if (!w->root && p->error[0]) { |
| 1318 | free(w); |
| 1319 | return CBM_NOT_FOUND; |
| 1320 | } |
| 1321 | |
| 1322 | *out = w; |
| 1323 | return 0; |
| 1324 | } |
| 1325 | |
| 1326 | /* Helper: is token an aggregate function? */ |
| 1327 | static bool is_aggregate_tok(cbm_token_type_t t) { |
no test coverage detected