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

Reply via email to