Changeset: 2111997f78f0 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2111997f78f0
Modified Files:
clients/Tests/MAL-signatures.stable.out
clients/Tests/MAL-signatures.stable.out.int128
sql/backends/monet5/rel_bin.c
sql/backends/monet5/sql.c
sql/backends/monet5/sql.h
sql/backends/monet5/sql.mal
sql/backends/monet5/sql_cat.c
sql/server/rel_sequence.c
sql/storage/sql_catalog.c
sql/storage/sql_storage.h
sql/storage/store.c
sql/storage/store_sequence.c
sql/storage/store_sequence.h
sql/test/Tests/alter-sequence.sql
sql/test/Tests/alter-sequence.stable.err
Branch: default
Log Message:
Merge with Nov2019
diffs (truncated from 620 to 300 lines):
diff --git a/clients/Tests/MAL-signatures.stable.out
b/clients/Tests/MAL-signatures.stable.out
--- a/clients/Tests/MAL-signatures.stable.out
+++ b/clients/Tests/MAL-signatures.stable.out
@@ -9010,6 +9010,13 @@ stdout of test 'MAL-signatures` in direc
[ "batsql", "prod", "pattern batsql.prod(b:bat[:lng], s:bat[:lng],
e:bat[:lng]):bat[:lng] ", "SQLprod;", "return the product of groups"
]
[ "batsql", "prod", "pattern batsql.prod(b:bat[:sht], s:bat[:lng],
e:bat[:lng]):bat[:lng] ", "SQLprod;", "return the product of groups"
]
[ "batsql", "rank", "pattern batsql.rank(b:bat[:any_1], p:any_2,
o:any_3):bat[:int] ", "SQLrank;", "return the ranked groups" ]
+[ "batsql", "restart", "unsafe pattern batsql.restart(sname:bat[:str],
sequence:bat[:str], start:bat[:lng]):bat[:lng] ", "mvc_bat_restart_seq;",
"restart the sequence with value start" ]
+[ "batsql", "restart", "unsafe pattern batsql.restart(sname:bat[:str],
sequence:bat[:str], start:lng):bat[:lng] ", "mvc_bat_restart_seq;",
"restart the sequence with value start" ]
+[ "batsql", "restart", "unsafe pattern batsql.restart(sname:bat[:str],
sequence:str, start:bat[:lng]):bat[:lng] ", "mvc_bat_restart_seq;",
"restart the sequence with value start" ]
+[ "batsql", "restart", "unsafe pattern batsql.restart(sname:bat[:str],
sequence:str, start:lng):bat[:lng] ", "mvc_bat_restart_seq;", "restart the
sequence with value start" ]
+[ "batsql", "restart", "unsafe pattern batsql.restart(sname:str,
sequence:bat[:str], start:bat[:lng]):bat[:lng] ", "mvc_bat_restart_seq;",
"restart the sequence with value start" ]
+[ "batsql", "restart", "unsafe pattern batsql.restart(sname:str,
sequence:bat[:str], start:lng):bat[:lng] ", "mvc_bat_restart_seq;", "restart
the sequence with value start" ]
+[ "batsql", "restart", "unsafe pattern batsql.restart(sname:str,
sequence:str, start:bat[:lng]):bat[:lng] ", "mvc_bat_restart_seq;", "restart
the sequence with value start" ]
[ "batsql", "round", "command batsql.round(v:bat[:bte], d:int,
s:int, r:bte):bat[:bte] ", "bte_bat_round_wrap;", "round off the decimal
v(d,s) to r digits behind the dot (if r < 0, before the dot)" ]
[ "batsql", "round", "command batsql.round(v:bat[:dbl],
r:bte):bat[:dbl] ", "dbl_bat_round_wrap;", "round off the floating point v to
r digits behind the dot (if r < 0, before the dot)" ]
[ "batsql", "round", "command batsql.round(v:bat[:flt],
r:bte):bat[:flt] ", "flt_bat_round_wrap;", "round off the floating point v to
r digits behind the dot (if r < 0, before the dot)" ]
diff --git a/clients/Tests/MAL-signatures.stable.out.int128
b/clients/Tests/MAL-signatures.stable.out.int128
--- a/clients/Tests/MAL-signatures.stable.out.int128
+++ b/clients/Tests/MAL-signatures.stable.out.int128
@@ -12737,6 +12737,13 @@ stdout of test 'MAL-signatures` in direc
[ "batsql", "prod", "pattern batsql.prod(b:bat[:sht], s:bat[:lng],
e:bat[:lng]):bat[:hge] ", "SQLprod;", "return the product of groups"
]
[ "batsql", "prod", "pattern batsql.prod(b:bat[:sht], s:bat[:lng],
e:bat[:lng]):bat[:lng] ", "SQLprod;", "return the product of groups"
]
[ "batsql", "rank", "pattern batsql.rank(b:bat[:any_1], p:any_2,
o:any_3):bat[:int] ", "SQLrank;", "return the ranked groups" ]
+[ "batsql", "restart", "unsafe pattern batsql.restart(sname:bat[:str],
sequence:bat[:str], start:bat[:lng]):bat[:lng] ", "mvc_bat_restart_seq;",
"restart the sequence with value start" ]
+[ "batsql", "restart", "unsafe pattern batsql.restart(sname:bat[:str],
sequence:bat[:str], start:lng):bat[:lng] ", "mvc_bat_restart_seq;",
"restart the sequence with value start" ]
+[ "batsql", "restart", "unsafe pattern batsql.restart(sname:bat[:str],
sequence:str, start:bat[:lng]):bat[:lng] ", "mvc_bat_restart_seq;",
"restart the sequence with value start" ]
+[ "batsql", "restart", "unsafe pattern batsql.restart(sname:bat[:str],
sequence:str, start:lng):bat[:lng] ", "mvc_bat_restart_seq;", "restart the
sequence with value start" ]
+[ "batsql", "restart", "unsafe pattern batsql.restart(sname:str,
sequence:bat[:str], start:bat[:lng]):bat[:lng] ", "mvc_bat_restart_seq;",
"restart the sequence with value start" ]
+[ "batsql", "restart", "unsafe pattern batsql.restart(sname:str,
sequence:bat[:str], start:lng):bat[:lng] ", "mvc_bat_restart_seq;", "restart
the sequence with value start" ]
+[ "batsql", "restart", "unsafe pattern batsql.restart(sname:str,
sequence:str, start:bat[:lng]):bat[:lng] ", "mvc_bat_restart_seq;", "restart
the sequence with value start" ]
[ "batsql", "round", "command batsql.round(v:bat[:bte], d:int,
s:int, r:bte):bat[:bte] ", "bte_bat_round_wrap;", "round off the decimal
v(d,s) to r digits behind the dot (if r < 0, before the dot)" ]
[ "batsql", "round", "command batsql.round(v:bat[:dbl],
r:bte):bat[:dbl] ", "dbl_bat_round_wrap;", "round off the floating point v to
r digits behind the dot (if r < 0, before the dot)" ]
[ "batsql", "round", "command batsql.round(v:bat[:flt],
r:bte):bat[:flt] ", "flt_bat_round_wrap;", "round off the floating point v to
r digits behind the dot (if r < 0, before the dot)" ]
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
@@ -5001,7 +5001,7 @@ check_for_foreign_key_references(mvc *sq
int found;
struct tablelist* new_node, *node_check;
- if(*error)
+ if (*error)
return;
if (t->keys.set) { /* Check for foreign key references */
@@ -5028,14 +5028,14 @@ check_for_foreign_key_references(mvc *sq
*error = 1;
return;
}
- } else if(k->t != t) {
+ } else if (k->t != t) {
found = 0;
for (node_check = list;
node_check; node_check = node_check->next) {
-
if(node_check->table == k->t)
+ if
(node_check->table == k->t)
found =
1;
}
- if(!found) {
- if((new_node =
MNEW(struct tablelist)) == NULL) {
+ if (!found) {
+ if ((new_node =
MNEW(struct tablelist)) == NULL) {
sql_error(sql, 02, SQLSTATE(HY001) MAL_MALLOC_FAIL);
*error
= 1;
return;
@@ -5071,7 +5071,7 @@ sql_truncate(backend *be, sql_table *t,
int error = 0;
struct tablelist* new_list = MNEW(struct tablelist), *list_node, *aux;
- if(!new_list) {
+ if (!new_list) {
sql_error(sql, 02, SQLSTATE(HY001) MAL_MALLOC_FAIL);
error = 1;
goto finalize;
@@ -5080,19 +5080,19 @@ sql_truncate(backend *be, sql_table *t,
new_list->table = t;
new_list->next = NULL;
check_for_foreign_key_references(sql, new_list, new_list, t, cascade,
&error);
- if(error)
+ if (error)
goto finalize;
for (list_node = new_list; list_node; list_node = list_node->next) {
next = list_node->table;
sche = next->s;
- if(restart_sequences) { /* restart the sequences if it's the
case */
+ if (restart_sequences) { /* restart the sequences if it's the
case */
for (n = next->columns.set->h; n; n = n->next) {
col = n->data;
if (col->def && (seq_pos = strstr(col->def,
next_value_for))) {
seq_name = _STRDUP(seq_pos +
(strlen(next_value_for) - strlen("seq_")));
- if(!seq_name) {
+ if (!seq_name) {
sql_error(sql, 02,
SQLSTATE(HY001) MAL_MALLOC_FAIL);
error = 1;
goto finalize;
@@ -5100,7 +5100,11 @@ sql_truncate(backend *be, sql_table *t,
seq_name[strlen(seq_name)-1] = '\0';
seq = find_sql_sequence(sche, seq_name);
if (seq) {
- sql_trans_sequence_restart(tr,
seq, seq->start);
+ if
(!sql_trans_sequence_restart(tr, seq, seq->start)) {
+ sql_error(sql, 02,
SQLSTATE(HY005) "Could not restart sequence %s.%s", sche->base.name, seq_name);
+ error = 1;
+ goto finalize;
+ }
seq->base.wtime =
sche->base.wtime = tr->wtime = tr->wstime;
tr->schema_updates++;
}
@@ -5112,8 +5116,8 @@ sql_truncate(backend *be, sql_table *t,
v = stmt_tid(be, next, 0);
/* before */
- if(be->cur_append && !be->first_statement_generated) {
- for(sql_table *up = t->p ; up ; up = up->p) {
+ if (be->cur_append && !be->first_statement_generated) {
+ for (sql_table *up = t->p ; up ; up = up->p) {
if (!sql_delete_triggers(be, up, v, 0, 3, 4)) {
sql_error(sql, 02, SQLSTATE(27000)
"TRUNCATE: triggers failed for table '%s'", up->base.name);
error = 1;
@@ -5135,12 +5139,12 @@ sql_truncate(backend *be, sql_table *t,
other = stmt_table_clear(be, next);
list_append(l, other);
- if(next == t)
+ if (next == t)
ret = other;
/* after */
- if(be->cur_append && !be->first_statement_generated) {
- for(sql_table *up = t->p ; up ; up = up->p) {
+ if (be->cur_append && !be->first_statement_generated) {
+ for (sql_table *up = t->p ; up ; up = up->p) {
if (!sql_delete_triggers(be, up, v, 1, 3, 4)) {
sql_error(sql, 02, SQLSTATE(27000)
"TRUNCATE: triggers failed for table '%s'", up->base.name);
error = 1;
@@ -5154,7 +5158,7 @@ sql_truncate(backend *be, sql_table *t,
goto finalize;
}
- if(be->cur_append) //building the total number of rows affected
across all tables
+ if (be->cur_append) //building the total number of rows
affected across all tables
other->nr = add_to_merge_partitions_accumulator(be,
other->nr);
}
@@ -5165,7 +5169,7 @@ finalize:
list_node = aux;
}
- if(error)
+ if (error)
return NULL;
return ret;
}
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
@@ -958,8 +958,148 @@ mvc_restart_seq(Client cntxt, MalBlkPtr
throw(SQL, "sql.restart", SQLSTATE(HY050) "Failed to fetch
sequence %s.%s", sname, seqname);
if (is_lng_nil(start))
throw(SQL, "sql.restart", SQLSTATE(HY050) "Cannot (re)start
sequence %s.%s with NULL", sname, seqname);
- *res = sql_trans_sequence_restart(m->session->tr, seq, start);
- return MAL_SUCCEED;
+ if (seq->minvalue && 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);
+ if (seq->maxvalue && 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);
+ if (sql_trans_sequence_restart(m->session->tr, seq, start)) {
+ *res = start;
+ return MAL_SUCCEED;
+ }
+ throw(SQL, "sql.restart", SQLSTATE(HY050) "Cannot (re)start sequence
%s.%s", sname, seqname);
+}
+
+str
+mvc_bat_restart_seq(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
+{
+ mvc *m = NULL;
+ str msg = MAL_SUCCEED, sname = NULL, seqname = NULL;
+ BAT *b = NULL, *c = NULL, *d = NULL, *r = NULL, *it;
+ BUN p, q;
+ sql_schema *s = NULL;
+ sql_sequence *seq = NULL;
+ seqbulk *sb = NULL;
+ BATiter bi, ci;
+ bat *res = getArgReference_bat(stk, pci, 0);
+ bat schid = 0, seqid = 0, startid = 0;
+ lng start = 0, *di = NULL;
+
+ if (isaBatType(getArgType(mb, pci, 1)))
+ schid = *getArgReference_bat(stk, pci, 1);
+ else
+ sname = *getArgReference_str(stk, pci, 1);
+ if (isaBatType(getArgType(mb, pci, 2)))
+ seqid = *getArgReference_bat(stk, pci, 2);
+ else
+ seqname = *getArgReference_str(stk, pci, 2);
+ if (isaBatType(getArgType(mb, pci, 3)))
+ startid = *getArgReference_bat(stk, pci, 3);
+ else
+ start = *getArgReference_lng(stk, pci, 3);
+
+ if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != NULL)
+ return msg;
+ if ((msg = checkSQLContext(cntxt)) != NULL)
+ return msg;
+
+ if (schid && !(b = BATdescriptor(schid))) {
+ msg = createException(SQL, "sql.restart", SQLSTATE(HY005)
"Cannot access column descriptor");
+ goto bailout;
+ }
+ if (seqid && !(c = BATdescriptor(seqid))) {
+ msg = createException(SQL, "sql.restart", SQLSTATE(HY005)
"Cannot access column descriptor");
+ goto bailout;
+ }
+ if (startid && !(d = BATdescriptor(startid))) {
+ msg = createException(SQL, "sql.restart", SQLSTATE(HY005)
"Cannot access column descriptor");
+ goto bailout;
+ }
+ assert(b || c || d);
+ it = b ? b : c ? c : d; /* Either b, c or d must be set */
+
+ if (!(r = COLnew(it->hseqbase, TYPE_lng, BATcount(it), TRANSIENT))) {
+ msg = createException(SQL, "sql.restart", SQLSTATE(HY001)
MAL_MALLOC_FAIL);
+ goto bailout;
+ }
+
+ if (!BATcount(it))
+ goto bailout; /* Success case */
+
+ if (b)
+ bi = bat_iterator(b);
+ if (c)
+ ci = bat_iterator(c);
+ if (d)
+ di = (lng *) Tloc(d, 0);
+
+ BATloop(it, p, q) {
+ str nsname, nseqname;
+ lng nstart;
+
+ if (b)
+ nsname = BUNtvar(bi, p);
+ else
+ nsname = sname;
+ if (c)
+ nseqname = BUNtvar(ci, p);
+ else
+ nseqname = seqname;
+ if (di)
+ nstart = di[p];
+ else
+ nstart = start;
+
+ if (!s || strcmp(s->base.name, nsname) != 0 || !seq ||
strcmp(seq->base.name, nseqname) != 0) {
+ if (sb) {
+ seqbulk_destroy(sb);
+ sb = NULL;
+ }
+ seq = NULL;
+ if ((!s || strcmp(s->base.name, nsname) != 0) && !(s =
mvc_bind_schema(m, nsname))) {
+ msg = createException(SQL, "sql.restart",
SQLSTATE(3F000) "Cannot find the schema %s", nsname);
+ goto bailout;
+ }
+ if (!(seq = find_sql_sequence(s, nseqname)) || !(sb =
seqbulk_create(seq, BATcount(it)))) {
+ msg = createException(SQL, "sql.restart",
SQLSTATE(HY050) "Cannot find the sequence %s.%s", nsname, nseqname);
+ goto bailout;
+ }
+ }
+ if (is_lng_nil(nstart)) {
+ msg = createException(SQL, "sql.restart",
SQLSTATE(HY050) "Cannot (re)start sequence %s.%s with NULL", sname, seqname);
+ goto bailout;
+ }
+ if (seq->minvalue && nstart < seq->minvalue) {
+ msg = createException(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);
+ goto bailout;
+ }
+ if (seq->maxvalue && nstart > seq->maxvalue) {
+ msg = createException(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);
+ goto bailout;
+ }
+ if (!sql_trans_seqbulk_restart(m->session->tr, sb, nstart)) {
+ msg = createException(SQL, "sql.restart",
SQLSTATE(HY050) "Cannot restart sequence %s.%s", nsname, nseqname);
+ goto bailout;
+ }
+ if (BUNappend(r, &nstart, false) != GDK_SUCCEED) {
+ msg = createException(SQL, "sql.restart",
SQLSTATE(HY001) MAL_MALLOC_FAIL);
+ goto bailout;
+ }
+ }
+
+bailout:
+ if (sb)
+ seqbulk_destroy(sb);
+ if (b)
+ BBPunfix(b->batCacheid);
+ if (c)
+ BBPunfix(c->batCacheid);
+ if (d)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list