Changeset: dab7c953b59e for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/dab7c953b59e Modified Files: sql/backends/monet5/sql.c sql/backends/monet5/sql_cat.c sql/storage/store.c Branch: analyze-fix Log Message:
Merged with Jan2022 diffs (truncated from 799 to 300 lines): diff --git a/gdk/gdk_strimps.c b/gdk/gdk_strimps.c --- a/gdk/gdk_strimps.c +++ b/gdk/gdk_strimps.c @@ -797,7 +797,7 @@ STRMPappendBitstring(BAT *b, const str s size_t sizes_offset = (char *)strmp->sizes_base - strmp->strimps.base; size_t pairs_offset = (char *)strmp->pairs_base - strmp->strimps.base; size_t bitstrings_offset = (char *)strmp->bitstrings_base - strmp->strimps.base; - if (HEAPextend(&(strmp->strimps), (size_t)(extend_factor*BATcount(pb)*sizeof(uint64_t)), false) == GDK_FAIL) { + if (HEAPextend(&(strmp->strimps), (size_t)(extend_factor*BATcount(pb)*sizeof(uint64_t)), false) != GDK_SUCCEED) { MT_lock_unset(&pb->batIdxLock); GDKerror("Cannot extend heap\n"); return GDK_FAIL; diff --git a/sql/ChangeLog.Jan2022 b/sql/ChangeLog.Jan2022 --- a/sql/ChangeLog.Jan2022 +++ b/sql/ChangeLog.Jan2022 @@ -1,9 +1,14 @@ # ChangeLog file for sql # This file is updated with Maddlog +* Mon Dec 6 2021 Sjoerd Mullender <sjo...@acm.org> +- In previous versions there was no check that the INCREMENT BY value of + a SEQUENCE was not zero. During the automatic upgrade of a database, + INCREMENT BY values that are zero are set to one. + * Tue Nov 9 2021 Pedro Ferreira <pedro.ferre...@monetdbsolutions.com> - The method to compute the 'side_effect' effect property was changed - for SQL functions defined in the backend engine (eg. ``CREATE FUNCTION + for SQL functions defined in the backend engine (eg. ``CREATE FUNCTION ... EXTERNAL NAME "module"."function"''). It was changed from being computed by the SQL layer to the backend engine itself. As a consequence, the computed 'side_effect' value may be different, thus bringing diff --git a/sql/backends/monet5/dict.c b/sql/backends/monet5/dict.c --- a/sql/backends/monet5/dict.c +++ b/sql/backends/monet5/dict.c @@ -395,7 +395,7 @@ DICTdecompress(Client cntxt, MalBlkPtr m bat_destroy(o); bat_destroy(u); if (!b) - throw(SQL, "dict.decompress", SQLSTATE(HY013) "unknown offset type"); + throw(SQL, "dict.decompress", GDK_EXCEPTION); BBPkeepref(*r = b->batCacheid); return MAL_SUCCEED; } diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c --- a/sql/backends/monet5/sql.c +++ b/sql/backends/monet5/sql.c @@ -1122,7 +1122,7 @@ mvc_restart_seq(Client cntxt, MalBlkPtr if (is_lng_nil(start)) throw(SQL, "sql.restart", SQLSTATE(HY050) "Cannot (re)start sequence %s.%s with NULL", sname, seqname); if (start < seq->minvalue) - throw(SQL, "sql.restart", SQLSTATE(HY050) "Cannot set sequence %s.%s start to a value lesser than the minimum ("LLFMT" < "LLFMT")", sname, seqname, start, seq->minvalue); + throw(SQL, "sql.restart", SQLSTATE(HY050) "Cannot set sequence %s.%s start to a value less than the minimum ("LLFMT" < "LLFMT")", sname, seqname, start, seq->minvalue); if (start > seq->maxvalue) throw(SQL, "sql.restart", SQLSTATE(HY050) "Cannot set sequence %s.%s start to a value higher than the maximum ("LLFMT" > "LLFMT")", sname, seqname, start, seq->maxvalue); switch (sql_trans_sequence_restart(m->session->tr, seq, start)) { @@ -3770,11 +3770,8 @@ SQLdrop_hash(Client cntxt, MalBlkPtr mb, const char *tbl = *getArgReference_str(stk, pci, 2); sql_schema *s; sql_table *t; - sql_column *c; mvc *m = NULL; str msg; - BAT *b; - node *o; if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL) return msg; @@ -3793,11 +3790,17 @@ SQLdrop_hash(Client cntxt, MalBlkPtr mb, TABLE_TYPE_DESCRIPTION(t->type, t->properties), t->base.name); sqlstore *store = m->session->tr->store; - for (o = ol_first_node(t->columns); o; o = o->next) { - c = o->data; - b = store->storage_api.bind_col(m->session->tr, c, RDONLY); - if (b == NULL) + for (node *n = ol_first_node(t->columns); n; n = n->next) { + sql_column *c = n->data; + BAT *b = NULL, *nb = NULL; + + if (!(b = store->storage_api.bind_col(m->session->tr, c, RDONLY))) throw(SQL, "sql.drop_hash", SQLSTATE(HY005) "Cannot access column descriptor"); + if (VIEWtparent(b) && (nb = BBP_cache(VIEWtparent(b)))) { + BBPunfix(b->batCacheid); + if (!(b = BATdescriptor(nb->batCacheid))) + throw(SQL, "sql.drop_hash", SQLSTATE(HY005) "Cannot access column descriptor"); + } HASHdestroy(b); BBPunfix(b->batCacheid); } diff --git a/sql/backends/monet5/sql_cast.c b/sql/backends/monet5/sql_cast.c --- a/sql/backends/monet5/sql_cast.c +++ b/sql/backends/monet5/sql_cast.c @@ -198,7 +198,7 @@ SQLstr_cast(Client cntxt, MalBlkPtr mb, } #define SQLstr_cast_str(v, digits) \ - if (digits > 0 && UTF8_strlen(v) > digits) { \ + if (UTF8_strlen(v) > digits) { \ msg = createException(SQL, "batcalc.str_cast", SQLSTATE(22001) "value too long for type (var)char(%d)", digits); \ goto bailout1; \ } @@ -220,7 +220,7 @@ SQLbatstr_cast(Client cntxt, MalBlkPtr m BUN q; oid off; bool nils = false, from_str = EC_VARCHAR(eclass) || tpe == TYPE_str; - size_t rlen = MAX(str_buf_initial_capacity(eclass, digits), strlen(str_nil) + 1); /* don't reallocate on str_nil */ + size_t rlen = 0; if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL) return msg; @@ -234,17 +234,36 @@ SQLbatstr_cast(Client cntxt, MalBlkPtr m msg = createException(SQL, "batcalc.str", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING); goto bailout; } + + assert(digits >= 0); + if (from_str && digits == 0) { + if (s) { + if (!(dst = BATproject(s, b))) { + msg = createException(SQL, "batcalc.str", GDK_EXCEPTION); + goto bailout; + } + BBPunfix(s->batCacheid); + BBPunfix(b->batCacheid); + BBPkeepref(*res = dst->batCacheid); + } else { + BBPkeepref(*res = b->batCacheid); + } + return MAL_SUCCEED; + } off = b->hseqbase; q = canditer_init(&ci, b, s); bi = bat_iterator(b); - if (from_str && (!sid || is_bat_nil(*sid))) { /* from string case, just do validation, if right, return */ + if (from_str && ci.tpe == cand_dense && q == BATcount(b)) { /* from string case, just do validation, if right, return */ for (BUN i = 0; i < q; i++) { - str v = (str) BUNtvar(bi, i); + oid p = (canditer_next_dense(&ci) - off); + str v = (str) BUNtvar(bi, p); if (!strNil(v)) SQLstr_cast_str(v, digits); } + if (s) + BBPunfix(s->batCacheid); bat_iterator_end(&bi); BBPkeepref(*res = b->batCacheid); return MAL_SUCCEED; @@ -255,6 +274,7 @@ SQLbatstr_cast(Client cntxt, MalBlkPtr m goto bailout1; } + rlen = MAX(str_buf_initial_capacity(eclass, digits), strlen(str_nil) + 1); /* don't reallocate on str_nil */ assert(rlen > 0); if (!from_str && !(r = GDKmalloc(rlen))) { msg = createException(SQL, "batcalc.str_cast", SQLSTATE(HY013) MAL_MALLOC_FAIL); diff --git a/sql/backends/monet5/sql_cat.c b/sql/backends/monet5/sql_cat.c --- a/sql/backends/monet5/sql_cat.c +++ b/sql/backends/monet5/sql_cat.c @@ -734,10 +734,28 @@ drop_key(mvc *sql, char *sname, char *tn } static str -drop_index(Client cntxt, mvc *sql, char *sname, char *iname) +IDXdrop(mvc *sql, const char *sname, const char *tname, const char *iname, void (*func)(BAT *)) +{ + BAT *b = mvc_bind(sql, sname, tname, iname, RDONLY), *nb = NULL; + + if (!b) + throw(SQL,"sql.drop_index", SQLSTATE(HY005) "Column can not be accessed"); + if (VIEWtparent(b) && (nb = BBP_cache(VIEWtparent(b)))) { + BBPunfix(b->batCacheid); + if (!(b = BATdescriptor(nb->batCacheid))) + throw(SQL,"sql.drop_index", SQLSTATE(HY005) "Column can not be accessed"); + } + func(b); + BBPunfix(b->batCacheid); + return MAL_SUCCEED; +} + +static str +drop_index(mvc *sql, char *sname, char *iname) { sql_schema *s = NULL; sql_idx *i = NULL; + str msg = MAL_SUCCEED; if (!(s = mvc_bind_schema(sql, sname))) throw(SQL,"sql.drop_index", SQLSTATE(3F000) "DROP INDEX: no such schema '%s'", sname); @@ -747,21 +765,10 @@ drop_index(Client cntxt, mvc *sql, char throw(SQL,"sql.drop_index", SQLSTATE(42S12) "DROP INDEX: no such index '%s'", iname); if (i->key) throw(SQL,"sql.drop_index", SQLSTATE(42S12) "DROP INDEX: cannot drop index '%s', because the constraint '%s' depends on it", iname, i->key->base.name); - if (i->type == ordered_idx) { + if (i->type == ordered_idx || i->type == imprints_idx) { sql_kc *ic = i->columns->h->data; - BAT *b = mvc_bind(sql, s->base.name, ic->c->t->base.name, ic->c->base.name, 0); - if (b) { - OIDXdropImplementation(cntxt, b); - BBPunfix(b->batCacheid); - } - } - if (i->type == imprints_idx) { - sql_kc *ic = i->columns->h->data; - BAT *b = mvc_bind(sql, s->base.name, ic->c->t->base.name, ic->c->base.name, 0); - if (b) { - IMPSdestroy(b); - BBPunfix(b->batCacheid); - } + if ((msg = IDXdrop(sql, s->base.name, ic->c->t->base.name, ic->c->base.name, i->type == ordered_idx ? OIDXdestroy : IMPSdestroy))) + return msg; } switch (mvc_drop_idx(sql, s, i)) { case -1: @@ -791,11 +798,11 @@ create_seq(mvc *sql, char *sname, char * is_lng_nil(seq->increment) || is_lng_nil(seq->cacheinc) || is_bit_nil(seq->cycle)) throw(SQL,"sql.create_seq", SQLSTATE(42000) "CREATE SEQUENCE: sequence properties must be non-NULL"); if (seq->start < seq->minvalue) - throw(SQL,"sql.create_seq", SQLSTATE(42000) "CREATE SEQUENCE: start value is lesser than the minimum ("LLFMT" < "LLFMT")", seq->start, seq->minvalue); + throw(SQL,"sql.create_seq", SQLSTATE(42000) "CREATE SEQUENCE: start value is less than the minimum ("LLFMT" < "LLFMT")", seq->start, seq->minvalue); if (seq->start > seq->maxvalue) throw(SQL,"sql.create_seq", SQLSTATE(42000) "CREATE SEQUENCE: start value is higher than the maximum ("LLFMT" > "LLFMT")", seq->start, seq->maxvalue); if (seq->maxvalue < seq->minvalue) - throw(SQL,"sql.create_seq", SQLSTATE(42000) "CREATE SEQUENCE: maximum value is lesser than the minimum ("LLFMT" < "LLFMT")", seq->maxvalue, seq->minvalue); + throw(SQL,"sql.create_seq", SQLSTATE(42000) "CREATE SEQUENCE: maximum value is less than the minimum ("LLFMT" < "LLFMT")", seq->maxvalue, seq->minvalue); if (seq->increment == 0) throw(SQL,"sql.create_seq", SQLSTATE(42000) "CREATE SEQUENCE: sequence increment cannot be 0"); if (seq->cacheinc <= 0) @@ -840,7 +847,7 @@ alter_seq(mvc *sql, char *sname, char *s break; } if (nseq->maxvalue < nseq->minvalue) - throw(SQL,"sql.alter_seq", SQLSTATE(42000) "ALTER SEQUENCE: maximum value is lesser than the minimum ("LLFMT" < "LLFMT")", nseq->maxvalue, nseq->minvalue); + throw(SQL,"sql.alter_seq", SQLSTATE(42000) "ALTER SEQUENCE: maximum value is less than the minimum ("LLFMT" < "LLFMT")", nseq->maxvalue, nseq->minvalue); if (nseq->increment == 0) throw(SQL,"sql.alter_seq", SQLSTATE(42000) "ALTER SEQUENCE: sequence increment cannot be 0"); if (nseq->cacheinc <= 0) @@ -852,7 +859,7 @@ alter_seq(mvc *sql, char *sname, char *s if (is_lng_nil(*val)) throw(SQL,"sql.alter_seq", SQLSTATE(42000) "ALTER SEQUENCE: sequence value must be non-NULL"); if (*val < nseq->minvalue) - throw(SQL,"sql.alter_seq", SQLSTATE(42000) "ALTER SEQUENCE: cannot set sequence start to a value lesser than the minimum ("LLFMT" < "LLFMT")", *val, nseq->minvalue); + throw(SQL,"sql.alter_seq", SQLSTATE(42000) "ALTER SEQUENCE: cannot set sequence start to a value less than the minimum ("LLFMT" < "LLFMT")", *val, nseq->minvalue); if (*val > nseq->maxvalue) throw(SQL,"sql.alter_seq", SQLSTATE(42000) "ALTER SEQUENCE: cannot set sequence start to a value higher than the maximum ("LLFMT" > "LLFMT")", *val, nseq->maxvalue); switch (sql_trans_sequence_restart(sql->session->tr, nseq, *val)) { @@ -1240,15 +1247,20 @@ alter_table(Client cntxt, mvc *sql, char /* alter add index */ for (n = ol_first_node(t->idxs); n; n = n->next) { sql_idx *i = n->data; + BAT *b = NULL, *nb = NULL; if (!i->base.new || i->base.deleted) continue; if (i->type == ordered_idx) { sql_kc *ic = i->columns->h->data; - BAT *b = mvc_bind(sql, nt->s->base.name, nt->base.name, ic->c->base.name, 0); - if (b == NULL) + if (!(b = mvc_bind(sql, nt->s->base.name, nt->base.name, ic->c->base.name, RDONLY))) throw(SQL,"sql.alter_table",SQLSTATE(HY005) "Cannot access ordered index %s_%s_%s", s->base.name, t->base.name, i->base.name); + if (VIEWtparent(b) && (nb = BBP_cache(VIEWtparent(b)))) { + BBPunfix(b->batCacheid); + if (!(b = BATdescriptor(nb->batCacheid))) + throw(SQL,"sql.alter_table",SQLSTATE(HY005) "Cannot access ordered index %s_%s_%s", s->base.name, t->base.name, i->base.name); + } char *msg = OIDXcreateImplementation(cntxt, newBatType(b->ttype), b, -1); BBPunfix(b->batCacheid); if (msg != MAL_SUCCEED) { @@ -1256,13 +1268,16 @@ alter_table(Client cntxt, mvc *sql, char freeException(msg); return smsg; } - } - if (i->type == imprints_idx) { + } else if (i->type == imprints_idx) { gdk_return r; sql_kc *ic = i->columns->h->data; - BAT *b = mvc_bind(sql, nt->s->base.name, nt->base.name, ic->c->base.name, 0); - if (b == NULL) + if (!(b = mvc_bind(sql, nt->s->base.name, nt->base.name, ic->c->base.name, RDONLY))) throw(SQL,"sql.alter_table",SQLSTATE(HY005) "Cannot access imprints index %s_%s_%s", s->base.name, t->base.name, i->base.name); + if (VIEWtparent(b) && (nb = BBP_cache(VIEWtparent(b)))) { + BBPunfix(b->batCacheid); + if (!(b = BATdescriptor(nb->batCacheid))) + throw(SQL,"sql.alter_table",SQLSTATE(HY005) "Cannot access imprints index %s_%s_%s", s->base.name, t->base.name, i->base.name); + } r = BATimprints(b); BBPunfix(b->batCacheid); if (r != GDK_SUCCEED) @@ -1794,7 +1809,7 @@ SQLdrop_index(Client cntxt, MalBlkPtr mb char *iname = *getArgReference_str(stk, pci, 2); initcontext(); - msg = drop_index(cntxt, sql, sname, iname); + msg = drop_index(sql, sname, iname); return msg; } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list