359 #define _error_missing_path "expected path " _error_context |
359 #define _error_missing_path "expected path " _error_context |
360 #define _error_missing_from "expecting FROM keyword " _error_context |
360 #define _error_missing_from "expecting FROM keyword " _error_context |
361 #define _error_missing_by "expecting BY keyword " _error_context |
361 #define _error_missing_by "expecting BY keyword " _error_context |
362 #define _error_invalid_depth "invalid depth " _error_context |
362 #define _error_invalid_depth "invalid depth " _error_context |
363 #define _error_missing_expr "missing expression " _error_context |
363 #define _error_missing_expr "missing expression " _error_context |
|
364 #define _error_invalid_expr "invalid expression " _error_context |
364 #define _error_invalid_unary_op "invalid unary operator " _error_context |
365 #define _error_invalid_unary_op "invalid unary operator " _error_context |
365 #define _error_invalid_fmtspec "invalid format specifier " _error_context |
366 #define _error_invalid_fmtspec "invalid format specifier " _error_context |
366 |
367 |
367 #define token_sstr(token) (((DavQLToken*)(token)->data)->value) |
368 #define token_sstr(token) (((DavQLToken*)(token)->data)->value) |
368 |
369 |
561 |
562 |
562 char *op; |
563 char *op; |
563 if (token_is(token, DAVQL_TOKEN_OPERATOR) && |
564 if (token_is(token, DAVQL_TOKEN_OPERATOR) && |
564 (op = strchr(opc, token_sstr(token).ptr[0]))) { |
565 (op = strchr(opc, token_sstr(token).ptr[0]))) { |
565 expr->op = opv[op-opc]; |
566 expr->op = opv[op-opc]; |
|
567 expr->type = DAVQL_BINARY; |
566 total_consumed++; |
568 total_consumed++; |
567 token = token->next; |
569 token = token->next; |
568 memset(&right, 0, sizeof(DavQLExpression)); |
570 memset(&right, 0, sizeof(DavQLExpression)); |
569 consumed = parseR(stmt, token, &right); |
571 consumed = parseR(stmt, token, &right); |
570 if (!consumed) { |
572 if (!consumed) { |
731 total_consumed++; token = token->next; |
733 total_consumed++; token = token->next; |
732 DavQLExpression * expr = calloc(sizeof(DavQLExpression), 1); |
734 DavQLExpression * expr = calloc(sizeof(DavQLExpression), 1); |
733 consumed = dav_parse_expression(stmt, token, expr); |
735 consumed = dav_parse_expression(stmt, token, expr); |
734 if (expr->type == DAVQL_UNDEFINED_TYPE) { |
736 if (expr->type == DAVQL_UNDEFINED_TYPE) { |
735 dav_free_expression(expr); |
737 dav_free_expression(expr); |
|
738 consumed = 0; |
|
739 dav_error_in_context(DAVQL_ERROR_INVALID_EXPR, |
|
740 _error_invalid_expr, stmt, token); |
736 } else { |
741 } else { |
737 DavQLField *field = malloc(sizeof(DavQLField)); |
742 DavQLField *field = malloc(sizeof(DavQLField)); |
738 field->expr = expr; |
743 field->expr = expr; |
739 field->name = expr->srctext; |
744 field->name = expr->srctext; |
740 stmt->fields = ucx_list_append(stmt->fields, field); |
745 stmt->fields = ucx_list_append(stmt->fields, field); |
829 static void dav_parse_get_statement(DavQLStatement *stmt, UcxList *tokens) { |
834 static void dav_parse_get_statement(DavQLStatement *stmt, UcxList *tokens) { |
830 stmt->type = DAVQL_GET; |
835 stmt->type = DAVQL_GET; |
831 |
836 |
832 // Consume field list |
837 // Consume field list |
833 tokens = ucx_list_get(tokens, dav_parse_fieldlist(stmt, tokens)); |
838 tokens = ucx_list_get(tokens, dav_parse_fieldlist(stmt, tokens)); |
|
839 if (stmt->errorcode) { |
|
840 return; |
|
841 } |
834 |
842 |
835 // Consume from keyword |
843 // Consume from keyword |
836 if (token_is(tokens, DAVQL_TOKEN_KEYWORD) |
844 if (token_is(tokens, DAVQL_TOKEN_KEYWORD) |
837 && tokenvalue_is(tokens, "from")) { |
845 && tokenvalue_is(tokens, "from")) { |
838 tokens = tokens->next; |
846 tokens = tokens->next; |