Changeset: f5c2afae23d2 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/f5c2afae23d2
Modified Files:
sql/server/rel_unnest.c
Branch: privfuncs
Log Message:
Merged with default
diffs (276 lines):
diff --git a/cmake/monetdb-defines.cmake b/cmake/monetdb-defines.cmake
--- a/cmake/monetdb-defines.cmake
+++ b/cmake/monetdb-defines.cmake
@@ -46,7 +46,10 @@ function(monetdb_configure_defines)
check_include_file("sys/un.h" HAVE_SYS_UN_H)
check_include_file("sys/wait.h" HAVE_SYS_WAIT_H)
check_include_file("unistd.h" HAVE_UNISTD_H)
- check_include_file("uuid/uuid.h" HAVE_UUID_UUID_H)
+ cmake_push_check_state()
+ set(CMAKE_REQUIRED_INCLUDES
"${CMAKE_REQUIRED_INCLUDES};${UUID_INCLUDE_DIR}")
+ check_include_file("uuid/uuid.h" HAVE_UUID_UUID_H)
+ cmake_pop_check_state()
check_include_file("winsock2.h" HAVE_WINSOCK_H)
find_library(GETOPT_LIB "getopt.lib")
diff --git a/gdk/CMakeLists.txt b/gdk/CMakeLists.txt
--- a/gdk/CMakeLists.txt
+++ b/gdk/CMakeLists.txt
@@ -89,6 +89,7 @@ target_sources(bat
target_include_directories(bat
PUBLIC
+
$<$<BOOL:${UUID_FOUND}>:$<TARGET_PROPERTY:UUID::UUID,INTERFACE_INCLUDE_DIRECTORIES>>
$<TARGET_PROPERTY:stream,INTERFACE_INCLUDE_DIRECTORIES>
$<TARGET_PROPERTY:matomic,INTERFACE_INCLUDE_DIRECTORIES>
$<TARGET_PROPERTY:mstring,INTERFACE_INCLUDE_DIRECTORIES>
@@ -105,6 +106,7 @@ target_link_libraries(bat
mutils
$<$<NOT:$<PLATFORM_ID:Windows>>:m>
$<$<PLATFORM_ID:Windows>:ws2_32>
+ $<$<BOOL:${UUID_FOUND}>:UUID::UUID>
$<$<BOOL:${KVM_FOUND}>:KVM::KVM>
${CMAKE_DL_LIBS}
Threads::Threads)
diff --git a/monetdb5/mal/mal_profiler.c b/monetdb5/mal/mal_profiler.c
--- a/monetdb5/mal/mal_profiler.c
+++ b/monetdb5/mal/mal_profiler.c
@@ -487,12 +487,12 @@ renderProfilerEvent(Client cntxt, MalBlk
* We should use an OS define to react to the maximal cores
*/
-#define MAXCPU 256
-#define LASTCPU (MAXCPU - 1)
+#define MAXCORES 256
+#define LASTCPU (MAXCORES - 1)
static struct{
lng user, nice, system, idle, iowait;
double load;
-} corestat[MAXCPU];
+} corestat[MAXCORES];
static int
getCPULoad(char cpuload[BUFSIZ]){
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
@@ -1559,6 +1559,13 @@ rel_unnest_dependent(mvc *sql, sql_rel *
rel->r = l;
rel->op = op_left;
return rel_unnest_dependent(sql, rel);
+ } else if (rel->op == op_left &&
!rel_has_freevar(sql, rel->r) && rel_dependent_var(sql, rel->r, rel->l)) {
+ sql_rel *l = rel->l;
+
+ rel->l = rel->r;
+ rel->r = l;
+ rel->op = op_right;
+ return rel_unnest_dependent(sql, rel);
}
}
}
@@ -1744,7 +1751,13 @@ rewrite_inner(mvc *sql, sql_rel *rel, sq
op = op_left;
if (is_join(rel->op)){
- if (is_right(rel->op))
+ if (rel_has_freevar(sql, inner)) {
+ list *rv = rel_dependent_var(sql, rel->r, inner);
+ if (!list_empty(rv))
+ d = rel->r = rel_crossproduct(sql->sa, rel->r,
inner, op);
+ else
+ d = rel->l = rel_crossproduct(sql->sa, rel->l,
inner, op);
+ } else if (is_right(rel->op))
d = rel->l = rel_crossproduct(sql->sa, rel->l, inner,
op);
else
d = rel->r = rel_crossproduct(sql->sa, rel->r, inner,
op);
@@ -2246,24 +2259,6 @@ rewrite_aggregates(visitor *v, sql_rel *
return rel;
}
-static sql_exp*
-has_or(visitor *v, sql_rel *rel, sql_exp *e, int depth)
-{
- (void)rel;
- (void)depth;
- if(!v->data && e && is_compare(e->type) && e->flag == cmp_or)
- v->data = e;
- return e;
-}
-
-static bool
-exps_have_or_exp(mvc *sql, list *exps)
-{
- visitor v = { .sql = sql, .data = NULL };
- exps_exp_visitor_topdown(&v, NULL, exps, 0, &has_or, true);
- return v.data != NULL;
-}
-
static inline sql_rel *
rewrite_split_select_exps(visitor *v, sql_rel *rel)
{
@@ -2740,10 +2735,8 @@ rewrite_anyequal(visitor *v, sql_rel *re
join =
(is_full(rel->op)||is_left(rel->op))?rel->r:rel->l;
}
if (rsq) {
- sql_rel *rewrite = NULL;
- (void)rewrite_inner(sql, rel, rsq,
op_left, &rewrite);
- exp_reset_props(rewrite, re,
is_left(rewrite->op));
- join =
(is_full(rel->op)||is_left(rel->op))?rel->r:rel->l;
+ (void)rewrite_inner(sql, rel, rsq,
op_left, &join);
+ exp_reset_props(join, re,
is_left(join->op));
}
assert(join && is_join(join->op));
if (join && !join->exps)
@@ -3177,16 +3170,18 @@ rewrite_exists(visitor *v, sql_rel *rel,
if (!is_project(sq->op) || (is_set(sq->op) &&
list_length(sq->exps) > 1) || (is_simple_project(sq->op) && !list_empty(sq->r)))
sq = rel_project(v->sql->sa, sq,
rel_projections(v->sql, sq, NULL, 1, 1));
le = rel_reduce2one_exp(v->sql, sq);
- le = exp_ref(v->sql, le);
- if (is_project(rel->op) && is_freevar(le)) {
+ if (is_project(sq->op) && is_freevar(le)) {
sql_exp *re, *jc, *null;
re = rel_bound_exp(v->sql, sq);
+ sq->exps = sa_list(v->sql->sa);
re = rel_project_add_exp(v->sql, sq, re);
jc = rel_unop_(v->sql, NULL, re, "sys",
"isnull", card_value);
set_has_no_nil(jc);
null = exp_null(v->sql->sa, exp_subtype(le));
le = rel_nop_(v->sql, NULL, jc, null, le, NULL,
"sys", "ifthenelse", card_value);
+ } else {
+ le = exp_ref(v->sql, le);
}
if (is_project(rel->op) || depth > 0 ||
is_outerjoin(rel->op)) {
@@ -3740,10 +3735,6 @@ rewrite_outer2inner_union_(visitor *v, s
static sql_rel *
rewrite_outer2inner_union(visitor *v, sql_rel *rel)
{
- if (is_outerjoin(rel->op) && !list_empty(rel->exps) &&
- (exps_have_freevar(v->sql, rel->exps) &&
exps_have_rel_exp(rel->exps) &&
- (exps_have_anyequal(rel->exps,
ANYEQUAL|NOT_ANYEQUAL) || exps_have_or_exp(v->sql, rel->exps))))
- return rewrite_outer2inner_union_(v, rel);
if (is_full(rel->op) && rel_has_freevar(v->sql, rel->r)) { /* swap */
sql_rel *s = rel->r;
rel->r = rel->l;
diff --git a/sql/test/SQLancer/Tests/sqlancer22.test
b/sql/test/SQLancer/Tests/sqlancer22.test
--- a/sql/test/SQLancer/Tests/sqlancer22.test
+++ b/sql/test/SQLancer/Tests/sqlancer22.test
@@ -682,9 +682,91 @@ on 4 > all(select x.x) and (x.x > 0 or x
----
2
+query I nosort
+SELECT 1 FROM t0 LEFT JOIN (SELECT 2) AS x(x) ON (VALUES (t0.c0), (x.x))
+----
+
+query I nosort
+SELECT 1 FROM t0 LEFT JOIN (SELECT 2) AS x(x) ON (SELECT t0.c0 UNION ALL
SELECT x.x) > 0
+----
+
+query I nosort
+SELECT min((SELECT t0.c0 + t0.c0)) FROM t0
+----
+NULL
+
+query I nosort
+SELECT min((SELECT CASE t0.c0 WHEN t0.c0 THEN t0.c0 END)) FROM t0
+----
+NULL
+
statement ok
ROLLBACK
+statement error 42000!SELECT: cannot use non GROUP BY column 'y.y' in query
results without an aggregate function
+SELECT y.y BETWEEN 1 AND max(x.x) FROM (SELECT 1) x(x), (SELECT 1) y(y)
+
+statement error 42000!SELECT: cannot use non GROUP BY column 'y.y' in query
results without an aggregate function
+SELECT y.y BETWEEN max(x.x) AND 1 FROM (SELECT 1) x(x), (SELECT 1) y(y)
+
+statement error 42000!SELECT: cannot use non GROUP BY column 'y.y' in query
results without an aggregate function
+SELECT 1 BETWEEN y.y AND max(x.x) FROM (SELECT 1) x(x), (SELECT 1) y(y)
+
+statement error 42000!SELECT: cannot use non GROUP BY column 'y.y' in query
results without an aggregate function
+SELECT y.y BETWEEN 1 AND max(x.x) FROM (SELECT 1) x(x), (SELECT 1) y(y)
+
+statement error 42000!SELECT: cannot use non GROUP BY column 'y.y' in query
results without an aggregate function
+SELECT y.y LIKE max(x.x) FROM (SELECT '1') x(x), (SELECT '1') y(y)
+
+statement error 42000!SELECT: cannot use non GROUP BY column 'x.x' in query
results without an aggregate function
+SELECT max(y.y) LIKE x.x FROM (SELECT '1') x(x), (SELECT '1') y(y)
+
+statement error 42000!SELECT: cannot use non GROUP BY column 'y.y' in query
results without an aggregate function
+SELECT [y.y] "like" [max(x.x), '', false] FROM (SELECT '1') x(x), (SELECT '1')
y(y)
+
+statement error 42000!SELECT: cannot use non GROUP BY column 'x.x' in query
results without an aggregate function
+SELECT [max(y.y)] "like" [x.x, '', false] FROM (SELECT '1') x(x), (SELECT '1')
y(y)
+
+statement error 42000!SELECT: cannot use non GROUP BY column 'y.y' in query
results without an aggregate function
+SELECT y.y IN (max(x.x)) FROM (SELECT 1) x(x), (SELECT 1) y(y)
+
+statement error 42000!SELECT: cannot use non GROUP BY column 'y.y' in query
results without an aggregate function
+SELECT y.y AND max(x.x) FROM (SELECT 1) x(x), (SELECT 1) y(y)
+
+statement error 42000!SELECT: cannot use non GROUP BY column 'y.y' in query
results without an aggregate function
+SELECT y.y OR max(x.x) FROM (SELECT 1) x(x), (SELECT 1) y(y)
+
+statement error 42000!SELECT: cannot use non GROUP BY column 'y.y' in query
results without an aggregate function
+SELECT y.y + max(x.x) FROM (SELECT 1) x(x), (SELECT 1) y(y)
+
+statement error 42000!SELECT: cannot use non GROUP BY column 'y.y' in query
results without an aggregate function
+SELECT case y.y when max(x.x) then 1 end FROM (SELECT 1) x(x), (SELECT 1) y(y)
+
+statement error 42000!SELECT: cannot use non GROUP BY column 'x.x' in query
results without an aggregate function
+SELECT case 2 when x.x then min(y.y) end FROM (SELECT 1) x(x), (SELECT 1) y(y)
+
+statement error 42000!SELECT: cannot use non GROUP BY column 'x.x' in query
results without an aggregate function
+SELECT case x.x when 2 then min(y.y) end FROM (SELECT 1) x(x), (SELECT 1) y(y)
+
+statement error 42000!SELECT: cannot use non GROUP BY column 'x.x' in query
results without an aggregate function
+SELECT case 1 when 2 then x.x when max(y.y) then 3 end FROM (SELECT 1) x(x),
(SELECT 1) y(y)
+
+statement error 42000!SELECT: cannot use non GROUP BY column 'y.y' in query
results without an aggregate function
+SELECT y.y FROM (SELECT 1) x(x), (SELECT 1) y(y) order by min(x.x)
+
+statement error 42000!SELECT: cannot use non GROUP BY column 'y.y' in query
results without an aggregate function
+SELECT ntile(y.y) over () FROM (SELECT 1) x(x), (SELECT 1) y(y) order by
min(x.x)
+
+query I nosort
+SELECT ['1'] "like" [max(x.x), '', false] FROM (SELECT '1') x(x), (SELECT '1')
y(y)
+----
+1
+
+query I nosort
+SELECT [max(y.y)] "like" ['1', '', false] FROM (SELECT '1') x(x), (SELECT '1')
y(y)
+----
+1
+
statement error Subquery has too many columns
select 1 where (2,3) in (select x,y,2 from (values (2, 3), (4, 5)) x(x,y))
diff --git a/tools/merovingian/client/Tests/monetdb_snapshot.py
b/tools/merovingian/client/Tests/monetdb_snapshot.py
--- a/tools/merovingian/client/Tests/monetdb_snapshot.py
+++ b/tools/merovingian/client/Tests/monetdb_snapshot.py
@@ -30,8 +30,9 @@ with Runner(False) as run:
header('CHECK SNAPDIR NOT SET')
output = m.run_monetdbd('get', 'snapshotdir', output=True)
- assert '<unknown>' in output
- note("""'<unknown>' in output""")
+ run.print(' -->', repr(output))
+ assert '<unset>' in output
+ note("""'<unset>' in output as expected""")
header('TRY TO CREATE')
try:
diff --git a/tools/mserver/CMakeLists.txt b/tools/mserver/CMakeLists.txt
--- a/tools/mserver/CMakeLists.txt
+++ b/tools/mserver/CMakeLists.txt
@@ -80,6 +80,7 @@ target_link_libraries(shutdowntest
bat
stream
monetdb5
+ $<$<NOT:$<PLATFORM_ID:Windows>>:m>
$<$<PLATFORM_ID:Windows>:${GETOPT_LIB}>
Threads::Threads)
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]