Changeset: eff9f4079c8c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/eff9f4079c8c
Modified Files:
        sql/ChangeLog.Jan2022
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_cat.c
        sql/server/rel_sequence.c
        sql/storage/bat/bat_logger.c
        sql/storage/store.c
        sql/test/testdb-previous-upgrade-chain-hge/Tests/dump.stable.out
        sql/test/testdb-previous-upgrade-chain/Tests/dump.stable.out
        sql/test/testdb-previous-upgrade-hge/Tests/dump.stable.out
        sql/test/testdb-previous-upgrade/Tests/dump.stable.out
        sql/test/testdb-upgrade-chain/Tests/dump.stable.out
        sql/test/testdb-upgrade/Tests/dump.stable.out
Branch: Jan2022
Log Message:

Added upgrade code for default minvalue/maxvalue in sys.sequences.
Also set increment to 1 if it was 0.
Also fix some English.


diffs (truncated from 447 to 300 lines):

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/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)) {
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
@@ -801,11 +801,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)
@@ -850,7 +850,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)
@@ -862,7 +862,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)) {
diff --git a/sql/server/rel_sequence.c b/sql/server/rel_sequence.c
--- a/sql/server/rel_sequence.c
+++ b/sql/server/rel_sequence.c
@@ -122,9 +122,9 @@ rel_create_seq(
        if (calc < llabs(inc) || calc < cache)
                return sql_error(sql, 02, SQLSTATE(42000) "CREATE SEQUENCE: The 
specified range of cached values cannot be set. Either reduce increment or 
cache value");
        if (max < min)
-               return sql_error(sql, 02, SQLSTATE(42000) "CREATE SEQUENCE: 
MAXVALUE value is lesser than MINVALUE ("LLFMT" < "LLFMT")", max, min);
+               return sql_error(sql, 02, SQLSTATE(42000) "CREATE SEQUENCE: 
MAXVALUE value is less than MINVALUE ("LLFMT" < "LLFMT")", max, min);
        if (start < min)
-               return sql_error(sql, 02, SQLSTATE(42000) "CREATE SEQUENCE: 
START value is lesser than MINVALUE ("LLFMT" < "LLFMT")", start, min);
+               return sql_error(sql, 02, SQLSTATE(42000) "CREATE SEQUENCE: 
START value is less than MINVALUE ("LLFMT" < "LLFMT")", start, min);
        if (start > max)
                return sql_error(sql, 02, SQLSTATE(42000) "CREATE SEQUENCE: 
START value is higher than MAXVALUE ("LLFMT" > "LLFMT")", start, max);
 
@@ -297,7 +297,7 @@ rel_alter_seq(
        if (calc < llabs(inc) || calc < cache)
                return sql_error(sql, 02, SQLSTATE(42000) "ALTER SEQUENCE: The 
specified range of cached values cannot be set. Either reduce increment or 
cache value");
        if (max < min)
-               return sql_error(sql, 02, SQLSTATE(42000) "ALTER SEQUENCE: 
MAXVALUE value is lesser than MINVALUE ("LLFMT" < "LLFMT")", max, min);
+               return sql_error(sql, 02, SQLSTATE(42000) "ALTER SEQUENCE: 
MAXVALUE value is less than MINVALUE ("LLFMT" < "LLFMT")", max, min);
        /* first alter the known values */
        seq = create_sql_sequence(sql->store, sql->sa, seq->s, name, 
seq->start, min, max, inc, cache, cycle);
 
diff --git a/sql/storage/bat/bat_logger.c b/sql/storage/bat/bat_logger.c
--- a/sql/storage/bat/bat_logger.c
+++ b/sql/storage/bat/bat_logger.c
@@ -1827,6 +1827,48 @@ upgrade(old_logger *lg)
        return rc;
 }
 
+/* replace a column in a system table with a new column
+ * colid is the SQL id for the column, oldcolid is the BAT id of the
+ * to-be-replaced BAT */
+static gdk_return
+replace_bat(old_logger *old_lg, logger *lg, int colid, bat oldcolid, BAT 
*newcol)
+{
+       gdk_return rc;
+       newcol = BATsetaccess(newcol, BAT_READ);
+       if (old_lg != NULL) {
+               if ((rc = BUNappend(old_lg->del, &oldcolid, false)) == 
GDK_SUCCEED &&
+                       (rc = BUNappend(old_lg->add, &newcol->batCacheid, 
false)) == GDK_SUCCEED &&
+                       (rc = BUNreplace(lg->catalog_bid, 
BUNfnd(lg->catalog_id, &colid), &newcol->batCacheid, false)) == GDK_SUCCEED) {
+                       BBPretain(newcol->batCacheid);
+                       BBPretain(newcol->batCacheid);
+               }
+       } else {
+               if ((rc = BAThash(lg->catalog_id)) == GDK_SUCCEED) {
+                       BATiter cii = bat_iterator_nolock(lg->catalog_id);
+                       BUN p;
+                       MT_rwlock_rdlock(&cii.b->thashlock);
+                       HASHloop_int(cii, cii.b->thash, p, &colid) {
+                               if (BUNfnd(lg->dcatalog, &(oid){(oid)p}) == 
BUN_NONE) {
+                                       if (BUNappend(lg->dcatalog, 
&(oid){(oid)p}, false) != GDK_SUCCEED) {
+                                               
MT_rwlock_rdunlock(&cii.b->thashlock);
+                                               return GDK_FAIL;
+                                       }
+                                       break;
+                               }
+                       }
+                       MT_rwlock_rdunlock(&cii.b->thashlock);
+                       if ((rc = BUNappend(lg->catalog_id, &colid, false)) == 
GDK_SUCCEED &&
+                               (rc = BUNappend(lg->catalog_bid, 
&newcol->batCacheid, false)) == GDK_SUCCEED &&
+                               (rc = BUNappend(lg->catalog_lid, &lng_nil, 
false)) == GDK_SUCCEED &&
+                               (rc = BUNappend(lg->catalog_cnt, 
&(lng){BATcount(newcol)}, false)) == GDK_SUCCEED) {
+                               BBPretain(newcol->batCacheid);
+                       }
+                       lg->cnt++;
+               }
+       }
+       return GDK_SUCCEED;
+}
+
 static gdk_return
 bl_postversion(void *Store, void *Lg)
 {
@@ -2721,38 +2763,7 @@ bl_postversion(void *Store, void *Lg)
                                return GDK_FAIL;
                        }
                }
-               b2 = BATsetaccess(b2, BAT_READ);
-               if (old_lg != NULL) {
-                       if ((rc = BUNappend(old_lg->del, &bid, false)) == 
GDK_SUCCEED &&
-                               (rc = BUNappend(old_lg->add, &b2->batCacheid, 
false)) == GDK_SUCCEED &&
-                               (rc = BUNreplace(lg->catalog_bid, 
BUNfnd(lg->catalog_id, &(int){2021}), &b2->batCacheid, false)) == GDK_SUCCEED) {
-                               BBPretain(b2->batCacheid);
-                               BBPretain(b2->batCacheid);
-                       }
-               } else {
-                       if ((rc = BAThash(lg->catalog_id)) == GDK_SUCCEED) {
-                               BATiter cii = 
bat_iterator_nolock(lg->catalog_id);
-                               BUN p;
-                               MT_rwlock_rdlock(&cii.b->thashlock);
-                               HASHloop_int(cii, cii.b->thash, p, 
&(int){2021}) {
-                                       if (BUNfnd(lg->dcatalog, 
&(oid){(oid)p}) == BUN_NONE) {
-                                               if (BUNappend(lg->dcatalog, 
&(oid){(oid)p}, false) != GDK_SUCCEED) {
-                                                       
MT_rwlock_rdunlock(&cii.b->thashlock);
-                                                       return GDK_FAIL;
-                                               }
-                                               break;
-                                       }
-                               }
-                               MT_rwlock_rdunlock(&cii.b->thashlock);
-                               if ((rc = BUNappend(lg->catalog_id, 
&(int){2021}, false)) == GDK_SUCCEED &&
-                                       (rc = BUNappend(lg->catalog_bid, 
&b2->batCacheid, false)) == GDK_SUCCEED &&
-                                       (rc = BUNappend(lg->catalog_lid, 
&lng_nil, false)) == GDK_SUCCEED &&
-                                       (rc = BUNappend(lg->catalog_cnt, 
&(lng){BATcount(b2)}, false)) == GDK_SUCCEED) {
-                                       BBPretain(b2->batCacheid);
-                               }
-                               lg->cnt++;
-                       }
-               }
+               rc = replace_bat(old_lg, lg, 2021, bid, b2);
                bat_destroy(b2);
                if (rc != GDK_SUCCEED)
                        return rc;
@@ -2911,42 +2922,148 @@ bl_postversion(void *Store, void *Lg)
                        return GDK_FAIL;
                }
                /* replace old column with modified copy */
-               func_se = BATsetaccess(func_se, BAT_READ);
-               if (old_lg != NULL) {
-                       if ((rc = BUNappend(old_lg->del, &bid, false)) == 
GDK_SUCCEED &&
-                               (rc = BUNappend(old_lg->add, 
&func_se->batCacheid, false)) == GDK_SUCCEED &&
-                               (rc = BUNreplace(lg->catalog_bid, 
BUNfnd(lg->catalog_id, &(int){2023}), &func_se->batCacheid, false)) == 
GDK_SUCCEED) {
-                               BBPretain(func_se->batCacheid);
-                               BBPretain(func_se->batCacheid);
-                       }
-               } else {
-                       if ((rc = BAThash(lg->catalog_id)) == GDK_SUCCEED) {
-                               BATiter cii = 
bat_iterator_nolock(lg->catalog_id);
-                               BUN p;
-                               MT_rwlock_rdlock(&cii.b->thashlock);
-                               HASHloop_int(cii, cii.b->thash, p, 
&(int){2023}) {
-                                       if (BUNfnd(lg->dcatalog, 
&(oid){(oid)p}) == BUN_NONE) {
-                                               if (BUNappend(lg->dcatalog, 
&(oid){(oid)p}, false) != GDK_SUCCEED) {
-                                                       
MT_rwlock_rdunlock(&cii.b->thashlock);
-                                                       return GDK_FAIL;
-                                               }
-                                               break;
-                                       }
-                               }
-                               MT_rwlock_rdunlock(&cii.b->thashlock);
-                               if ((rc = BUNappend(lg->catalog_id, 
&(int){2023}, false)) == GDK_SUCCEED &&
-                                       (rc = BUNappend(lg->catalog_bid, 
&func_se->batCacheid, false)) == GDK_SUCCEED &&
-                                       (rc = BUNappend(lg->catalog_lid, 
&lng_nil, false)) == GDK_SUCCEED &&
-                                       (rc = BUNappend(lg->catalog_cnt, 
&(lng){BATcount(func_se)}, false)) == GDK_SUCCEED) {
-                                       BBPretain(func_se->batCacheid);
-                               }
-                               lg->cnt++;
-                       }
-               }
+               rc = replace_bat(old_lg, lg, 2023, bid, func_se);
                bat_destroy(func_se);
                if (rc != GDK_SUCCEED)
                        return rc;
        }
+       if (store->catalog_version <= CATALOG_JUL2021) {
+               /* upgrade some columns in sys.sequences:
+                * if increment is zero, set it to one (see ChangeLog);
+                * if increment is greater than zero and maxvalue is zero,
+                * set maxvalue to GDK_lng_max;
+                * if increment is less than zero and minvalue is zero,
+                * set minvalue to GDK_lng_min */
+
+               /* sys.sequences i.e. deleted rows */
+               BAT *del_seqs = temp_descriptor(logger_find_bat(lg, 2037));
+               if (del_seqs == NULL)
+                       return GDK_FAIL;
+               BAT *seq_tid = BATmaskedcands(0, BATcount(del_seqs), del_seqs, 
false);
+               bat_destroy(del_seqs);
+               BAT *seq_min = temp_descriptor(logger_find_bat(lg, 2042)); /* 
sys.sequences.minvalue */
+               BAT *seq_max = temp_descriptor(logger_find_bat(lg, 2043)); /* 
sys.sequences.maxvalue */
+               BAT *seq_inc = temp_descriptor(logger_find_bat(lg, 2044)); /* 
sys.sequences.increment */
+               if (seq_tid == NULL || seq_min == NULL || seq_max == NULL || 
seq_inc == NULL) {
+                       bat_destroy(seq_tid);
+                       bat_destroy(seq_min);
+                       bat_destroy(seq_max);
+                       bat_destroy(seq_inc);
+                       return GDK_FAIL;
+               }
+               /* select * from sys.sequences where increment = 0 */
+               BAT *inczero = BATselect(seq_inc, seq_tid, &(lng){0}, NULL, 
false, true, false);
+               if (inczero == NULL) {
+                       bat_destroy(seq_tid);
+                       bat_destroy(seq_min);
+                       bat_destroy(seq_max);
+                       bat_destroy(seq_inc);
+                       return GDK_FAIL;
+               }
+               if (BATcount(inczero) > 0) {
+                       BAT *b = BATconstant(0, TYPE_lng, &(lng) {1}, 
BATcount(inczero), TRANSIENT);
+                       if (b == NULL) {
+                               bat_destroy(seq_tid);
+                               bat_destroy(seq_min);
+                               bat_destroy(seq_max);
+                               bat_destroy(seq_inc);
+                               bat_destroy(inczero);
+                               return GDK_FAIL;
+                       }
+                       BAT *b2 = COLcopy(seq_inc, seq_inc->ttype, true, 
PERSISTENT);
+                       gdk_return rc = GDK_FAIL;
+                       if (b2 == NULL)
+                               rc = BATreplace(b2, inczero, b, false);
+                       bat_destroy(b);
+                       if (rc != GDK_SUCCEED) {
+                               bat_destroy(b2);
+                               bat_destroy(seq_tid);
+                               bat_destroy(seq_min);
+                               bat_destroy(seq_max);
+                               bat_destroy(seq_inc);
+                               bat_destroy(inczero);
+                               return GDK_FAIL;
+                       }
+                       rc = replace_bat(old_lg, lg, 2044, seq_inc->batCacheid, 
b2);
+                       bat_destroy(seq_inc);
+                       seq_inc = b2;
+                       if (rc != GDK_SUCCEED) {
+                               bat_destroy(seq_tid);
+                               bat_destroy(seq_min);
+                               bat_destroy(seq_max);
+                               bat_destroy(seq_inc);
+                               bat_destroy(inczero);
+                               return rc;
+                       }
+               }
+               bat_destroy(inczero);
+               /* select * from sys.sequences where increment > 0 */
+               BAT *incpos = BATselect(seq_inc, seq_tid, &(lng){0}, &lng_nil, 
false, true, false);
+               bat_destroy(seq_inc);
+               if (incpos == NULL) {
+                       bat_destroy(seq_tid);
+                       bat_destroy(seq_min);
+                       bat_destroy(seq_max);
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to