Changeset: 0112adfa9517 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/0112adfa9517
Modified Files:
        sql/backends/monet5/sql_scenario.c
        sql/server/rel_optimizer.c
Branch: default
Log Message:

Merged with Jul2021


diffs (truncated from 642 to 300 lines):

diff --git a/monetdb5/modules/kernel/bat5.c b/monetdb5/modules/kernel/bat5.c
--- a/monetdb5/modules/kernel/bat5.c
+++ b/monetdb5/modules/kernel/bat5.c
@@ -854,6 +854,11 @@ BKCshrinkBAT(bat *ret, const bat *bid, c
                uint16_t width = bi.width;
 
                switch (width) {
+               case 0:
+                       bat_iterator_end(&bi);
+                       BBPunfix(b->batCacheid);
+                       BBPunfix(bn->batCacheid);
+                       throw(MAL, "bat.shrink", SQLSTATE(42000) "bat.shrink 
not available for 0 width types");
                case 1:shrinkloop(bte); break;
                case 2:shrinkloop(sht); break;
                case 4:shrinkloop(int); break;
@@ -1014,12 +1019,18 @@ BKCreuseBAT(bat *ret, const bat *bid, co
                                BBPunfix(bn->batCacheid);
                                BBPunfix(b->batCacheid);
                                BBPunfix(bs->batCacheid);
-                               throw(MAL, "bat.shrink", GDK_EXCEPTION);
+                               throw(MAL, "bat.reuse", GDK_EXCEPTION);
                        }
                }
        } else {
                BUN n = 0;
                switch (bi.width) {
+               case 0:
+                       bat_iterator_end(&bi);
+                       BBPunfix(bn->batCacheid);
+                       BBPunfix(b->batCacheid);
+                       BBPunfix(bs->batCacheid);
+                       throw(MAL, "bat.reuse", SQLSTATE(42000) "bat.reuse not 
available for 0 width types");
                case 1:
                        reuseloop(bte);
                        break;
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -1522,7 +1522,7 @@ exp_bin(backend *be, sql_exp *e, stmt *l
                                /* value compare or select */
                                if ((!reduce || (l->nrcols == 0 && r->nrcols == 
0)) && (e->flag == mark_in || e->flag == mark_notin)) {
                                        int in_flag = e->flag==mark_in?1:0;
-                                       if (e->anti)
+                                       if (is_anti(e))
                                                in_flag = !in_flag;
                                        sql_subfunc *f = sql_bind_func(sql, 
"sys", in_flag?"=":"<>", tail_type(l), tail_type(l), F_FUNC);
                                        assert(f);
@@ -2602,7 +2602,7 @@ rel2bin_join(backend *be, sql_rel *rel, 
        } else {
                stmt *l = bin_find_smallest_column(be, left);
                stmt *r = bin_find_smallest_column(be, right);
-               join = stmt_join(be, l, r, 0, cmp_all, 0, 0, rel->single);
+               join = stmt_join(be, l, r, 0, cmp_all, 0, 0, is_single(rel));
        }
        jl = stmt_result(be, join, 0);
        jr = stmt_result(be, join, 1);
@@ -2667,7 +2667,7 @@ rel2bin_join(backend *be, sql_rel *rel, 
                stmt *l = ld = stmt_mirror(be, bin_find_smallest_column(be, 
left));
                if (rel->op == op_left || rel->op == op_full)
                        ld = stmt_tdiff(be, ld, jl, NULL);
-               if (rel->single && !list_empty(rel->exps)) {
+               if (is_single(rel) && !list_empty(rel->exps)) {
                        join = stmt_semijoin(be, l, jl, NULL, NULL, 0, true);
                        jl = stmt_result(be, join, 0);
                        jr = stmt_project(be, stmt_result(be, join, 1), jr);
@@ -2867,7 +2867,7 @@ rel2bin_semijoin(backend *be, sql_rel *r
                                stmt *s = NULL;
 
                                /* only handle simple joins here */
-                               if ((exp_has_func(e) && e->flag != cmp_filter) 
|| e->flag == cmp_or || (e->f && e->anti)) {
+                               if ((exp_has_func(e) && e->flag != cmp_filter) 
|| e->flag == cmp_or || (e->f && is_anti(e))) {
                                        if (!join && !list_length(lje)) {
                                                stmt *l = 
bin_find_smallest_column(be, left);
                                                stmt *r = 
bin_find_smallest_column(be, right);
@@ -2898,13 +2898,13 @@ rel2bin_semijoin(backend *be, sql_rel *r
 
                                        if (!l || !r)
                                                return NULL;
-                                       if (be->no_mitosis && 
list_length(jexps) == 1 && list_empty(sexps) && rel->op == op_semi && !e->anti 
&& is_equi_exp_(e)) {
+                                       if (be->no_mitosis && 
list_length(jexps) == 1 && list_empty(sexps) && rel->op == op_semi && 
!is_anti(e) && is_equi_exp_(e)) {
                                                join = stmt_semijoin(be, 
column(be, l), column(be, r), left->cand, NULL/*right->cand*/, is_semantics(e), 
false);
                                                semijoin_only = 1;
                                                en = NULL;
                                                break;
                                        } else
-                                               s = stmt_join_cand(be, 
column(be, l), column(be, r), left->cand, NULL/*right->cand*/, e->anti, 
(comp_type) e->flag, 0, is_semantics(e), false);
+                                               s = stmt_join_cand(be, 
column(be, l), column(be, r), left->cand, NULL/*right->cand*/, is_anti(e), 
(comp_type) e->flag, 0, is_semantics(e), false);
                                        lcand = left->cand;
                                } else {
                                        s = exp_bin(be, e, left, right, NULL, 
NULL, NULL, NULL, 0, 1, 0);
@@ -3172,7 +3172,7 @@ rel2bin_union(backend *be, sql_rel *rel,
        sub = rel_rename(be, rel, sub);
        if (need_distinct(rel))
                sub = rel2bin_distinct(be, sub, NULL);
-       if (rel->single)
+       if (is_single(rel))
                sub = rel2bin_single(be, sub);
        return sub;
 }
diff --git a/sql/backends/monet5/sql_scenario.c 
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -654,13 +654,18 @@ SQLtrans(mvc *m)
                }
                s = m->session;
                if (!s->schema) {
-                       if (monet5_user_get_def_schema(m, m->user_id, 
&s->schema_name) < 0) {
-                               mvc_cancel_session(m);
-                               throw(SQL, "sql.trans", SQLSTATE(42000) "The 
user was not found in the database, this session is going to terminate");
-                       }
-                       if (!s->schema_name) {
-                               mvc_cancel_session(m);
-                               throw(SQL, "sql.trans", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+                       switch (monet5_user_get_def_schema(m, m->user_id, 
&s->schema_name)) {
+                               case -1:
+                                       mvc_cancel_session(m);
+                                       throw(SQL, "sql.trans", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+                               case -2:
+                                       mvc_cancel_session(m);
+                                       throw(SQL, "sql.trans", SQLSTATE(42000) 
"The user was not found in the database, this session is going to terminate");
+                               case -3:
+                                       mvc_cancel_session(m);
+                                       throw(SQL, "sql.trans", SQLSTATE(42000) 
"The user's default schema was not found, this session is going to terminate");
+                               default:
+                                       break;
                        }
                        if (!(s->schema = find_sql_schema(s->tr, 
s->schema_name))) {
                                mvc_cancel_session(m);
diff --git a/sql/backends/monet5/sql_user.c b/sql/backends/monet5/sql_user.c
--- a/sql/backends/monet5/sql_user.c
+++ b/sql/backends/monet5/sql_user.c
@@ -561,9 +561,8 @@ monet5_user_get_def_schema(mvc *m, int u
        sql_table *user_info = NULL;
        sql_table *schemas = NULL;
        sql_table *auths = NULL;
-       str username = NULL;
+       str username = NULL, sname = NULL;
        sqlstore *store = m->session->tr->store;
-       ptr cbat;
 
        sys = find_sql_schema(m->session->tr, "sys");
        auths = find_sql_table(m->session->tr, sys, "auths");
@@ -572,22 +571,25 @@ monet5_user_get_def_schema(mvc *m, int u
 
        rid = store->table_api.column_find_row(m->session->tr, 
find_sql_column(auths, "id"), &user, NULL);
        if (is_oid_nil(rid))
+               return -2;
+       if (!(username = store->table_api.column_find_value(m->session->tr, 
find_sql_column(auths, "name"), rid)))
                return -1;
-       username = store->table_api.column_find_string_start(m->session->tr, 
find_sql_column(auths, "name"), rid, &cbat);
        rid = store->table_api.column_find_row(m->session->tr, 
find_sql_column(user_info, "name"), username, NULL);
-       store->table_api.column_find_string_end(cbat);
+       _DELETE(username);
 
        if (!is_oid_nil(rid))
                schema_id = store->table_api.column_find_sqlid(m->session->tr, 
find_sql_column(user_info, "default_schema"), rid);
-       if (!is_int_nil(schema_id)) {
-               rid = store->table_api.column_find_row(m->session->tr, 
find_sql_column(schemas, "id"), &schema_id, NULL);
-               if (!is_oid_nil(rid)) {
-                       str sname = 
store->table_api.column_find_string_start(m->session->tr, 
find_sql_column(schemas, "name"), rid, &cbat);
-                       *schema = sa_strdup(m->session->sa, sname);
-                       store->table_api.column_find_string_end(cbat);
-               }
-       }
-       return 0;
+       if (is_int_nil(schema_id))
+               return -3;
+       rid = store->table_api.column_find_row(m->session->tr, 
find_sql_column(schemas, "id"), &schema_id, NULL);
+       if (is_oid_nil(rid))
+               return -3;
+
+       if (!(sname = store->table_api.column_find_value(m->session->tr, 
find_sql_column(schemas, "name"), rid)))
+               return -1;
+       *schema = sa_strdup(m->session->sa, sname);
+       _DELETE(sname);
+       return *schema ? 0 : -1;
 }
 
 int
@@ -607,14 +609,13 @@ monet5_user_set_def_schema(mvc *m, oid u
        sql_column *auths_id = NULL;
        sql_column *auths_name = NULL;
        str path_err = NULL, other = NULL, schema = NULL, schema_cpy, 
schema_path = NULL, username = NULL, err = NULL;
-       void *p = 0;
        int ok = 1, res = 0;
 
        TRC_DEBUG(SQL_TRANS, OIDFMT "\n", user);
 
        if ((err = AUTHresolveUser(&username, user)) != MAL_SUCCEED) {
                freeException(err);
-               return -2;
+               return -1;
        }
 
        if ((res = mvc_trans(m)) < 0) {
@@ -637,10 +638,12 @@ monet5_user_set_def_schema(mvc *m, oid u
                return -2;
        }
        schema_id = store->table_api.column_find_sqlid(m->session->tr, 
users_schema, rid);
-
-       p = store->table_api.column_find_value(m->session->tr, 
users_schema_path, rid);
-       assert(p);
-       schema_path = (str) p;
+       if (!(schema_path = store->table_api.column_find_value(m->session->tr, 
users_schema_path, rid))) {
+               if (m->session->tr->active && (other = mvc_rollback(m, 0, NULL, 
false)) != MAL_SUCCEED)
+                       freeException(other);
+               GDKfree(username);
+               return -1;
+       }
 
        schemas = find_sql_table(m->session->tr, sys, "schemas");
        schemas_name = find_sql_column(schemas, "name");
@@ -657,7 +660,13 @@ monet5_user_set_def_schema(mvc *m, oid u
                _DELETE(schema_path);
                return -3;
        }
-       schema = store->table_api.column_find_value(m->session->tr, 
schemas_name, rid);
+       if (!(schema = store->table_api.column_find_value(m->session->tr, 
schemas_name, rid))) {
+               if (m->session->tr->active && (other = mvc_rollback(m, 0, NULL, 
false)) != MAL_SUCCEED)
+                       freeException(other);
+               GDKfree(username);
+               _DELETE(schema_path);
+               return -1;
+       }
        schema_cpy = schema;
        schema = sa_strdup(m->session->sa, schema);
        _DELETE(schema_cpy);
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
@@ -268,7 +268,7 @@ exp_print(mvc *sql, stream *fout, sql_ex
                        cmp_print(sql, fout, range2rcompare(e->flag) );
                        exp_print(sql, fout, e->f, depth+1, refs, 0, 0);
                        mnstr_printf(fout, " BETWEEN ");
-                       if (e->symmetric)
+                       if (is_symmetric(e))
                                mnstr_printf(fout, " SYM ");
                } else {
                        exp_print(sql, fout, e->l, depth+1, refs, 0, 0);
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
@@ -345,7 +345,7 @@ exp_op( sql_allocator *sa, list *l, sql_
        e->l = l;
        e->f = f;
        e->semantics = f->func->semantics;
-       if (!e->semantics && l && !have_nil(l))
+       if (!is_semantics(e) && l && !have_nil(l))
                set_has_no_nil(e);
        return e;
 }
@@ -854,7 +854,7 @@ exp_rel(mvc *sql, sql_rel *rel)
                return NULL;
        e->l = rel;
        e->flag = PSM_REL;
-       e->card = rel->single?CARD_ATOM:rel->card;
+       e->card = is_single(rel)?CARD_ATOM:rel->card;
        assert(rel);
        if (is_project(rel->op)) {
                sql_exp *last = rel->exps->t->data;
@@ -1763,9 +1763,9 @@ exp_is_cmp_exp_is_false(sql_exp* e)
        */
        if (e->flag != cmp_equal && e->flag != cmp_notequal)
                return false;
-       if (e->flag == cmp_equal && !e->anti)
+       if (e->flag == cmp_equal && !is_anti(e))
                return ((exp_is_null(l) && exp_is_not_null(r)) || 
(exp_is_not_null(l) && exp_is_null(r)));
-       if (((e->flag == cmp_notequal) && !e->anti) || ((e->flag == cmp_equal) 
&& e->anti) )
+       if (((e->flag == cmp_notequal) && !is_anti(e)) || ((e->flag == 
cmp_equal) && is_anti(e)) )
                return ((exp_is_null(l) && exp_is_null(r)) || 
(exp_is_not_null(l) && exp_is_not_null(r)));
        return false;
 }
@@ -1796,7 +1796,7 @@ static inline bool
 exp_regular_cmp_exp_is_false(sql_exp* e) {
     assert(e->type == e_cmp);
 
-    if (e->semantics)   return exp_is_cmp_exp_is_false(e);
+    if (is_semantics(e))return exp_is_cmp_exp_is_false(e);
     if (e -> f)         return exp_two_sided_bound_cmp_exp_is_false(e);
     else                return exp_single_bound_cmp_exp_is_false(e);
 }
@@ -1882,7 +1882,7 @@ exp_is_not_null(sql_exp *e)
        case e_convert:
                return exp_is_not_null(e->l);
        case e_func:
-               if (!e->semantics && e->l) {
+               if (!is_semantics(e) && e->l) {
                        list *l = e->l;
                        for (node *n = l->h; n; n=n->next) {
                                sql_exp *p = n->data;
@@ -1917,7 +1917,7 @@ exp_is_null(sql_exp *e )
        case e_convert:
                return exp_is_null(e->l);
        case e_func:
-               if (!e->semantics && e->l) {
+               if (!is_semantics(e) && e->l) {
                        /* This is a call to a function with no-nil semantics.
                         * If one of the parameters is null the expression 
itself is null
                         */
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to