Changeset: 6510ada37d79 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/6510ada37d79 Branch: sw_ew_c_sorting Log Message:
merged with dec2023 diffs (255 lines): diff --git a/clients/ChangeLog.Dec2023 b/clients/ChangeLog.Dec2023 --- a/clients/ChangeLog.Dec2023 +++ b/clients/ChangeLog.Dec2023 @@ -1,3 +1,8 @@ # ChangeLog file for clients # This file is updated with Maddlog +* Wed Mar 6 2024 Sjoerd Mullender <sjo...@acm.org> +- Fixed an issue where mclient wouldn't exit if the server it had + connected to exited for whatever reason while the client was waiting + for a query result. + diff --git a/clients/mapilib/mapi.c b/clients/mapilib/mapi.c --- a/clients/mapilib/mapi.c +++ b/clients/mapilib/mapi.c @@ -1674,7 +1674,7 @@ finish_handle(MapiHdl hdl) if (hdl == NULL) return MERROR; mid = hdl->mid; - if (mid->active == hdl && !hdl->needmore && + if (mid->active == hdl && !hdl->needmore && !mnstr_eof(mid->from) && read_into_cache(hdl, 0) != MOK) return MERROR; if (mid->to) { @@ -3390,7 +3390,7 @@ read_into_cache(MapiHdl hdl, int lookahe line = read_line(mid); if (line == NULL) { if (mid->from && mnstr_eof(mid->from)) { - return mapi_setError(mid, "unexpected end of file", __func__, MERROR); + return mapi_setError(mid, "unexpected end of file", __func__, MTIMEOUT); } return mid->error; } diff --git a/gdk/gdk_strimps.c b/gdk/gdk_strimps.c --- a/gdk/gdk_strimps.c +++ b/gdk/gdk_strimps.c @@ -838,10 +838,10 @@ BATsetstrimps(BAT *b) * in the BAT. */ #define STRIMP_COMPLETE(b) \ - (b)->tstrimps != NULL && \ - (b)->tstrimps != (Strimps *)1 && \ - (b)->tstrimps != (Strimps *)2 && \ - (((b)->tstrimps->strimps.free - ((char *)(b)->tstrimps->bitstrings_base - (b)->tstrimps->strimps.base)) == (b)->batCount*sizeof(uint64_t)) + ((b)->tstrimps != NULL && \ + (b)->tstrimps != (Strimps *)1 && \ + (b)->tstrimps != (Strimps *)2 && \ + (((b)->tstrimps->strimps.free - ((char *)(b)->tstrimps->bitstrings_base - (b)->tstrimps->strimps.base)) == (b)->batCount*sizeof(uint64_t))) /* Strimp creation. @@ -886,16 +886,17 @@ STRMPcreate(BAT *b, BAT *s) pb = b; } + /* First thread to take the lock will read the strimp from disk + * or construct the strimp header. + */ + MT_lock_set(&pb->batIdxLock); + /* Strimp creation was requested. There are three cases: * - The strimp is on disk (pb->tstrimps == 1) * - The strimp needs to be created (pb->tstrimps == 2) * - Finally the pointer might have been changed to NULL in another thread. */ if (pb->tstrimps == NULL || pb->tstrimps == (Strimps*)1 || pb->tstrimps == (Strimps*)2) { - /* First thread to take the lock will read the strimp - * from disk or construct the strimp header. - */ - MT_lock_set(&pb->batIdxLock); /* The strimp needs to be created. The rest of the * creation code assumes that the pointer to the strimps * is NULL. Make it so. @@ -933,10 +934,10 @@ STRMPcreate(BAT *b, BAT *s) } pb->tstrimps = r; } - MT_lock_unset(&pb->batIdxLock); } if (STRIMP_COMPLETE(pb)) { + MT_lock_unset(&pb->batIdxLock); if (pb != b) BBPunfix(pb->batCacheid); return GDK_SUCCEED; @@ -947,6 +948,10 @@ STRMPcreate(BAT *b, BAT *s) MT_thread_setalgorithm("create strimp index"); r = pb->tstrimps; STRMPincref(r); + if (pb != b) { + MT_lock_unset(&pb->batIdxLock); + MT_lock_set(&b->batIdxLock); + } dh = (uint64_t *)r->bitstrings_base + b->hseqbase; canditer_init(&ci, b, s); @@ -961,13 +966,16 @@ STRMPcreate(BAT *b, BAT *s) } bat_iterator_end(&bi); - MT_lock_set(&b->batIdxLock); + if (pb != b) { + MT_lock_unset(&b->batIdxLock); + MT_lock_set(&pb->batIdxLock); + } r->strimps.free += b->batCount*sizeof(uint64_t); /* The thread that reaches this point last needs to write the strimp to disk. */ if ((r->strimps.free - ((char *)r->bitstrings_base - r->strimps.base)) == b->batCount*sizeof(uint64_t)) { persistStrimp(pb); } - MT_lock_unset(&b->batIdxLock); + MT_lock_unset(&pb->batIdxLock); STRMPdecref(r, false); TRC_DEBUG(ACCELERATOR, "strimp creation took " LLFMT " usec\n", GDKusec()-t0); diff --git a/sql/server/rel_exp.c b/sql/server/rel_exp.c --- a/sql/server/rel_exp.c +++ b/sql/server/rel_exp.c @@ -910,6 +910,8 @@ exp_rel(mvc *sql, sql_rel *rel) e->flag = PSM_REL; e->card = is_single(rel)?CARD_ATOM:rel->card; assert(rel); + if (is_topn(rel->op)) + rel = rel->l; if (is_project(rel->op)) { sql_exp *last = rel->exps->t->data; sql_subtype *t = exp_subtype(last); @@ -2328,8 +2330,13 @@ exp_rel_update_exp(mvc *sql, sql_exp *e, return e; case e_psm: if (exp_is_rel(e)) { - sql_rel *r = exp_rel_get_rel(sql->sa, e); - e = r->exps->t->data; + sql_rel *r = exp_rel_get_rel(sql->sa, e), *nr = r; + if (is_topn(r->op)) { + nr = r->l; + if (nr && !is_project(nr->op)) + r->l = nr = rel_project(sql->sa, nr, rel_projections(sql, nr, NULL, 1, 0)); + } + e = nr->exps->t->data; e = exp_ref(sql, e); if (up) set_freevar(e, 1); diff --git a/sql/server/rel_optimize_sel.c b/sql/server/rel_optimize_sel.c --- a/sql/server/rel_optimize_sel.c +++ b/sql/server/rel_optimize_sel.c @@ -2589,15 +2589,17 @@ rel_rewrite_semijoin(visitor *v, sql_rel if (exp_find_column(rl, ne->l, -2) == cl) { sql_exp *e = (or != r)?rel_find_exp(or, re):re; - equal = exp_match_exp(ne->r, e); - if (!equal) + if (e) + equal = exp_match_exp(ne->r, e); + if (!e || !equal) return rel; re = ne->r; } else if (exp_find_column(rl, ne->r, -2) == cl) { sql_exp *e = (or != r)?rel_find_exp(or, re):re; - equal = exp_match_exp(ne->l, e); - if (!equal) + if (e) + equal = exp_match_exp(ne->l, e); + if (!e || !equal) return rel; re = ne->l; } else diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c --- a/sql/server/rel_select.c +++ b/sql/server/rel_select.c @@ -4613,7 +4613,8 @@ rel_groupings(sql_query *query, sql_rel next_set = list_append(new_exp_list(sql->sa), new_exp_list(sql->sa)); } if (is_sql_group_totals(f)) { /* if there are no sets, set the found one, otherwise calculate cartesian product and merge the distinct ones */ - assert(next_set); + if (!next_set) + return sql_error(sql, 02, SQLSTATE(42000) "GROUP BY: GROUPING SETS is empty"); if (!*sets) *sets = next_set; else diff --git a/sql/test/BugTracker-2023/Tests/misc-crashes-7390.test b/sql/test/BugTracker-2023/Tests/misc-crashes-7390.test --- a/sql/test/BugTracker-2023/Tests/misc-crashes-7390.test +++ b/sql/test/BugTracker-2023/Tests/misc-crashes-7390.test @@ -241,7 +241,7 @@ DROP TABLE v0 statement ok CREATE TABLE v0(v1 INT) -statement error 42000!CATALOG: no such function 'sys'.'=' +statement ok UPDATE v0 SET v1 = (WITH v0 AS (SELECT 42039652.000000) SELECT STDDEV_POP (96) OVER (ORDER BY v1) FROM v0, v0 LIMIT 37 OFFSET 62) = 8 statement ok @@ -259,8 +259,7 @@ query I nosort WITH v0 (v1) AS (SELECT 127 FROM v0 WHERE (v1 < 2147483647 OR v1 > -1) AND v1 / v1 + v1 <= 95 = v1 >= -128 + 15) SELECT 38 ^ v1 FROM v0 AS v3 WINDOW v2 AS ( ), v4 AS (GROUPS BETWEEN -32768 PRECEDING AND 94 FOLLOWING) LIMIT 16 OFFSET 8 ---- -skipif knownfail -statement ok +statement error 42000!SELECT: identifier 'v1' ambiguous UPDATE v0 SET v1 = (WITH v0 (v1) AS (SELECT 127 WHERE (v1 < 2147483647 OR v1 > -1) AND v1 / v1 + v1 <= 95 = v1 >= -128 + 15) SELECT 38 FROM v0 AS v3 WINDOW v2 AS ( ), v4 AS (GROUPS BETWEEN -32768 PRECEDING AND 94 FOLLOWING) LIMIT 16 OFFSET 8) ^ v1 -- sql/server/rel_select.c:3104: rel_binop_: Assertion `t1 && t2' failed. @@ -335,7 +334,6 @@ statement error 42000!SELECT: identifier WITH v0 AS (SELECT v1 * (95 - v1) FROM v0 ORDER BY v1, v1 DESC, ('x' < v1 AND v1 = 24)) SELECT 67 + 0 + -1 + 96 + 46463082.000000 + 30 AS v2 FROM v0 WHERE 255 = v1 LIMIT 66 OFFSET 16 ---- -skipif knownfail statement ok UPDATE v0 SET v1 = -128 WHERE v1 = 1 AND v1 IN (WITH v0 AS (SELECT v1 * (95 - v1) FROM v0 ORDER BY v1, v1 DESC, ('x' < v1 AND v1 = 24)) SELECT 67 + 0 + -1 + 96 + 46463082.000000 + 30 AS v2 FROM v0 WHERE 255 = v1 LIMIT 66 OFFSET 16) OR (69 AND 30) OR ('x' >= 9) @@ -374,6 +372,14 @@ skipif knownfail query IT nosort SELECT * , 'x' FROM v0 WHERE (SELECT 39 WHERE (v1 + -32768 NOT IN (14, 255))) * 87 + 2147483647 ---- +0 +x +67 +x +127 +x +-1 +x -- mul_bte_bte_bte: ERROR: 22003!overflow in calculation 87*39. @@ -442,8 +448,7 @@ statement ok DROP TABLE v0 -- 29.sql -skipif knownfail -statement error +statement error 42000!GROUP BY: GROUPING SETS is empty SELECT ALL ( SELECT - - - - - - - - - - 48 FROM ( SELECT NULL - - - - - - - - 89 FROM ( VALUES ( - - - - - - - - - - 74 ) , ( - - - - - 128 ) , ( - - - - - - 8 ) , ( - - - - 61 ) ) AS v1 ( v1 ) GROUP BY ( ) , GROUPING SETS ( GROUPING SETS ( GROUPING SETS ( ( ) ) ) ) , ( ) ORDER BY - - - - - - - - - - 255 LIKE v1 / CASE WHEN v1 IS NULL THEN - - 75 END DESC , v1 , v1 LIMIT 63 ) AS v1 UNION SELECT - - - - - - - - - - - - - 74 WHERE - v1 < - 89088397.000000 ) FROM ( SELECT * FROM ( VALUES ( - - - - - - - 61 ) , ( - - - 42 ) ) AS v1 ( v1 ) ) AS v1 ( v1 ) -- sql/server/rel_select.c:4616: rel_groupings: Assertion `next_set' failed. @@ -523,7 +528,7 @@ statement ok INSERT INTO v0(v1) VALUES (10),(10),(NULL),(3) statement ok -SELECT DISTINCT group_concat(v0.v1, v1) FROM v0, v0 AS e, v0 AS c GROUP BY v0.v1 +SELECT DISTINCT group_concat(v0.v1, c.v1) FROM v0, v0 AS e, v0 AS c GROUP BY v0.v1 statement ok DROP TABLE v0 @@ -565,8 +570,7 @@ CREATE TABLE v0(v2 DOUBLE, v1 REAL) statement error 42S22!SELECT: no such column 'v0.v2' SELECT 2 FROM v0 AS WHERE v0 . v2 = ( SELECT v2 WHERE v2 = 2 ) + v0 . v1 -skipif knownfail -statement error 42S22!SELECT: no such column 'v0.v2' +statement ok DELETE FROM v0 WHERE EXISTS ( SELECT 2 FROM v0 AS WHERE v0 . v2 = ( SELECT v2 WHERE v2 = 2 ) + v0 . v1 ) statement ok _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org