Parse a chain of MATCH / OPTIONAL MATCH patterns into query. * Returns -1 on error (fills p->error). */
| 1926 | /* Parse a chain of MATCH / OPTIONAL MATCH patterns into query. |
| 1927 | * Returns -1 on error (fills p->error). */ |
| 1928 | static int parse_match_chain(parser_t *p, cbm_query_t *q, int *pat_cap) { |
| 1929 | while (check(p, TOK_MATCH) || check(p, TOK_OPTIONAL)) { |
| 1930 | bool opt = false; |
| 1931 | if (check(p, TOK_OPTIONAL)) { |
| 1932 | advance(p); |
| 1933 | opt = true; |
| 1934 | } |
| 1935 | if (!expect(p, TOK_MATCH)) { |
| 1936 | break; |
| 1937 | } |
| 1938 | if (q->pattern_count >= *pat_cap) { |
| 1939 | *pat_cap *= PAIR_LEN; |
| 1940 | q->patterns = safe_realloc(q->patterns, *pat_cap * sizeof(cbm_pattern_t)); |
| 1941 | q->pattern_optional = safe_realloc(q->pattern_optional, *pat_cap * sizeof(bool)); |
| 1942 | } |
| 1943 | if (parse_match_pattern(p, &q->patterns[q->pattern_count]) < 0) { |
| 1944 | return CBM_NOT_FOUND; |
| 1945 | } |
| 1946 | q->pattern_optional[q->pattern_count] = opt; |
| 1947 | q->pattern_count++; |
| 1948 | } |
| 1949 | return 0; |
| 1950 | } |
| 1951 | |
| 1952 | /* Parse post-WHERE clauses: additional MATCH, WITH, RETURN, UNION */ |
| 1953 | static int parse_post_where(parser_t *p, cbm_query_t *q, // NOLINT(misc-no-recursion) |
no test coverage detected