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

Reply via email to