Changeset: 937a410afccf for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=937a410afccf
Modified Files:
        sql/backends/monet5/rel_bin.c
        sql/server/rel_unnest.c
        sql/test/subquery/Tests/subquery3.sql
        sql/test/subquery/Tests/subquery3.stable.err
        sql/test/subquery/Tests/subquery3.stable.out
Branch: default
Log Message:

merged with linear-hashing


diffs (241 lines):

diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -562,6 +562,8 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                        return stmt_table(be, r, 1);
                } else if (e->flag & PSM_EXCEPTION) {
                        stmt *cond = exp_bin(be, e->l, left, right, grp, ext, 
cnt, sel);
+                       if (!cond)
+                               return NULL;
                        return stmt_exception(be, cond, (const char *) e->r, 0);
                }
                break;
@@ -2218,8 +2220,12 @@ rel2bin_antijoin(backend *be, sql_rel *r
                assert(list_length(mexps) == 1);
                for( en = mexps->h; en; en = en->next ) {
                        sql_exp *e = en->data;
-                       stmt *ls = exp_bin(be, e->l, left, right, NULL, NULL, 
NULL, NULL);
-                       stmt *rs = exp_bin(be, e->r, left, right, NULL, NULL, 
NULL, NULL);
+                       stmt *ls = exp_bin(be, e->l, left, right, NULL, NULL, 
NULL, NULL), *rs;
+                       if (!ls)
+                               return NULL;
+
+                       if (!(rs = exp_bin(be, e->r, left, right, NULL, NULL, 
NULL, NULL)))
+                               return NULL;
 
                        if (ls->nrcols == 0)
                                ls = stmt_const(be, bin_first_column(be, left), 
ls);
@@ -5327,7 +5333,7 @@ rel2bin_psm(backend *be, sql_rel *rel)
        for (n = rel->exps->h; n; n = n->next) {
                sql_exp *e = n->data;
                stmt *s = exp_bin(be, e, sub, NULL, NULL, NULL, NULL, NULL);
-               if(!s)
+               if (!s)
                        return NULL;
 
                if (s && s->type == st_table) /* relational statement */
@@ -5349,6 +5355,8 @@ rel2bin_partition_limits(backend *be, sq
                l = subrel_bin(be, rel->l, refs);
        if (rel->r)  /* first construct the sub relation */
                r = subrel_bin(be, rel->r, refs);
+       if (!l || !r)
+               return NULL;
 
        assert(rel->exps);
        assert(rel->flag == ddl_alter_table_add_range_partition || rel->flag == 
ddl_alter_table_add_list_partition);
@@ -5357,6 +5365,8 @@ rel2bin_partition_limits(backend *be, sq
                for (n = rel->exps->h; n; n = n->next) {
                        sql_exp *e = n->data;
                        stmt *s = exp_bin(be, e, l, r, NULL, NULL, NULL, NULL);
+                       if (!s)
+                               return NULL;
                        append(slist, s);
                }
        }
@@ -5377,11 +5387,15 @@ rel2bin_exception(backend *be, sql_rel *
                l = subrel_bin(be, rel->l, refs);
     if (rel->r)  /* first construct the sub relation */
                r = subrel_bin(be, rel->r, refs);
+       if (!l || !r)
+               return NULL;
 
        if (rel->exps) {
                for (n = rel->exps->h; n; n = n->next) {
                        sql_exp *e = n->data;
                        stmt *s = exp_bin(be, e, l, r, NULL, NULL, NULL, NULL);
+                       if (!s)
+                               return NULL;
                        append(slist, s);
                }
        } else { /* if there is no exception condition, just generate a 
statement list */
@@ -5401,7 +5415,7 @@ rel2bin_seq(backend *be, sql_rel *rel, l
 
        if (rel->l) { /* first construct the sub relation */
                sl = subrel_bin(be, rel->l, refs);
-               if(!sl)
+               if (!sl)
                        return NULL;
        }
 
diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -51,6 +51,9 @@ exp_set_freevar(mvc *sql, sql_exp *e, sq
                set_freevar(e, 0);
                break;
        case e_atom: 
+               if (e->f)
+                       exps_set_freevar(sql, e->f, r);
+               break;
        case e_psm: 
                break;
        }
@@ -114,8 +117,11 @@ exp_has_freevar(mvc *sql, sql_exp *e)
                if (exp_is_rel(e))
                        return rel_has_freevar(sql, e->l);
                break;
-       case e_column: 
        case e_atom: 
+               if (e->f)
+                       return exps_have_freevar(sql, e->f);
+               break;
+       case e_column:
        default:
                return 0;
        }
@@ -238,6 +244,9 @@ exp_freevar(mvc *sql, sql_exp *e)
                                return rel_freevar(sql, e->l);
                return NULL;
        case e_atom:
+               if (e->f)
+                       return exps_freevar(sql, e->f);
+               return NULL;
        default:
                return NULL;
        }
@@ -450,6 +459,9 @@ push_up_project_exp(mvc *sql, sql_rel *r
                        }
                } break;        
        case e_atom: 
+               if (e->f) 
+                       e->f = push_up_project_exps(sql, rel, e->f);
+               break;
        case e_psm: 
                break;
        }
@@ -754,7 +766,19 @@ push_up_project(mvc *sql, sql_rel *rel, 
                                }
                                if (r->l)
                                        e = exp_rewrite(sql, r->l, e, ad);
-                               append(n->exps, e);
+                               if (e->type == e_atom && e->f) {
+                                       list *atoms = (list*)e->f;
+
+                                       if (list_length(atoms) > 1)
+                                               return sql_error(sql, 02, 
SQLSTATE(21000) "Cardinality violation, scalar value expected");
+                                       for (node *nn = atoms->h ; nn ; nn = 
nn->next) {
+                                               sql_exp *ee = (sql_exp *) 
nn->data;
+
+                                                exp_setname(sql->sa, ee, 
exp_relname(e), exp_name(e));
+                                               append(n->exps, ee);
+                                       }
+                               } else
+                                       append(n->exps, e);
                        }
                        if (r->r) {
                                list *exps = r->r, *oexps = n->r = 
sa_list(sql->sa);
diff --git a/sql/test/subquery/Tests/subquery3.sql 
b/sql/test/subquery/Tests/subquery3.sql
--- a/sql/test/subquery/Tests/subquery3.sql
+++ b/sql/test/subquery/Tests/subquery3.sql
@@ -532,9 +532,21 @@ FROM integers i1;
        -- NULL
 
 SELECT
+       (SELECT 1 FROM (VALUES (i1.i)) as i2(i))
+FROM integers i1;
+       -- 1
+       -- 1
+       -- 1
+       -- 1
+
+SELECT
        (SELECT i2.i FROM (VALUES (i1.i), (i1.i)) as i2(i))
 FROM integers i1; --error, more than one row returned by a subquery used as an 
expression
 
+SELECT
+       (SELECT i2.i FROM (VALUES (i1.i, i1.i), (i1.i, i1.i)) as i2(i))
+FROM integers i1; --error, more than one row returned by a subquery used as an 
expression
+
 /* We shouldn't allow the following internal functions/procedures to be called 
from regular queries */
 --SELECT "identity"(col1) FROM another_T;
 --SELECT "rowid"(col1) FROM another_T;
diff --git a/sql/test/subquery/Tests/subquery3.stable.err 
b/sql/test/subquery/Tests/subquery3.stable.err
--- a/sql/test/subquery/Tests/subquery3.stable.err
+++ b/sql/test/subquery/Tests/subquery3.stable.err
@@ -327,6 +327,18 @@ QUERY = SELECT
         FROM integers i1; --error, subquery uses ungrouped column "i1.i" from 
outer query
 ERROR = !SELECT: cannot use non GROUP BY column 'i1.i' in query results 
without an aggregate function
 CODE  = 42000
+MAPI  = (monetdb) /var/tmp/mtest-596453/.s.monetdb.32132
+QUERY = SELECT
+               (SELECT i2.i FROM (VALUES (i1.i), (i1.i)) as i2(i))
+        FROM integers i1; --error, more than one row returned by a subquery 
used as an expression
+ERROR = !Cardinality violation, scalar value expected
+CODE  = 21000
+MAPI  = (monetdb) /var/tmp/mtest-600940/.s.monetdb.32137
+QUERY = SELECT
+               (SELECT i2.i FROM (VALUES (i1.i, i1.i), (i1.i, i1.i)) as i2(i))
+        FROM integers i1; --error, more than one row returned by a subquery 
used as an expression
+ERROR = !Cardinality violation, scalar value expected
+CODE  = 21000
 
 # 17:40:41 >  
 # 17:40:41 >  "Done."
diff --git a/sql/test/subquery/Tests/subquery3.stable.out 
b/sql/test/subquery/Tests/subquery3.stable.out
--- a/sql/test/subquery/Tests/subquery3.stable.out
+++ b/sql/test/subquery/Tests/subquery3.stable.out
@@ -466,6 +466,44 @@ stdout of test 'subquery3` in directory 
 % 1 # length
 [ 1    ]
 [ 1    ]
+#SELECT
+#      (SELECT i2.i FROM (VALUES (MIN(i1.i))) as i2(i))
+#FROM integers i1;
+% .%4 # table_name
+% %4 # name
+% int # type
+% 1 # length
+[ 1    ]
+#SELECT
+#      (SELECT i2.i FROM (VALUES (MIN(i1.i), MAX(i1.i))) as i2(i))
+#FROM integers i1;
+% .%6 # table_name
+% %6 # name
+% int # type
+% 1 # length
+[ 1    ]
+#SELECT
+#      (SELECT i2.i FROM (VALUES (i1.i)) as i2(i))
+#FROM integers i1;
+% .%3 # table_name
+% %3 # name
+% int # type
+% 1 # length
+[ 1    ]
+[ 2    ]
+[ 3    ]
+[ NULL ]
+#SELECT
+#      (SELECT 1 FROM (VALUES (i1.i)) as i2(i))
+#FROM integers i1;
+% .%3 # table_name
+% %3 # name
+% tinyint # type
+% 1 # length
+[ 1    ]
+[ 1    ]
+[ 1    ]
+[ 1    ]
 #DROP FUNCTION evilfunction(INT);
 #DROP TABLE tbl_ProductSales;
 #DROP TABLE another_T;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to