Changeset: 33b3903d8346 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=33b3903d8346 Modified Files: sql/server/rel_select.c sql/server/sql_parser.h sql/server/sql_parser.y Branch: analytics Log Message:
Range frame with bounded preceding/following and no ordering is not reliable to implement. diffs (89 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 @@ -4707,8 +4707,11 @@ rel_rankop(mvc *sql, sql_rel **rel, symb return sql_error(sql, 02, SQLSTATE(42000) "OVER: frame extend only possible with aggregation"); if(!obe && frame_type == FRAME_GROUPS) return sql_error(sql, 02, SQLSTATE(42000) "GROUPS frame requires an order by expression"); - if(!obe && frame_type == FRAME_RANGE) + if(!obe && frame_type == FRAME_RANGE) { + if(d->data.sym->token == SQL_FRAME_PRECEDING || d->next->data.sym->token == SQL_FRAME_FOLLOWING) + return sql_error(sql, 02, SQLSTATE(42000) "RANGE frame with PRECEDING or FOLLOWING offsets requires an order by expression"); frame_type = FRAME_ALL; //special case, iterate the entire partition + } if(calculate_window_bounds(sql, &start, &eend, s, gbe ? pe : NULL, obe ? obe->t->data : in, fstart, fend, frame_type, excl) == NULL) return NULL; 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 @@ -145,7 +145,11 @@ typedef enum tokens { SQL_FUNC, SQL_AGGR, SQL_RANK, - SQL_FRAME, + SQL_FRAME_DEFINITION, + SQL_FRAME_CURRENT, + SQL_FRAME_UNBOUNDED, + SQL_FRAME_FOLLOWING, + SQL_FRAME_PRECEDING, SQL_COMPARE, SQL_FILTER, SQL_ROUTINE, 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 @@ -4175,7 +4175,7 @@ window_order_clause: window_frame_clause: /* empty */ { $$ = NULL; } | window_frame_units window_frame_extent window_frame_exclusion - { $$ = _symbol_create_list( SQL_FRAME, append_int(append_int($2, $1), $3)); } + { $$ = _symbol_create_list( SQL_FRAME_DEFINITION, append_int(append_int($2, $1), $3)); } ; window_frame_units: @@ -4185,14 +4185,14 @@ window_frame_units: ; window_frame_extent: - window_frame_start { $$ = append_symbol(append_symbol(L(), $1), _symbol_create_int(SQL_FRAME, 0)); } + window_frame_start { $$ = append_symbol(append_symbol(L(), $1), _symbol_create_int(SQL_FRAME_CURRENT, 0)); } | window_frame_between { $$ = $1; } ; window_frame_start: - UNBOUNDED PRECEDING { $$ = _symbol_create_int(SQL_FRAME, GDK_int_max); } - | posint PRECEDING { $$ = _symbol_create_int(SQL_FRAME, $1); } - | CURRENT ROW { $$ = _symbol_create_int(SQL_FRAME, 0); } + UNBOUNDED PRECEDING { $$ = _symbol_create_int(SQL_FRAME_UNBOUNDED, GDK_int_max); } + | posint PRECEDING { $$ = _symbol_create_int(SQL_FRAME_PRECEDING, $1); } + | CURRENT ROW { $$ = _symbol_create_int(SQL_FRAME_CURRENT, 0); } ; window_frame_between: @@ -4200,9 +4200,9 @@ window_frame_between: ; window_frame_end: - UNBOUNDED FOLLOWING { $$ = _symbol_create_int(SQL_FRAME, GDK_int_max); } - | posint FOLLOWING { $$ = _symbol_create_int(SQL_FRAME, $1); } - | CURRENT ROW { $$ = _symbol_create_int(SQL_FRAME, 0); } + UNBOUNDED FOLLOWING { $$ = _symbol_create_int(SQL_FRAME_UNBOUNDED, GDK_int_max); } + | posint FOLLOWING { $$ = _symbol_create_int(SQL_FRAME_FOLLOWING, $1); } + | CURRENT ROW { $$ = _symbol_create_int(SQL_FRAME_CURRENT, 0); } ; window_frame_exclusion: @@ -6411,7 +6411,11 @@ char *token2string(int token) SQL(FUNC); SQL(AGGR); SQL(RANK); - SQL(FRAME); + SQL(FRAME_DEFINITION); + SQL(FRAME_CURRENT); + SQL(FRAME_UNBOUNDED); + SQL(FRAME_FOLLOWING); + SQL(FRAME_PRECEDING); SQL(COMPARE); SQL(FILTER); SQL(ROUTINE); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list