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

Reply via email to