Changeset: ca951934183a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/ca951934183a
Modified Files:
        gdk/gdk_bbp.c
        gdk/gdk_select.c
        gdk/gdk_string.c
        monetdb5/mal/mal_interpreter.c
        sql/server/rel_rel.c
Branch: default
Log Message:

Merged with Jul2021


diffs (truncated from 415 to 300 lines):

diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -2005,6 +2005,7 @@ BBPdir_last(int n, char *buf, size_t buf
        }
        if (fclose(nbbpf) == EOF) {
                GDKsyserror("Closing BBP.dir file failed\n");
+               nbbpf = NULL;   /* can't close again */
                goto bailout;
        }
 
@@ -2862,7 +2863,8 @@ decref(bat i, bool logical, bool release
                        if (b->tvheap)
                                b->tvheap->dirty = true;
                }
-               farmid = b->theap->farmid;
+               if (b->theap)
+                       farmid = b->theap->farmid;
                MT_lock_unset(&b->theaplock);
        }
 
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -985,13 +985,14 @@ logger_create_types_file(logger *lg, con
                     && fsync(fileno(fp)) < 0
 #endif
            )) {
+               GDKsyserror("flushing log file %s failed", filename);
+               fclose(fp);
                MT_remove(filename);
-               GDKerror("flushing log file %s failed", filename);
                return GDK_FAIL;
        }
        if (fclose(fp) < 0) {
+               GDKsyserror("closing log file %s failed", filename);
                MT_remove(filename);
-               GDKerror("closing log file %s failed", filename);
                return GDK_FAIL;
        }
        return GDK_SUCCEED;
@@ -1674,8 +1675,10 @@ bm_subcommit(logger *lg)
                i = subcommit_list_add(i, n, sizes, ids->batCacheid, 
BATcount(ids));
                i = subcommit_list_add(i, n, sizes, vals->batCacheid, 
BATcount(ids));
 
-               r[rcnt++] = lg->seqs_id->batCacheid;
-               r[rcnt++] = lg->seqs_val->batCacheid;
+               if (BBP_lrefs(lg->seqs_id->batCacheid) > 0)
+                       r[rcnt++] = lg->seqs_id->batCacheid;
+               if (BBP_lrefs(lg->seqs_val->batCacheid) > 0)
+                       r[rcnt++] = lg->seqs_val->batCacheid;
 
                logbat_destroy(lg->seqs_id);
                logbat_destroy(lg->seqs_val);
diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -1950,6 +1950,8 @@ BATselect(BAT *b, BAT *s, const void *tl
 
        bn = COLnew(0, TYPE_oid, estimate, TRANSIENT);
        if (bn == NULL) {
+               if (havehash)
+                       MT_rwlock_rdunlock(&b->thashlock);
                bat_iterator_end(&bi);
                return NULL;
        }
diff --git a/gdk/gdk_string.c b/gdk/gdk_string.c
--- a/gdk/gdk_string.c
+++ b/gdk/gdk_string.c
@@ -758,6 +758,13 @@ concat_strings(BAT **bnp, ValPtr pt, BAT
        assert((bnp == NULL) != (pt == NULL));
        /* if pt not NULL, only a single group allowed */
        assert(pt == NULL || ngrp == 1);
+
+       bi = bat_iterator(b);
+       if (sep)
+               bis = bat_iterator(sep);
+       else
+               separator_length = strlen(separator);
+
        if (bnp) {
                if ((bn = COLnew(min, TYPE_str, ngrp, TRANSIENT)) == NULL) {
                        rres = GDK_FAIL;
@@ -766,12 +773,6 @@ concat_strings(BAT **bnp, ValPtr pt, BAT
                *bnp = bn;
        }
 
-       bi = bat_iterator(b);
-       if (sep)
-               bis = bat_iterator(sep);
-       else
-               separator_length = strlen(separator);
-
        if (ngrp == 1) {
                size_t offset = 0, single_length = 0;
                bool empty = true;
diff --git a/monetdb5/mal/mal_interpreter.c b/monetdb5/mal/mal_interpreter.c
--- a/monetdb5/mal/mal_interpreter.c
+++ b/monetdb5/mal/mal_interpreter.c
@@ -845,7 +845,8 @@ str runMALsequence(Client cntxt, MalBlkP
                                lhs = &backup[i];
                                if (BATatoms[lhs->vtype].atomUnfix &&
                                        
(*BATatoms[lhs->vtype].atomUnfix)(VALget(lhs)) != GDK_SUCCEED) {
-                                       ret = createException(MAL, 
"mal.propertyCheck", GDK_EXCEPTION);
+                                       if (ret == MAL_SUCCEED)
+                                               ret = createException(MAL, 
"mal.propertyCheck", GDK_EXCEPTION);
                                }
                                if (ATOMextern(lhs->vtype) &&
                                        lhs->val.pval &&
diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -932,7 +932,7 @@ read_exp_properties(mvc *sql, sql_exp *e
 static sql_exp*
 exp_read(mvc *sql, sql_rel *lrel, sql_rel *rrel, list *top_exps, char *r, int 
*pos, int grp)
 {
-       int f = -1, not = 1, old, d=0, s=0, unique = 0, no_nils = 0, quote = 0, 
zero_if_empty = 0;
+       int f = -1, old, d=0, s=0, unique = 0, no_nils = 0, quote = 0, 
zero_if_empty = 0;
        char *tname = NULL, *cname = NULL, *var_cname = NULL, *e, *b = r + 
*pos, *st;
        sql_exp *exp = NULL;
        list *exps = NULL;
@@ -966,17 +966,19 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                cname = sa_strdup(sql->sa, cname);
                *e = old;
                skipWS(r, pos);
-               if (top_exps) {
-                       exp = exps_bind_column2(top_exps, tname, cname, NULL);
-                       if (exp)
-                               exp = exp_alias_or_copy(sql, tname, cname, 
lrel, exp);
-               }
-               if (!exp && lrel) {
-                       exp = rel_bind_column2(sql, lrel, tname, cname, 0);
-                       if (!exp && rrel)
-                               exp = rel_bind_column2(sql, rrel, tname, cname, 
0);
-               } else if (!exp) {
-                       exp = exp_column(sql->sa, tname, cname, NULL, 
CARD_ATOM, 1, cname[0] == '%');
+               if (r[*pos] != '(') { /* if there's a function/aggregate call 
next don't attempt to bind columns */
+                       if (top_exps) {
+                               exp = exps_bind_column2(top_exps, tname, cname, 
NULL);
+                               if (exp)
+                                       exp = exp_alias_or_copy(sql, tname, 
cname, lrel, exp);
+                       }
+                       if (!exp && lrel) {
+                               exp = rel_bind_column2(sql, lrel, tname, cname, 
0);
+                               if (!exp && rrel)
+                                       exp = rel_bind_column2(sql, rrel, 
tname, cname, 0);
+                       } else if (!exp) {
+                               exp = exp_column(sql->sa, tname, cname, NULL, 
CARD_ATOM, 1, cname[0] == '%');
+                       }
                }
                break;
        /* atom */
@@ -1222,10 +1224,25 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                                        }
                                }
                        }
-                       if (f)
+                       if (f) {
                                exp = exp_op(sql->sa, list_empty(exps) ? NULL : 
exps, f);
-                       else
+                               if (is_compare_func(f)) { /* has to parse 
any/all */
+                                       skipWS(r,pos);
+                                       /* [ ANY|ALL ] */
+                                       if (strncmp(r+*pos, "ANY",  
strlen("ANY")) == 0) {
+                                               (*pos)+= (int) strlen("ANY");
+                                               skipWS(r, pos);
+                                               exp->flag = 1;
+                                       }
+                                       if (strncmp(r+*pos, "ALL",  
strlen("ALL")) == 0) {
+                                               (*pos)+= (int) strlen("ALL");
+                                               skipWS(r, pos);
+                                               exp->flag = 2;
+                                       }
+                               }
+                       } else {
                                return sql_error(sql, ERR_NOTFOUND, 
SQLSTATE(42000) "Function '%s%s%s %d' not found\n", tname ? tname : "", tname ? 
"." : "", cname, nops);
+                       }
                }
        }
 
@@ -1276,6 +1293,16 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                return NULL;
        }
 
+       /* [ NOT NULL ] */
+       if (strncmp(r+*pos, "NOT NULL",  strlen("NOT NULL")) == 0) {
+               (*pos)+= (int) strlen("NOT NULL");
+               skipWS(r, pos);
+               set_has_no_nil(exp);
+       }
+
+       if (!(exp = read_exp_properties(sql, exp, r, pos)))
+               return NULL;
+
        if (r[*pos] == '!') {
                (*pos)++;
                skipWS(r, pos);
@@ -1287,70 +1314,6 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                set_semantics(exp);
        }
 
-       /* [ ANY|ALL ] */
-       if (strncmp(r+*pos, "ANY",  strlen("ANY")) == 0) {
-               (*pos)+= (int) strlen("ANY");
-               skipWS(r, pos);
-               exp->flag = 1;
-       }
-       if (strncmp(r+*pos, "ALL",  strlen("ALL")) == 0) {
-               (*pos)+= (int) strlen("ALL");
-               skipWS(r, pos);
-               exp->flag = 2;
-       }
-       /* [ ASC ] */
-       if (strncmp(r+*pos, "ASC",  strlen("ASC")) == 0) {
-               (*pos)+= (int) strlen("ASC");
-               skipWS(r, pos);
-               set_ascending(exp);
-       }
-       /* [ NULLS LAST ] */
-       if (strncmp(r+*pos, "NULLS LAST",  strlen("NULLS LAST")) == 0) {
-               (*pos)+= (int) strlen("NULLS LAST");
-               skipWS(r, pos);
-               set_nulls_last(exp);
-       }
-       /* [ NOT ] NULL */
-       if (strncmp(r+*pos, "NOT",  strlen("NOT")) == 0) {
-               (*pos)+= (int) strlen("NOT");
-               skipWS(r, pos);
-               not = 1;
-       }
-       if (strncmp(r+*pos, "NULL",  strlen("NULL")) == 0) {
-               (*pos)+= (int) strlen("NULL");
-               skipWS(r, pos);
-               if (not)
-                       set_has_no_nil(exp);
-       }
-
-       if (!(exp = read_exp_properties(sql, exp, r, pos)))
-               return NULL;
-       skipWS(r,pos);
-
-       /* as alias */
-       if (strncmp(r+*pos, "as", 2) == 0) {
-               (*pos)+=2;
-               skipWS(r, pos);
-
-               tname = r+*pos+1;
-               skipIdent(r, pos);
-               convertIdent(tname);
-               (*pos)++;
-               if (r[*pos] != '.') {
-                       cname = tname;
-                       exp_setname(sql->sa, exp, NULL, cname);
-                       skipWS(r, pos);
-               } else {
-                       (*pos)++;
-                       cname = r+*pos+1;
-                       skipIdent(r, pos);
-                       convertIdent(cname);
-                       (*pos)++;
-                       skipWS(r, pos);
-                       exp_setname(sql->sa, exp, tname, cname);
-               }
-       }
-       skipWS(r, pos);
        switch(r[*pos]) {
        case 'a':
                if (strncmp(r+*pos, "any =",  strlen("any =")) == 0) {
@@ -1414,11 +1377,8 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                        (*pos)++;
                }
                break;
-       case ',':
-       case ']':
-       case ')':
        default:
-               return exp;
+               break;
        }
        if (f >= 0) {
                skipWS(r,pos);
@@ -1426,7 +1386,10 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                        list *exps = read_exps(sql, lrel, rrel, top_exps, r, 
pos, '(', 0, 0);
                        if (!exps)
                                return NULL;
-                       return exp_in(sql->sa, exp, exps, f);
+                       sql_exp *ne = exp_in(sql->sa, exp, exps, f);
+                       if (is_anti(exp))
+                               set_anti(ne);
+                       exp = ne;
                } else {
                        int sym = 0;
                        sql_exp *e = exp_read(sql, lrel, rrel, top_exps, r, 
pos, 0);
@@ -1443,20 +1406,63 @@ exp_read(mvc *sql, sql_rel *lrel, sql_re
                                sym = 1;
                        }
                        if (e->type == e_cmp) {
-                               sql_exp *ne = exp_compare2(sql->sa, e->l, exp, 
e->r, compare2range(swap_compare((comp_type)f), e->flag), sym);
-                               if (is_anti(exp))
-                                       set_anti(ne);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to