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

Reply via email to