Update of /cvsroot/monetdb/sql/src/server
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv2129/src/server
Modified Files:
rel_exp.mx rel_select.mx
Log Message:
use zero_or_one for subqureis which should return zero or one result
Index: rel_select.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_select.mx,v
retrieving revision 1.57
retrieving revision 1.58
diff -u -d -r1.57 -r1.58
--- rel_select.mx 27 Jan 2008 17:28:32 -0000 1.57
+++ rel_select.mx 27 Jan 2008 19:18:58 -0000 1.58
@@ -1821,13 +1821,14 @@
rs = rel_lastexp(sql, r->r);
rel = r;
}
- } else if (r->card > CARD_ATOM) {
- /* should be changed to a dynamic check ! */
- return sql_error(sql, 02,
- "SELECT: subquery returned more than one row");
} else if (r) {
rel_setsubquery(r);
rs = rel_lastexp(sql, r);
+ if (r->card > CARD_ATOM) {
+ sql_subaggr *zero_or_one =
sql_bind_aggr(sql->session->schema, "zero_or_one", exp_subtype(rs));
+
+ rs = exp_aggr1(rs, zero_or_one, 0, 0,
CARD_ATOM);
+ }
rel = rel_crossproduct(rel, r, op_join);
}
}
@@ -1927,13 +1928,14 @@
rs = exp_atom_bool(0);
return rel_binop_(sql, ls, rs, NULL,
"=");
}
- } else if (r->card > CARD_ATOM) {
- /* should be changed to a dynamic check ! */
- return sql_error(sql, 02,
- "SELECT: subquery returned more than one row");
} else if (r) {
rel_setsubquery(r);
rs = rel_lastexp(sql, r);
+ if (r->card > CARD_ATOM) {
+ sql_subaggr *zero_or_one =
sql_bind_aggr(sql->session->schema, "zero_or_one", exp_subtype(rs));
+
+ rs = exp_aggr1(rs, zero_or_one, 0, 0,
CARD_ATOM);
+ }
*rel = rel_crossproduct(*rel, r, op_join);
}
if (!rs) {
@@ -2882,10 +2884,8 @@
if (a) {
/* type may have changed, ie. need to fix_scale */
sql_subtype *t = exp_subtype(e);
- list *exps = new_exp_list();
- append(exps, e);
- e = exp_aggr(exps, a, distinct, no_nil, groupby->card);
+ e = exp_aggr1(e, a, distinct, no_nil, groupby->card);
exp = e;
if (*rel != old)
exp = rel_groupby_add_aggr(sql, *rel, exp);
@@ -3400,9 +3400,16 @@
ninner = rel_subquery(sql, inner, se, f);
if (ninner && !*rel) {
+ sql_exp *e;
*rel = ninner;
rel_setsubquery(ninner);
- return rel_lastexp(sql, ninner);
+ e = rel_lastexp(sql, ninner);
+ if (e->card > CARD_ATOM) {
+ sql_subaggr *zero_or_one =
sql_bind_aggr(sql->session->schema, "zero_or_one", exp_subtype(e));
+
+ e = exp_aggr1(e, zero_or_one, 0, 0, CARD_ATOM);
+ }
+ return e;
}
if (!ninner) {
if (!*rel)
Index: rel_exp.mx
===================================================================
RCS file: /cvsroot/monetdb/sql/src/server/rel_exp.mx,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- rel_exp.mx 27 Jan 2008 15:40:08 -0000 1.1
+++ rel_exp.mx 27 Jan 2008 19:18:58 -0000 1.2
@@ -50,6 +50,8 @@
#define exp_op4(l,r,r2,r3,f) \
exp_op(append(append(append(append(new_exp_list(),l),r),r2),r3), f)
extern sql_exp *exp_aggr( list *l, sql_subaggr *a, int distinct, int no_nils,
int card );
+#define exp_aggr1(e, a, d, n, c) \
+ exp_aggr(append(new_exp_list(), e), a, d, n, c)
extern sql_exp * exp_atom( atom *a);
extern sql_exp * exp_atom_int(int i);
extern sql_exp * exp_atom_str(str s, sql_subtype *st);
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Monetdb-sql-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-sql-checkins