49 #define DEBUG DEBUG_NONE 53 static char error_message[DB_ERROR_BUF_SIZE];
54 static int error_line;
55 static const char *error_function;
56 #define RETURN(value) \ 58 if(error_message[0] == '\0') { \ 59 strncpy(error_message, lexer->input, sizeof(error_message) - 1); \ 60 error_line = __LINE__; \ 61 error_function = __func__; \ 65 #define RESET_ERROR() \ 67 error_message[0] = '\0'; \ 69 error_function = NULL; \ 72 #define RETURN(value) return (value) 75 #define PARSER(name) \ 77 parse_##name(lexer_t *lexer) 78 #define PARSER_ARG(name, arg) \ 80 parse_##name(lexer_t *lexer, arg) 81 #define PARSER_TOKEN(name) \ 83 parse_##name(lexer_t *lexer) 85 !AQL_ERROR(parse_##name(lexer)) 86 #define PARSE_TOKEN(name) \ 89 #define NEXT lexer_next(lexer) 90 #define REWIND lexer_rewind(lexer); RESET_ERROR() 91 #define TOKEN *lexer->token 92 #define VALUE *lexer->value 94 #define CONSUME(token) \ 97 if(TOKEN != (token)) { \ 98 RETURN(SYNTAX_ERROR); \ 103 static aql_adt_t *adt;
107 static lvm_instance_t p;
108 static unsigned char vmcode[DB_VM_BYTECODE_SIZE];
142 PARSER_TOKEN(aggregator)
161 aql_aggregator_t
function;
163 token = PARSE_TOKEN(aggregator);
167 function = AQL_COUNT;
176 function = AQL_MEDIAN;
185 RETURN(SYNTAX_ERROR);
188 AQL_SET_FLAG(adt, AQL_FLAG_AGGREGATE);
190 PRINTF(
"aggregator: %d\n", TOKEN);
196 AQL_ADD_AGGREGATE(adt,
function, VALUE);
197 PRINTF(
"aggregated attribute: %s\n", VALUE);
199 CONSUME(RIGHT_PAREN);
200 goto check_more_attributes;
209 AQL_ADD_ATTRIBUTE(adt, VALUE, DOMAIN_UNSPECIFIED, 0);
211 check_more_attributes:
214 if(!PARSE(attributes)) {
215 RETURN(SYNTAX_ERROR);
229 AQL_ADD_RELATION(adt, VALUE);
232 if(!PARSE(relations)) {
233 RETURN(SYNTAX_ERROR);
248 AQL_ADD_VALUE(adt, DOMAIN_STRING, VALUE);
251 AQL_ADD_VALUE(adt, DOMAIN_INT, VALUE);
254 RETURN(SYNTAX_ERROR);
259 return PARSE(values);
272 if(LVM_ERROR(lvm_register_variable(VALUE, LVM_LONG)) ||
273 LVM_ERROR(lvm_set_variable(&p, VALUE))) {
274 RETURN(SYNTAX_ERROR);
276 AQL_ADD_PROCESSING_ATTRIBUTE(adt, VALUE);
283 if(LVM_ERROR(lvm_set_long(&p, *(
long *)lexer->value))) {
284 RETURN(SYNTAX_ERROR);
288 RETURN(SYNTAX_ERROR);
300 saved_end = lvm_get_end(&p);
303 if(TOKEN == LEFT_PAREN) {
305 RETURN(SYNTAX_ERROR);
307 CONSUME(RIGHT_PAREN);
310 if(!PARSE(operand)) {
311 RETURN(SYNTAX_ERROR);
316 token = PARSE_TOKEN(op);
318 saved_end = lvm_get_end(&p);
321 }
else if (token == RIGHT_PAREN) {
325 if(!PARSE(operand) && !PARSE(expr)) {
326 RETURN(SYNTAX_ERROR);
329 saved_end = lvm_shift_for_operator(&p, saved_end);
345 RETURN(SYNTAX_ERROR);
347 if(LVM_ERROR(lvm_set_op(&p, op))) {
348 RETURN(SYNTAX_ERROR);
350 lvm_set_end(&p, saved_end);
362 saved_end = lvm_jump_to_operand(&p);
365 RETURN(SYNTAX_ERROR);
368 saved_end = lvm_set_end(&p, saved_end);
370 token = PARSE_TOKEN(cmp);
372 RETURN(SYNTAX_ERROR);
395 RETURN(SYNTAX_ERROR);
398 if(LVM_ERROR(lvm_set_relation(&p, rel))) {
399 RETURN(SYNTAX_ERROR);
401 lvm_set_end(&p, saved_end);
404 RETURN(SYNTAX_ERROR);
413 operator_t connective;
416 if(!PARSE(comparison)) {
417 RETURN(SYNTAX_ERROR);
425 if(TOKEN != AND && TOKEN != OR) {
430 connective = TOKEN == AND ? LVM_AND : LVM_OR;
432 saved_end = lvm_shift_for_operator(&p, saved_end);
433 if(LVM_ERROR(lvm_set_relation(&p, connective))) {
434 RETURN(SYNTAX_ERROR);
436 lvm_set_end(&p, saved_end);
439 if(TOKEN == LEFT_PAREN) {
442 RETURN(SYNTAX_ERROR);
444 CONSUME(RIGHT_PAREN);
447 r = PARSE(comparison);
461 AQL_SET_TYPE(adt, AQL_TYPE_JOIN);
465 PRINTF(
"Left relation: %s\n", VALUE);
466 AQL_ADD_RELATION(adt, VALUE);
471 PRINTF(
"Right relation: %s\n", VALUE);
472 AQL_ADD_RELATION(adt, VALUE);
477 PRINTF(
"Join on attribute %s\n", VALUE);
478 AQL_ADD_ATTRIBUTE(adt, VALUE, DOMAIN_UNSPECIFIED, 0);
483 if(!PARSE(attributes)) {
484 RETURN(SYNTAX_ERROR);
494 AQL_SET_TYPE(adt, AQL_TYPE_SELECT);
497 if(!PARSE(attributes)) {
498 RETURN(SYNTAX_ERROR);
502 if(!PARSE(relations)) {
503 RETURN(SYNTAX_ERROR);
508 lvm_reset(&p, vmcode,
sizeof(vmcode));
511 RETURN(SYNTAX_ERROR);
514 AQL_SET_CONDITION(adt, &p);
527 AQL_SET_TYPE(adt, AQL_TYPE_INSERT);
532 RETURN(SYNTAX_ERROR);
535 CONSUME(RIGHT_PAREN);
538 if(!PARSE(relations)) {
539 RETURN(SYNTAX_ERROR);
545 PARSER(remove_attribute)
547 AQL_SET_TYPE(adt, AQL_TYPE_REMOVE_ATTRIBUTE);
550 AQL_ADD_RELATION(adt, VALUE);
555 PRINTF(
"Removing the index for the attribute %s\n", VALUE);
556 AQL_ADD_ATTRIBUTE(adt, VALUE, DOMAIN_UNSPECIFIED, 0);
561 #if DB_FEATURE_REMOVE 564 AQL_SET_TYPE(adt, AQL_TYPE_REMOVE_TUPLES);
567 AQL_SET_FLAG(adt, AQL_FLAG_ASSIGN);
568 AQL_ADD_RELATION(adt, REMOVE_RELATION);
571 AQL_ADD_RELATION(adt, VALUE);
575 lvm_reset(&p, vmcode,
sizeof(vmcode));
576 AQL_SET_CONDITION(adt, &p);
585 AQL_SET_TYPE(adt, AQL_TYPE_REMOVE_INDEX);
588 AQL_ADD_RELATION(adt, VALUE);
593 PRINTF(
"remove index: %s\n", VALUE);
594 AQL_ADD_ATTRIBUTE(adt, VALUE, DOMAIN_UNSPECIFIED, 0);
599 PARSER(remove_relation)
601 AQL_SET_TYPE(adt, AQL_TYPE_REMOVE_RELATION);
604 PRINTF(
"remove relation: %s\n", VALUE);
605 AQL_ADD_RELATION(adt, VALUE);
617 r = PARSE(remove_attribute);
619 #if DB_FEATURE_REMOVE 621 r = PARSE(remove_from);
625 r = PARSE(remove_index);
628 r = PARSE(remove_relation);
631 RETURN(SYNTAX_ERROR);
635 RETURN(SYNTAX_ERROR);
643 PARSER_TOKEN(index_type)
653 type = INDEX_MAXHEAP;
656 type = INDEX_MEMHASH;
662 AQL_SET_INDEX_TYPE(adt, type);
668 AQL_SET_TYPE(adt, AQL_TYPE_CREATE_INDEX);
671 AQL_ADD_RELATION(adt, VALUE);
676 PRINTF(
"Creating an index for the attribute %s\n", VALUE);
677 AQL_ADD_ATTRIBUTE(adt, VALUE, DOMAIN_UNSPECIFIED, 0);
681 if(PARSE_TOKEN(index_type) == NONE) {
682 RETURN(SYNTAX_ERROR);
688 PARSER(create_relation)
692 AQL_SET_TYPE(adt, AQL_TYPE_CREATE_RELATION);
693 AQL_ADD_RELATION(adt, VALUE);
698 PARSER_ARG(domain,
char *name)
701 unsigned element_size;
706 domain = DOMAIN_STRING;
710 CONSUME(INTEGER_VALUE);
711 element_size = *(
long *)lexer->value;
712 CONSUME(RIGHT_PAREN);
716 domain = DOMAIN_LONG;
727 AQL_ADD_ATTRIBUTE(adt, name, domain, element_size);
732 PARSER(create_attributes)
735 char name[ATTRIBUTE_NAME_LENGTH];
737 AQL_SET_TYPE(adt, AQL_TYPE_CREATE_ATTRIBUTE);
741 strncpy(name, VALUE,
sizeof(name) - 1);
742 name[
sizeof(name) - 1] =
'\0';
746 r = parse_domain(lexer, name);
754 AQL_ADD_RELATION(adt, VALUE);
766 r = PARSE(create_attributes);
769 r = PARSE(create_index);
772 r = PARSE(create_relation);
775 RETURN(SYNTAX_ERROR);
779 RETURN(SYNTAX_ERROR);
788 aql_parse(aql_adt_t *external_adt,
char *input_string)
791 token_t token = NONE;
797 PRINTF(
"Parsing \"%s\"\n", input_string);
801 AQL_SET_CONDITION(adt, NULL);
803 lexer_start(&lex, input_string, &token, &value);
805 result = lexer_next(&lex);
806 if(!AQL_ERROR(result)) {
809 PRINTF(
"Assign the result to relation %s\n", *lex.value);
810 AQL_ADD_RELATION(adt, *lex.value);
811 AQL_SET_FLAG(adt, AQL_FLAG_ASSIGN);
812 if(AQL_ERROR(lexer_next(&lex))) {
813 result = SYNTAX_ERROR;
816 if(*lex.token != ASSIGN) {
817 result = SYNTAX_ERROR;
820 if(AQL_ERROR(lexer_next(&lex))) {
821 result = SYNTAX_ERROR;
826 result = parse_select(&lex);
829 result = parse_join(&lex);
832 result = SYNTAX_ERROR;
836 result = parse_join(&lex);
839 result = parse_create(&lex);
842 result = parse_remove(&lex);
845 result = parse_insert(&lex);
848 result = parse_select(&lex);
856 result = SYNTAX_ERROR;
860 if(AQL_ERROR(result)) {
861 PRINTF(
"Error in function %s, line %d: input \"%s\"\n",
862 error_function, error_line, error_message);
A set of debugging macros.
Definitions and declarations for AQL, the Antelope Query Language.
Definitions for attributes.
Database configuration options.
Definitions and declarations for the Propositional Logic Engine.