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