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

Reply via email to