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