Parse a chain of MATCH / OPTIONAL MATCH patterns into query. * Returns -1 on error (fills p->error). */
| 1768 | /* Parse a chain of MATCH / OPTIONAL MATCH patterns into query. |
| 1769 | * Returns -1 on error (fills p->error). */ |
| 1770 | static int parse_match_chain(parser_t *p, cbm_query_t *q, int *pat_cap) { |
| 1771 | while (check(p, TOK_MATCH) || check(p, TOK_OPTIONAL)) { |
| 1772 | bool opt = false; |
| 1773 | if (check(p, TOK_OPTIONAL)) { |
| 1774 | advance(p); |
| 1775 | opt = true; |
| 1776 | } |
| 1777 | if (!expect(p, TOK_MATCH)) { |
| 1778 | break; |
| 1779 | } |
| 1780 | if (q->pattern_count >= *pat_cap) { |
| 1781 | *pat_cap *= PAIR_LEN; |
| 1782 | q->patterns = safe_realloc(q->patterns, *pat_cap * sizeof(cbm_pattern_t)); |
| 1783 | q->pattern_optional = safe_realloc(q->pattern_optional, *pat_cap * sizeof(bool)); |
| 1784 | } |
| 1785 | if (parse_match_pattern(p, &q->patterns[q->pattern_count]) < 0) { |
| 1786 | return CBM_NOT_FOUND; |
| 1787 | } |
| 1788 | q->pattern_optional[q->pattern_count] = opt; |
| 1789 | q->pattern_count++; |
| 1790 | } |
| 1791 | return 0; |
| 1792 | } |
| 1793 | |
| 1794 | /* Parse post-WHERE clauses: additional MATCH, WITH, RETURN, UNION */ |
| 1795 | static int parse_post_where(parser_t *p, cbm_query_t *q, // NOLINT(misc-no-recursion) |
no test coverage detected