Niels, can you create a Changlog entry, please? On 2010-06-22 15:25, Niels Nes wrote: > Changeset: 600a35cbf6c0 for MonetDB > URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=600a35cbf6c0 > Modified Files: > sql/src/server/bin_optimizer.mx > sql/src/server/rel_bin.mx > sql/src/server/rel_schema.mx > sql/src/server/rel_select.mx > sql/src/server/sql_parser.mx > sql/src/server/sql_statement.mx > sql/src/server/sql_symbol.mx > sql/src/test/BugTracker-2009/Tests/POWER_vs_prod.SF-2596114.stable.out > sql/src/test/Dependencies/Tests/Dependencies.stable.out > Branch: Jun2010 > Log Message: > > make it possible to use '?' in offset and limit > (transplanted from 61c37c0d76f8ee3359bda98cc25e750b5201ae56) > > > diffs (truncated from 482 to 300 lines): > > diff -r d83c56c4bba7 -r 600a35cbf6c0 sql/src/server/bin_optimizer.mx > --- a/sql/src/server/bin_optimizer.mx Tue Jun 22 14:39:09 2010 +0200 > +++ b/sql/src/server/bin_optimizer.mx Mon Jun 21 23:35:09 2010 +0200 > @@ -288,9 +288,9 @@ > stmt *r = stmt_dup(j->op2.stval); > > l = stmt_limit(l, > - s->op2.stval->op1.aval->data.val.wval, > - s->op3.stval->op1.aval->data.val.wval, > - s->flag); > + stmt_dup(s->op2.stval), > + stmt_dup(s->op3.stval), > + s->flag); > s = stmt_join(l, r, cmp_equal); > ns = bin_optimizer(c, s); > stmt_destroy(s); > @@ -311,9 +311,9 @@ > stmt *r = stmt_dup(j->op2.stval); > > r = stmt_limit(r, > - s->op2.stval->op1.aval->data.val.wval, > - s->op3.stval->op1.aval->data.val.wval, > - s->flag); > + stmt_dup(s->op2.stval), > + stmt_dup(s->op3.stval), > + s->flag); > s = stmt_join(l, r, cmp_equal); > ns = bin_optimizer(c, s); > stmt_destroy(s); > @@ -325,8 +325,8 @@ > /* try to push the limit through the order */ > if (j->type == st_order) { > s = stmt_order(stmt_limit(stmt_dup(j->op1.stval), > - s->op2.stval->op1.aval->data.val.wval, > - s->op3.stval->op1.aval->data.val.wval, > + stmt_dup(s->op2.stval), > + stmt_dup(s->op3.stval), > LIMIT_DIRECTION(j->flag,1,0)), j->flag); > ns = bin_optimizer(c, s); > stmt_destroy(s); > @@ -338,8 +338,8 @@ > /* try to push the limit through the reverse */ > if (!s->flag && j->type == st_reverse) { > s = stmt_reverse(stmt_limit(stmt_dup(j->op1.stval), > - s->op2.stval->op1.aval->data.val.wval, > - s->op3.stval->op1.aval->data.val.wval, > + stmt_dup(s->op2.stval), > + stmt_dup(s->op3.stval), > 0)); > ns = bin_optimizer(c, s); > stmt_destroy(s); > @@ -351,8 +351,9 @@ > /* try to push the limit through the mark (only if there is no > offset) */ > if (!s->op2.stval->op1.aval->data.val.wval && j->type == > st_mark) { > s = stmt_mark_tail(stmt_limit(stmt_dup(j->op1.stval), > - s->op2.stval->op1.aval->data.val.wval, > - s->op3.stval->op1.aval->data.val.wval, s->flag), > + stmt_dup(s->op2.stval), > + stmt_dup(s->op3.stval), > + s->flag), > j->op2.stval->op1.aval->data.val.ival); > ns = bin_optimizer(c, s); > stmt_destroy(s); > diff -r d83c56c4bba7 -r 600a35cbf6c0 sql/src/server/rel_bin.mx > --- a/sql/src/server/rel_bin.mx Tue Jun 22 14:39:09 2010 +0200 > +++ b/sql/src/server/rel_bin.mx Mon Jun 21 23:35:09 2010 +0200 > @@ -1478,32 +1478,26 @@ > return stmt_list(l); > } > > -static wrd > +static sql_exp* > topn_limit( sql_rel *rel ) > { > if (rel->exps) { > sql_exp *limit = rel->exps->h->data; > - atom *a = limit->l; > - > - return a->data.val.wval; > + > + return limit; > } > - return -1; > + return NULL; > } > > -static wrd > +static sql_exp* > topn_offset( sql_rel *rel ) > { > - wrd o = 0; > - > if (rel->exps && list_length(rel->exps) > 1) { > sql_exp *offset = rel->exps->h->next->data; > - atom *a = offset->l; > - > - o = a->data.val.wval; > - if (o <= 0) > - o = 0; > + > + return offset; > } > - return o; > + return NULL; > } > > static sql_table * > @@ -1524,15 +1518,24 @@ > list *pl; > node *en, *n; > stmt *sub = NULL, *psub = NULL; > - wrd l = -1; > + stmt *l = NULL; > > if (topn) { > - wrd o = topn_offset(topn); > - l = topn_limit(topn); > - if (l < 0) /* for now only handle topn > + sql_exp *le = topn_limit(topn); > + sql_exp *oe = topn_offset(topn); > + > + if (!le) { /* for now only handle topn > including limit, ie not just offset */ > topn = NULL; > - l += o; > + } else { > + l = exp_bin(sql, le, NULL, NULL, NULL, NULL); > + if (oe) { > + sql_subtype *wrd = sql_bind_localtype("wrd"); > + sql_subfunc *add = > sql_bind_func_result(sql->session->schema, "sql_add", wrd, wrd, wrd); > + stmt *o = exp_bin(sql, oe, NULL, NULL, NULL, > NULL); > + l = stmt_binop(l, o, add); > + } > + } > } > > if (!rel->exps) > @@ -1591,7 +1594,7 @@ > stmt_destroy(sub); > return NULL; > } > - limit = stmt_limit(orderbycols, 0, l, > LIMIT_DIRECTION(is_ascending(orderbycole), 1, before_project)); > + limit = stmt_limit(orderbycols, stmt_atom_wrd(0), l, > LIMIT_DIRECTION(is_ascending(orderbycole), 1, before_project)); > for ( n=pl->h ; n; n = n->next) { > list_append(npl, > stmt_semijoin(column(stmt_dup(n->data)), > @@ -1902,8 +1905,8 @@ > rel2bin_topn( mvc *sql, sql_rel *rel, list *refs) > { > list *newl; > - wrd l = -1, o = 0; > - stmt *sub = NULL, *order = NULL; > + sql_exp *oe = NULL, *le = NULL; > + stmt *sub = NULL, *order = NULL, *l = NULL, *o = NULL; > node *n; > > if (rel->l) { /* first construct the sub relation */ > @@ -1918,8 +1921,8 @@ > if (!sub) > return NULL; > > - l = topn_limit(rel); > - o = topn_offset(rel); > + le = topn_limit(rel); > + oe = topn_offset(rel); > > if (sub->type == st_ordered) { > stmt *s = stmt_dup(sub->op2.stval); > @@ -1932,18 +1935,25 @@ > > if (n) { > stmt *limit = NULL, *p, *j; > - wrd lmt = l; > - > - if (l < 0) { > + sql_exp *lmt = le; > + > + if (le) > + l = exp_bin(sql, le, NULL, NULL, NULL, NULL); > + if (oe) > + o = exp_bin(sql, oe, NULL, NULL, NULL, NULL); > + > + if (!le) { > l = o; > - o = 0; > + o = stmt_atom_wrd(0); > } > + if (!o) > + o = stmt_atom_wrd(0); > > if (order) { > limit = stmt_limit(stmt_dup(order), o, l, 0); > } else { > limit = stmt_limit(column(stmt_dup(n->data)), o, l, 0); > - if (lmt >= 0) { > + if (lmt) { > n = n->next; > list_append(newl, limit); > } > @@ -1953,7 +1963,7 @@ > j = find_projection_join(limit); > if (j && 0) { > p = find_pivot(j); > - if (lmt < 0) > + if (!lmt) > p = stmt_diff(stmt_dup(p), stmt_dup(limit)); > else > p = stmt_semijoin(stmt_dup(p), stmt_dup(limit)); > @@ -1971,7 +1981,7 @@ > for ( ; n; n = n->next) { > stmt *s; > > - if (lmt < 0) > + if (!lmt) > s = > stmt_diff(column(stmt_dup(n->data)), stmt_dup(limit)); > else > s = > stmt_semijoin(column(stmt_dup(n->data)), stmt_dup(limit)); > @@ -1979,7 +1989,7 @@ > } > } > if (order) { > - if (lmt < 0) { > + if (!lmt) { > order = stmt_diff(order, limit); > } else { > stmt_destroy(order); > diff -r d83c56c4bba7 -r 600a35cbf6c0 sql/src/server/rel_schema.mx > --- a/sql/src/server/rel_schema.mx Tue Jun 22 14:39:09 2010 +0200 > +++ b/sql/src/server/rel_schema.mx Mon Jun 21 23:35:09 2010 +0200 > @@ -859,7 +859,7 @@ > if (query->token == SQL_SELECT) { > SelectNode *sn = (SelectNode *) query; > > - if (sn->limit >= 0) > + if (sn->limit) > return sql_error(sql, 01, "CREATE VIEW: LIMIT > not supported"); > if (sn->orderby) > return sql_error(sql, 01, "CREATE VIEW: ORDER > BY not supported"); > diff -r d83c56c4bba7 -r 600a35cbf6c0 sql/src/server/rel_select.mx > --- a/sql/src/server/rel_select.mx Tue Jun 22 14:39:09 2010 +0200 > +++ b/sql/src/server/rel_select.mx Mon Jun 21 23:35:09 2010 +0200 > @@ -4644,12 +4644,31 @@ > if (!rel) > return NULL; > > - if (sn->limit > 0 || sn->offset > 0) { > + if (sn->limit || sn->offset) { > + sql_subtype *wrd = sql_bind_localtype("wrd"); > list *exps = new_exp_list(); > > - append(exps, exp_atom_wrd(sn->limit)); > - if (sn->offset > 0) > - append(exps, exp_atom_wrd(sn->offset)); > + if (sn->limit) { > + sql_exp *l = rel_value_exp( sql, NULL, sn->limit, 0, > ek); > + > + if (!l || !(l=rel_check_type(sql, wrd, l, type_equal))) > + return NULL; > + if ((ek.card != card_relation && sn->limit) && > + (ek.card == card_value && sn->limit)) { > + sql_subaggr *zero_or_one = > sql_bind_aggr(sql->session->schema, "zero_or_one", exp_subtype(l)); > + > + l = exp_aggr1(l, zero_or_one, 0, 0, CARD_ATOM, 0); > + } > + // return sql_error(sql, 01, "SELECT: LIMIT only allowed on > outermost SELECT"); > + append(exps, l); > + } else > + append(exps, NULL); > + if (sn->offset) { > + sql_exp *o = rel_value_exp( sql, NULL, sn->offset, 0, > ek); > + if (!o || !(o=rel_check_type(sql, wrd, o, type_equal))) > + return NULL; > + append(exps, o); > + } > rel = rel_topn(rel, exps); > } > return rel; > @@ -4670,10 +4689,6 @@ > return table_ref(sql, rel, sq); > assert(sn->s.token == SQL_SELECT); > > - if ((ek.card != card_relation && sn->limit >= 0) && > - (ek.card == card_value && sn->limit != 1)) > - return sql_error(sql, 01, "SELECT: LIMIT only allowed on > outermost SELECT"); > - > if (ek.card != card_relation && sn->orderby) > return sql_error(sql, 01, "SELECT: ORDER BY only allowed on > outermost SELECT"); > > diff -r d83c56c4bba7 -r 600a35cbf6c0 sql/src/server/sql_parser.mx > --- a/sql/src/server/sql_parser.mx Tue Jun 22 14:39:09 2010 +0200 > +++ b/sql/src/server/sql_parser.mx Mon Jun 21 23:35:09 2010 +0200 > @@ -388,6 +388,9 @@ > ordering_spec > simple_table > table_ref > + opt_limit > + opt_offset > + param > case_exp > case_scalar_exp > _______________________________________________ > Checkin-list mailing list > checkin-l...@monetdb.org > http://mail.monetdb.org/mailman/listinfo/checkin-list
-- Sjoerd Mullender
signature.asc
Description: OpenPGP digital signature
------------------------------------------------------------------------------ ThinkGeek and WIRED's GeekDad team up for the Ultimate GeekDad Father's Day Giveaway. ONE MASSIVE PRIZE to the lucky parental unit. See the prize list and enter to win: http://p.sf.net/sfu/thinkgeek-promo
_______________________________________________ Monetdb-developers mailing list Monetdb-developers@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/monetdb-developers