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