Changeset: 8d2db438489d for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8d2db438489d Modified Files: sql/server/sql_parser.h sql/server/sql_parser.y sql/server/sql_scan.c Branch: graph0 Log Message:
Merge parser changes diffs (192 lines): diff --git a/sql/server/sql_parser.h b/sql/server/sql_parser.h --- a/sql/server/sql_parser.h +++ b/sql/server/sql_parser.h @@ -172,7 +172,9 @@ typedef enum tokens { SQL_XMLQUERY, SQL_XMLTEXT, SQL_XMLVALIDATE, - SQL_XMLNAMESPACES + SQL_XMLNAMESPACES, + SQL_GRAPH_REACHES, + SQL_GRAPH_CHEAPEST_SUM, } tokens; typedef enum jt { diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y --- a/sql/server/sql_parser.y +++ b/sql/server/sql_parser.y @@ -297,6 +297,11 @@ int yydebug=1; XML_value_expression XML_primary opt_comma_string_value_expression + graph_reaches_exp + graph_reaches_column_def + graph_reaches_edges_table + graph_cheapest_sum + graph_cheapest_sum_arg %type <type> data_type @@ -333,6 +338,7 @@ int yydebug=1; XML_namespace_prefix XML_PI_target function_body + aggr %type <l> passwd_schema @@ -512,7 +518,7 @@ int yydebug=1; /* sql prefixes to avoid name clashes on various architectures */ %token <sval> - IDENT aTYPE ALIAS AGGR AGGR2 RANK sqlINT OIDNUM HEXADECIMAL INTNUM APPROXNUM + IDENT aTYPE ALIAS AGGR SUM AGGR2 RANK sqlINT OIDNUM HEXADECIMAL INTNUM APPROXNUM USING GLOBAL CAST CONVERT CHARACTER VARYING LARGE OBJECT VARCHAR CLOB sqlTEXT BINARY sqlBLOB @@ -558,6 +564,8 @@ int yydebug=1; %token XMLVALIDATE RETURNING LOCATION ID ACCORDING XMLSCHEMA URI XMLAGG %token FILTER +/* GRAPH tokens */ +%token CHEAPEST REACHES EDGE /* operators */ %left UNION EXCEPT INTERSECT CORRESPONDING UNIONJOIN @@ -3346,6 +3354,8 @@ predicate: | existence_test | filter_exp | scalar_exp + | graph_reaches_exp + | graph_cheapest_sum ; pred_exp: @@ -3791,6 +3801,56 @@ param: $$ = _symbol_create_int( SQL_PARAMETER, nr ); } +graph_reaches_exp: + graph_reaches_column_def REACHES graph_reaches_column_def OVER graph_reaches_edges_table EDGE '(' graph_reaches_column_def ',' graph_reaches_column_def ')' + { + dlist *l = L(); + append_symbol(l, $1); + append_symbol(l, $3); + append_symbol(l, $5); + append_symbol(l, $8); + append_symbol(l, $10); + $$ = _symbol_create_list(SQL_GRAPH_REACHES, l); + } +; + +graph_reaches_column_def: + ident { $$ = _symbol_create_list( SQL_COLUMN, append_string(L(), $1)); } + | ident '.' ident { $$ = _symbol_create_list( SQL_COLUMN, append_string(append_string(L(), $1), $3)); } +; + +graph_reaches_edges_table: + qname opt_table_name + { + dlist *l = L(); + append_list(l, $1); + append_symbol(l, $2); + $$ = _symbol_create_list(SQL_NAME, l); + } +; + +graph_cheapest_sum_arg: + ident ':' scalar_exp + { + dlist *l = L(); + append_string(l, $1); // opt_table_name_ref + append_symbol(l, $3); // weight expression + $$ = _symbol_create_list( SQL_GRAPH_CHEAPEST_SUM, l ); + } + | scalar_exp + { + dlist *l = L(); + append_string(l, NULL); + append_symbol(l, $1); + $$ = _symbol_create_list( SQL_GRAPH_CHEAPEST_SUM, l ); + } +; + +graph_cheapest_sum: + CHEAPEST SUM '(' graph_cheapest_sum_arg ')' { $$ = $4; } +; + + /* <window function> ::= <window function type> OVER <window name or specification> @@ -4141,9 +4201,14 @@ qrank: append_string(L(), $1), $3);} ; +aggr: + AGGR + | SUM { $$ = sa_strdup(SA, "sum"); } + ; + qaggr: - AGGR { $$ = append_string(L(), $1); } - | ident '.' AGGR { $$ = append_string( + aggr { $$ = append_string(L(), $1); } + | ident '.' aggr { $$ = append_string( append_string(L(), $1), $3);} ; @@ -5162,7 +5227,7 @@ restricted_ident: IDENT { $$ = $1; } | aTYPE { $$ = $1; } | ALIAS { $$ = $1; } - | AGGR { $$ = $1; } /* without '(' */ + | aggr { $$ = $1; } /* without '(' */ | AGGR2 { $$ = $1; } /* without '(' */ | RANK { $$ = $1; } /* without '(' */ ; @@ -5172,7 +5237,7 @@ ident: | aTYPE { $$ = $1; } | FILTER_FUNC { $$ = $1; } | ALIAS { $$ = $1; } - | AGGR { $$ = $1; } /* without '(' */ + | aggr { $$ = $1; } /* without '(' */ | AGGR2 { $$ = $1; } /* without '(' */ | RANK { $$ = $1; } /* without '(' */ | non_reserved_word diff --git a/sql/server/sql_scan.c b/sql/server/sql_scan.c --- a/sql/server/sql_scan.c +++ b/sql/server/sql_scan.c @@ -101,7 +101,7 @@ scanner_init_keywords(void) keywords_insert("AVG", AGGR); keywords_insert("MIN", AGGR); keywords_insert("MAX", AGGR); - keywords_insert("SUM", AGGR); + keywords_insert("SUM", AGGR); /* shared with aggr and cheapest_sum */ keywords_insert("PROD", AGGR); keywords_insert("COUNT", AGGR); @@ -470,6 +470,11 @@ scanner_init_keywords(void) keywords_insert("MULTILINESTRINGZM", GEOMETRYSUBTYPE); keywords_insert("MULTIPOLYGONZM", GEOMETRYSUBTYPE); keywords_insert("GEOMETRYCOLLECTIONZM", GEOMETRYSUBTYPE); + + // Graph-related keywords + keywords_insert("CHEAPEST", CHEAPEST); + keywords_insert("EDGE", EDGE); + keywords_insert("REACHES", REACHES); } #define find_keyword_bs(lc, s) find_keyword(lc->rs->buf+lc->rs->pos+s) @@ -1099,7 +1104,11 @@ int scanner_symbol(mvc * c, int cur) utf8_putchar(lc, cur); return scanner_token(lc, '|'); } + case ':': /* CHEAPEST SUM (e: expr) */ + lc->started = 1; + return scanner_token(lc, ':'); } + (void)sql_error( c, 3, "unexpected symbol (%lc)", (wint_t) cur); return LEX_ERROR; } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list