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 -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org