Changeset: fa48df909ac5 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=fa48df909ac5
Added Files:
sql/test/BugTracker-2018/Tests/negative-sequences.Bug-6665.sql
sql/test/BugTracker-2018/Tests/negative-sequences.Bug-6665.stable.err
sql/test/BugTracker-2018/Tests/negative-sequences.Bug-6665.stable.out
Modified Files:
monetdb5/modules/atoms/mtime.c
sql/backends/monet5/sql.c
sql/backends/monet5/sql_cat.c
sql/server/rel_sequence.c
sql/server/sql_parser.y
sql/storage/store.c
sql/test/BugTracker-2018/Tests/All
sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out.powerpc64.int128
sql/test/testdb-upgrade/Tests/upgrade.stable.out.powerpc64.int128
Branch: default
Log Message:
Merge with Aug2018 branch.
diffs (truncated from 674 to 300 lines):
diff --git a/monetdb5/modules/atoms/mtime.c b/monetdb5/modules/atoms/mtime.c
--- a/monetdb5/modules/atoms/mtime.c
+++ b/monetdb5/modules/atoms/mtime.c
@@ -3261,7 +3261,7 @@ MTIMEdate_extract_quarter_bulk(bat *ret,
const date *t;
if ((b = BATdescriptor(*bid)) == NULL)
- throw(MAL, "batmtime.quarter", "Cannot access descriptor");
+ throw(MAL, "batmtime.quarter", SQLSTATE(HY005) "Cannot access
descriptor");
n = BATcount(b);
bn = COLnew(b->hseqbase, TYPE_int, n, TRANSIENT);
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
@@ -458,8 +458,10 @@ create_table_from_emit(Client cntxt, cha
/* for some reason we don't have an allocator here, so make one */
sql->sa = sa_create();
- if(!sql->sa)
- throw(SQL, "sql.catalog",SQLSTATE(HY001) MAL_MALLOC_FAIL);
+ if (!sql->sa) {
+ msg = sql_error(sql, 02, SQLSTATE(HY001) "CREATE TABLE: %s",
MAL_MALLOC_FAIL);
+ goto cleanup;
+ }
if (!sname)
sname = "sys";
@@ -512,14 +514,16 @@ create_table_from_emit(Client cntxt, cha
}
}
- cleanup:
- sa_destroy(sql->sa);
- sql->sa = NULL;
+cleanup:
+ if(sql->sa) {
+ sa_destroy(sql->sa);
+ sql->sa = NULL;
+ }
return msg;
}
str
-append_to_table_from_emit(Client cntxt, char *sname, char *tname, sql_emit_col
*columns, size_t ncols)
+append_to_table_from_emit(Client cntxt, char *sname, char *tname, sql_emit_col
*columns, size_t ncols)
{
size_t i;
sql_table *t;
@@ -534,8 +538,12 @@ append_to_table_from_emit(Client cntxt,
/* for some reason we don't have an allocator here, so make one */
sql->sa = sa_create();
-
- if (!sname)
+ if (!sql->sa) {
+ msg = sql_error(sql, 02, SQLSTATE(HY001) "CREATE TABLE: %s",
MAL_MALLOC_FAIL);
+ goto cleanup;
+ }
+
+ if (!sname)
sname = "sys";
if (!(s = mvc_bind_schema(sql, sname))) {
msg = sql_error(sql, 02, "3F000!CREATE TABLE: no such schema
'%s'", sname);
@@ -561,9 +569,11 @@ append_to_table_from_emit(Client cntxt,
}
}
- cleanup:
- sa_destroy(sql->sa);
- sql->sa = NULL;
+cleanup:
+ if(sql->sa) {
+ sa_destroy(sql->sa);
+ sql->sa = NULL;
+ }
return msg;
}
@@ -827,7 +837,7 @@ mvc_bat_next_value(Client cntxt, MalBlkP
BBPunfix(b->batCacheid);
BBPunfix(r->batCacheid);
seqbulk_destroy(sb);
- throw(SQL, "sql.next_value", SQLSTATE(HY050) "Cannot
generate next seuqnce value %s.%s", sname, seqname);
+ throw(SQL, "sql.next_value", SQLSTATE(HY050) "Cannot
generate next sequence value %s.%s", sname, seqname);
}
if (BUNappend(r, &l, false) != GDK_SUCCEED) {
BBPunfix(b->batCacheid);
@@ -1214,11 +1224,13 @@ mvc_grow_wrap(Client cntxt, MalBlkPtr mb
(void)cntxt;
*res = 0;
if ((tid = BATdescriptor(Tid)) == NULL)
- throw(SQL, "sql.grow", "Cannot access descriptor");
+ throw(SQL, "sql.grow", SQLSTATE(HY005) "Cannot access
descriptor");
if (tpe > GDKatomcnt)
tpe = TYPE_bat;
- if (tpe == TYPE_bat && (ins = BATdescriptor(*(int *) Ins)) == NULL)
- throw(SQL, "sql.append", "Cannot access descriptor");
+ if (tpe == TYPE_bat && (ins = BATdescriptor(*(int *) Ins)) == NULL) {
+ BBPunfix(Tid);
+ throw(SQL, "sql.grow", SQLSTATE(HY005) "Cannot access
descriptor");
+ }
if (ins) {
cnt = BATcount(ins);
BBPunfix(ins->batCacheid);
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
@@ -634,13 +634,16 @@ create_seq(mvc *sql, char *sname, char *
throw(SQL,"sql.create_seq", SQLSTATE(42000) "CREATE SEQUENCE:
name '%s' already in use", seq->base.name);
} else if (!mvc_schema_privs(sql, s)) {
throw(SQL,"sql.create_seq", SQLSTATE(42000) "CREATE SEQUENCE:
insufficient privileges for '%s' in schema '%s'", stack_get_string(sql,
"current_user"), s->base.name);
+ } else if (is_lng_nil(seq->start) || is_lng_nil(seq->minvalue) ||
is_lng_nil(seq->maxvalue) ||
+ is_lng_nil(seq->increment) ||
is_lng_nil(seq->cacheinc) || is_lng_nil(seq->cycle)) {
+ throw(SQL,"sql.create_seq", SQLSTATE(42000) "CREATE SEQUENCE:
sequence properties must be non-NULL");
}
sql_trans_create_sequence(sql->session->tr, s, seq->base.name,
seq->start, seq->minvalue, seq->maxvalue, seq->increment, seq->cacheinc,
seq->cycle, seq->bedropped);
return NULL;
}
static str
-alter_seq(mvc *sql, char *sname, char *seqname, sql_sequence *seq, lng *val)
+alter_seq(mvc *sql, char *sname, char *seqname, sql_sequence *seq, const lng
*val)
{
sql_schema *s = NULL;
sql_sequence *nseq = NULL;
@@ -654,8 +657,10 @@ alter_seq(mvc *sql, char *sname, char *s
throw(SQL,"sql.alter_seq", SQLSTATE(42000) "ALTER SEQUENCE: no
such sequence '%s'", seq->base.name);
} else if (!mvc_schema_privs(sql, s)) {
throw(SQL,"sql.alter_seq", SQLSTATE(42000) "ALTER SEQUENCE:
insufficient privileges for '%s' in schema '%s'", stack_get_string(sql,
"current_user"), s->base.name);
+ } else if (val && is_lng_nil(*val)) {
+ throw(SQL,"sql.alter_seq", SQLSTATE(42000) "ALTER SEQUENCE:
sequence value must be non-NULL");
}
-
+ /* if seq properties hold NULL values, then they should be ignored
during the update */
/* first alter the known values */
sql_trans_alter_sequence(sql->session->tr, nseq, seq->minvalue,
seq->maxvalue, seq->increment, seq->cacheinc, seq->cycle);
if (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
@@ -86,7 +86,7 @@ rel_create_seq(
{
sql_rel *res = NULL;
sql_sequence *seq = NULL;
- char* name = qname_table(qname);
+ char *name = qname_table(qname);
char *sname = qname_schema(qname);
sql_schema *s = NULL;
@@ -103,14 +103,15 @@ rel_create_seq(
}
/* generate defaults */
- if (inc <= 0) inc = 1;
- if (min < 0) min = 0;
- if (cycle && max < 0) cycle = 0;
- if (max < 0) max = 0;
- if (cache <= 0) cache = 1;
+ if (is_lng_nil(start)) start = 1;
+ if (is_lng_nil(inc)) inc = 1;
+ if (is_lng_nil(min)) min = 0;
+ if (cycle && is_lng_nil(max)) cycle = 0;
+ if (is_lng_nil(max)) max = 0;
+ if (is_lng_nil(cache)) cache = 1;
- seq = create_sql_sequence(sql->sa, s, name, start, min, max, inc,
cache, cycle);
- seq->bedropped = bedropped;
+ seq = create_sql_sequence(sql->sa, s, name, start, min, max, inc,
cache, (bit) cycle);
+ seq->bedropped = (bit) bedropped;
res = rel_seq(sql->sa, DDL_CREATE_SEQ, s->base.name, seq, NULL, NULL);
/* for multi statements we keep the sequence around */
if (res && stack_has_frame(sql, "MUL") != 0) {
@@ -139,7 +140,7 @@ list_create_seq(
{
dnode *n;
sql_subtype* t = NULL;
- lng start = 1, inc = 1, min = 0, max = 0, cache = 1;
+ lng start = lng_nil, inc = lng_nil, min = lng_nil, max = lng_nil, cache
= lng_nil;
int used = 0, cycle = 0;
/* check if no option is given twice */
@@ -157,36 +158,48 @@ list_create_seq(
if ((used&(1<<SEQ_START)))
return sql_error(sql, 02, SQLSTATE(3F000)
"CREATE SEQUENCE: START value should be passed as most once");
used |= (1<<SEQ_START);
+ if (is_lng_nil(s->data.l_val))
+ return sql_error(sql, 02, SQLSTATE(42000)
"CREATE SEQUENCE: START must not be null");
start = s->data.l_val;
break;
case SQL_INC:
if ((used&(1<<SEQ_INC)))
return sql_error(sql, 02, SQLSTATE(3F000)
"CREATE SEQUENCE: INCREMENT value should be passed as most once");
used |= (1<<SEQ_INC);
+ if (is_lng_nil(s->data.l_val))
+ return sql_error(sql, 02, SQLSTATE(42000)
"CREATE SEQUENCE: INCREMENT must not be null");
inc = s->data.l_val;
break;
case SQL_MINVALUE:
if ((used&(1<<SEQ_MIN)))
return sql_error(sql, 02, SQLSTATE(3F000)
"CREATE SEQUENCE: MINVALUE or NO MINVALUE should be passed as most once");
used |= (1<<SEQ_MIN);
+ if (is_lng_nil(s->data.l_val))
+ return sql_error(sql, 02, SQLSTATE(42000)
"CREATE SEQUENCE: MINVALUE must not be null");
min = s->data.l_val;
break;
case SQL_MAXVALUE:
if ((used&(1<<SEQ_MAX)))
return sql_error(sql, 02, SQLSTATE(3F000)
"CREATE SEQUENCE: MAXVALUE or NO MAXVALUE should be passed as most once");
used |= (1<<SEQ_MAX);
+ if (is_lng_nil(s->data.l_val))
+ return sql_error(sql, 02, SQLSTATE(42000)
"CREATE SEQUENCE: MAXVALUE must be non-NULL");
max = s->data.l_val;
break;
case SQL_CYCLE:
if ((used&(1<<SEQ_CYCLE)))
return sql_error(sql, 02, SQLSTATE(3F000)
"CREATE SEQUENCE: CYCLE or NO CYCLE should be passed as most once");
used |= (1<<SEQ_CYCLE);
+ if (is_lng_nil(s->data.l_val))
+ return sql_error(sql, 02, SQLSTATE(42000)
"CREATE SEQUENCE: CYCLE must be non-NULL");
cycle = s->data.i_val;
break;
case SQL_CACHE:
if ((used&(1<<SEQ_CACHE)))
return sql_error(sql, 02, SQLSTATE(3F000)
"CREATE SEQUENCE: CACHE value should be passed as most once");
used |= (1<<SEQ_CACHE);
+ if (is_lng_nil(s->data.l_val))
+ return sql_error(sql, 02, SQLSTATE(42000)
"CREATE SEQUENCE: CACHE must be non-NULL");
cache = s->data.l_val;
break;
default:
@@ -233,7 +246,7 @@ rel_alter_seq(
}
/* first alter the known values */
- seq = create_sql_sequence(sql->sa, s, name, seq->start, min, max, inc,
cache, cycle);
+ seq = create_sql_sequence(sql->sa, s, name, seq->start, min, max, inc,
cache, (bit) cycle);
/* restart may be a query, i.e. we create a statement
restart(ssname,seqname,value) */
@@ -268,7 +281,7 @@ list_alter_seq(
{
dnode *n;
sql_subtype* t = NULL;
- lng inc = -1, min = -1, max = -1, cache = -1;
+ lng inc = lng_nil, min = lng_nil, max = lng_nil, cache = lng_nil;
dlist *start = NULL;
int used = 0, cycle = 0;
@@ -287,24 +300,32 @@ list_alter_seq(
if ((used&(1<<SEQ_START)))
return sql_error(sql, 02, SQLSTATE(3F000)
"ALTER SEQUENCE: START value should be passed as most once");
used |= (1<<SEQ_START);
+ if (is_lng_nil(s->data.l_val))
+ return sql_error(sql, 02, SQLSTATE(42000)
"ALTER SEQUENCE: START must be non-NULL");
start = s->data.lval;
break;
case SQL_INC:
if ((used&(1<<SEQ_INC)))
return sql_error(sql, 02, SQLSTATE(3F000)
"ALTER SEQUENCE: INCREMENT value should be passed as most once");
used |= (1<<SEQ_INC);
+ if (is_lng_nil(s->data.l_val))
+ return sql_error(sql, 02, SQLSTATE(42000)
"ALTER SEQUENCE: INCREMENT must be non-NULL");
inc = s->data.l_val;
break;
case SQL_MINVALUE:
if ((used&(1<<SEQ_MIN)))
return sql_error(sql, 02, SQLSTATE(3F000)
"ALTER SEQUENCE: MINVALUE or NO MINVALUE should be passed as most once");
used |= (1<<SEQ_MIN);
+ if (is_lng_nil(s->data.l_val))
+ return sql_error(sql, 02, SQLSTATE(42000)
"ALTER SEQUENCE: MINVALUE must be non-NULL");
min = s->data.l_val;
break;
case SQL_MAXVALUE:
if ((used&(1<<SEQ_MAX)))
return sql_error(sql, 02, SQLSTATE(3F000)
"ALTER SEQUENCE: MAXVALUE or NO MAXVALUE should be passed as most once");
used |= (1<<SEQ_MAX);
+ if (is_lng_nil(s->data.l_val))
+ return sql_error(sql, 02, SQLSTATE(42000)
"ALTER SEQUENCE: MAXVALUE must be non-NULL");
max = s->data.l_val;
break;
case SQL_CYCLE:
@@ -317,6 +338,8 @@ list_alter_seq(
if ((used&(1<<SEQ_CACHE)))
return sql_error(sql, 02, SQLSTATE(3F000)
"ALTER SEQUENCE: CACHE value should be passed as most once");
used |= (1<<SEQ_CACHE);
+ if (is_lng_nil(s->data.l_val))
+ return sql_error(sql, 02, SQLSTATE(42000)
"ALTER SEQUENCE: CACHE must be non-NULL");
cache = s->data.l_val;
break;
default:
diff --git a/sql/server/sql_parser.y b/sql/server/sql_parser.y
--- a/sql/server/sql_parser.y
+++ b/sql/server/sql_parser.y
@@ -568,6 +568,7 @@ int yydebug=1;
lngval
poslng
nonzerolng
+ signedlng
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list