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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list