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