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

Reply via email to