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