Changeset: 779d264d66e3 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/779d264d66e3
Modified Files:
        sql/server/rel_select.c
        sql/server/sql_parser.y
        sql/server/sql_scan.c
Branch: default
Log Message:

add support for Field function for ordering based on value list
added (on parser) generated by default, which is equal (for MonetDB)
as generated always (as always has had the implementation fitting generated
by default).


diffs (106 lines):

diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -3520,6 +3520,26 @@ rel_nop(sql_query *query, sql_rel **rel,
        char *fname = qname_schema_object(l->data.lval);
        char *sname = qname_schema(l->data.lval);
 
+       if (!sname && strcmp(fname, "field") == 0) { /* map into join */
+               sql_exp *le = exps->h->data;
+               set_freevar(le, 1);
+               list_remove_data(exps, NULL, le);
+               sql_exp *re = exp_values(sql->sa, exps);
+               exp_label(sql->sa, re, ++sql->label);
+               sql_rel *r = rel_project(sql->sa, NULL, 
append(sa_list(sql->sa), re));
+               sql_exp *id = NULL;
+               rel_add_identity(sql, r, &id);
+               re = exp_ref(sql, re);
+               id = exp_ref(sql, id);
+               if (r) {
+                       r->nrcols = list_length(exps);
+                       sql_exp *e = exp_compare(sql->sa, le, re, cmp_equal);
+                       r = rel_select(sql->sa, r, e);
+                       r = rel_project(sql->sa, r, append(sa_list(sql->sa), 
exp_convert(sql->sa, id, exp_subtype(id), sql_bind_localtype("int"))));
+                       re = exp_rel(sql, r);
+                       return re;
+               }
+       }
        /* first try aggregate */
        if (find_func(sql, sname, fname, nr_args, F_AGGR, false, NULL, NULL)) { 
/* We have to pass the arguments properly, so skip call to rel_aggr */
                /* reset error */
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
@@ -260,6 +260,7 @@ int yydebug=1;
        like_predicate
        like_table
        literal
+       map_funcs
        merge_insert
        merge_match_clause
        merge_stmt
@@ -680,7 +681,7 @@ int yydebug=1;
 %token XMLPARSE STRIP WHITESPACE XMLPI XMLQUERY PASSING XMLTEXT
 %token NIL REF ABSENT EMPTY DOCUMENT ELEMENT CONTENT XMLNAMESPACES NAMESPACE
 %token XMLVALIDATE RETURNING LOCATION ID ACCORDING XMLSCHEMA URI XMLAGG
-%token FILTER
+%token FIELD FILTER
 
 /* operators */
 %left UNION EXCEPT INTERSECT CORRESPONDING
@@ -2002,8 +2003,14 @@ column_constraint:
          $$ = _symbol_create_list( SQL_CONSTRAINT, l ); }
  ;
 
+always_or_by_default:
+       ALWAYS
+   |   BY DEFAULT
+   ;
+
 generated_column:
-       GENERATED ALWAYS AS IDENTITY serial_opt_params
+               /* we handle both by default and always alike, ie 
inserts/updates are allowed */
+       GENERATED always_or_by_default AS IDENTITY serial_opt_params
        {
                /* handle multi-statements by wrapping them in a list */
                sql_subtype it;
@@ -4297,9 +4304,20 @@ value_exp:
  |  string_funcs
  |  XML_value_function
  |  odbc_scalar_func_escape
+ |  map_funcs
  |  multi_arg_func
  ;
 
+map_funcs:
+    FIELD '(' search_condition_commalist ')'
+                       { dlist *l = L();
+                         append_list(l,
+                               append_string(L(), sa_strdup(SA, "field")));
+                         append_int(l, FALSE); /* ignore distinct */
+                         append_list(l, $3);
+                         $$ = _symbol_create_list( SQL_NOP, l ); }
+  ;
+
 param:
    '?'
        {
@@ -5708,6 +5726,7 @@ non_reserved_word:
 | EPOCH                { $$ = sa_strdup(SA, "epoch"); }
 | SQL_EXPLAIN  { $$ = sa_strdup(SA, "explain"); }
 | FIRST                { $$ = sa_strdup(SA, "first"); }
+| FIELD                { $$ = sa_strdup(SA, "field"); }
 | GEOMETRY     { $$ = sa_strdup(SA, "geometry"); }
 | IMPRINTS     { $$ = sa_strdup(SA, "imprints"); }
 | INCREMENT    { $$ = sa_strdup(SA, "increment"); }
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
@@ -395,6 +395,7 @@ scanner_init_keywords(void)
        failed += keywords_insert("LOADER", sqlLOADER);
        failed += keywords_insert("REPLACE", REPLACE);
 
+       failed += keywords_insert("FIELD", FIELD);
        failed += keywords_insert("FILTER", FILTER);
        failed += keywords_insert("AGGREGATE", AGGREGATE);
        failed += keywords_insert("RETURNS", RETURNS);
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to