Changeset: 5ca36b934b78 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5ca36b934b78
Modified Files:
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: linear-hashing
Log Message:
Fixed unnesting on list of values
diffs (162 lines):
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
@@ -50,6 +50,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;
}
@@ -113,8 +116,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;
}
@@ -237,6 +243,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;
}
@@ -449,6 +458,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;
}
@@ -753,7 +765,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