The language for DuroDBMS expressions is a dialect of Tutorial D, as defined in TTM, third edition and Database Explorations, with a number of differences. The most important are:
expression = project | where | rename | dyadic_relation_op_inv | extend | update | summarize | divideby | wrap | unwrap | group | ungroup | expression OR expression | expression AND expression | expression XOR expression | NOT expression | rel_expression | '+' expression | '-' expression | expression '+' expression | expression '-' expression | expression '||' expression | expression '*' expression | expression '/' expression | expression '%' expression | var_expression | literal | count_inv | agg_op_inv | '(' expression ')' | id FROM expression | TUPLE FROM expression | ifthenelse | with.
var_expression = [expression '.'] id | ro_op_inv | array_subscript_inv. ro_op_inv = [expression '.'] id '(' [expression {',' expression}] ')'. array_subscript_inv = expression '[' expression ']'. project = expression '{' [ALL BUT] [id {',' id}] '}'. where = expression WHERE expression. rename = expression RENAME '{' [id AS id {',' id AS id}] '}'. dyadic_relation_op_inv = expression UNION expression | expression D_UNION expression | expression INTERSECT expression | expression MINUS expression | expression SEMIMINUS expression | expression JOIN expression | expression SEMIJOIN expression | expression MATCHING expression | expression NOT MATCHING expression. extend = EXTEND expression ':' '{' [id ':=' expression {',' id ':=' expression}] '}'. update = UPDATE expression ':' '{' [id ':=' expression {',' id ':=' expression}] '}'. summarize = SUMMARIZE expression PER expression ':' '{' [id ':=' expression {',' id ':=' expression}] '}'. divideby = expression DIVIDEBY expression PER expression. summary = COUNT '(' ')' | agg_op_name '(' expression ')'. agg_op_name = SUM | AVG | MAX | MIN | ALL | AND | ANY | OR. wrap = expression WRAP '(' [wrapping {',' wrapping}] ')'. wrapping = '{' [id {',' id}] '}' AS id. unwrap = expression UNWRAP '(' [id {',' id}] ')'. group = expression GROUP '{' [id {',' id}] '}' AS id. ungroup = expression UNGROUP id. with = WITH '(' [id ':=' expression {',' id ':=' expression}] ')' ':' expression. rel_expression = expression | expression '=' expression | expression '<>' expression | expression '!=' expression | expression '>=' expression | expression '<=' expression | expression '>' expression | expression '<' expression | expression SUBSET_OF expression | expression IN expression | expression LIKE expression | expression REGEX_LIKE expression. ifthenelse = IF expression THEN expression ELSE expression. count_inv = COUNT '(' expression ')'. agg_op_inv = agg_op_name '(' expression [',' expression] ')'. literal = string | integer | decimal | float | binary | TRUE | FALSE | RELATION '{' [id type {',' id type}] '}' '{' [expression {',' expression}] '}' | RELATION '{' expression {',' expression} '}' | TABLE_DEE | TABLE_DUM | TUPLE '{' [id expression {',' id expression}] '}' | ARRAY type '(' [expression {',' expression}] ')' | ARRAY '(' expression {',' expression} ')'.
type = qualified_id | TUPLE '{' [id type {',' id type}] '}' | TUPLE '{' [id type {',' id type} ','] '*' '}' | RELATION '{' [id type {',' id type}] '}' | ARRAY type | SAME_TYPE_AS '(' expression ')' | TUPLE SAME_HEADING_AS '(' expression ')' | RELATION SAME_HEADING_AS '(' expression ')'.
qualified_id = {id '.'} id.
string = '"'{esc_char}'"' | "'"{character}"'". esc_char = character | '\"' | '\\' | '\n' | '\r' | '\t'. integer = digit{digit}. decimal = digit{digit}'.'digit{digit}. float = digit{digit}'.'digit{digit}('E' | 'e')digit{digit} | NaN. binary = "X'"{hex_digit hex_digit}"'"
id = letter{letter | digit | '_' | '#'}["'"] | "`"letter{letter | digit | '_' | '#'}["'"]"`".