Changeset: 2cadb0af2054 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2cadb0af2054 Added Files: sql/test/BugTracker-2017/Tests/default-insert-update.Bug-6249.sql Modified Files: sql/server/rel_updates.c sql/server/sql_parser.y sql/test/BugTracker-2017/Tests/All sql/test/BugTracker-2017/Tests/crash-select_after_MAL_error.Bug-6332.stable.out Branch: Jul2017 Log Message:
merged with 2016 diffs (110 lines): diff --git a/sql/server/rel_updates.c b/sql/server/rel_updates.c --- a/sql/server/rel_updates.c +++ b/sql/server/rel_updates.c @@ -23,6 +23,12 @@ insert_value(mvc *sql, sql_column *c, sq { if (s->token == SQL_NULL) { return exp_atom(sql->sa, atom_general(sql->sa, &c->type, NULL)); + } else if (s->token == SQL_DEFAULT) { + if (c->def) { + return rel_parse_val(sql, sa_message(sql->sa, "select CAST(%s AS %s);", c->def, c->type.type->sqlname), sql->emode); + } else { + return sql_error(sql, 02, "INSERT INTO: column '%s' has no valid default value", c->base.name); + } } else { int is_last = 0; exp_kind ek = {type_value, card_value, FALSE}; @@ -971,11 +977,19 @@ update_table(mvc *sql, dlist *qname, dli int status = sql->session->status; exp_kind ek = {type_value, (single)?card_column:card_relation, FALSE}; - if (single) + if(single && a->token == SQL_DEFAULT) { + char *colname = assignment->h->next->data.sval; + sql_column *col = mvc_bind_column(sql, t, colname); + if (col->def) { + v = rel_parse_val(sql, sa_message(sql->sa, "select CAST(%s AS %s);", col->def, col->type.type->sqlname), sql->emode); + } else { + return sql_error(sql, 02, "UPDATE: column '%s' has no valid default value", col->base.name); + } + } else if (single) { v = rel_value_exp(sql, &rel_val, a, sql_sel, ek); - else + } else { rel_val = rel_subquery(sql, NULL, a, ek, APPLY_JOIN); - + } if (!v) { sql->errstr[0] = 0; sql->session->status = status; 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 @@ -2888,6 +2888,7 @@ simple_atom: insert_atom: simple_atom + | DEFAULT { $$ = _symbol_create(SQL_DEFAULT, NULL ); } ; value: @@ -2908,7 +2909,12 @@ assignment_commalist: ; assignment: - column '=' search_condition + column '=' DEFAULT + { dlist *l = L(); + append_symbol(l, _symbol_create(SQL_DEFAULT, NULL ) ); + append_string(l, $1); + $$ = _symbol_create_list( SQL_ASSIGN, l); } + | column '=' search_condition { dlist *l = L(); append_symbol(l, $3 ); append_string(l, $1); diff --git a/sql/test/BugTracker-2017/Tests/All b/sql/test/BugTracker-2017/Tests/All --- a/sql/test/BugTracker-2017/Tests/All +++ b/sql/test/BugTracker-2017/Tests/All @@ -21,6 +21,7 @@ HAVE_NETCDF?rel2bin_project-assert.Bug-6 str2decimal.Bug-6206 integer_addition_overflow.Bug-6205 dce_bug-6177 +default-insert-update.Bug-6249 crash_on_NULL_ptr.Bug-6130 HAVE_SAMTOOLS?sqlsmith01 HAVE_NETCDF?sqlsmith02 diff --git a/sql/test/BugTracker-2017/Tests/default-insert-update.Bug-6249.sql b/sql/test/BugTracker-2017/Tests/default-insert-update.Bug-6249.sql new file mode 100644 --- /dev/null +++ b/sql/test/BugTracker-2017/Tests/default-insert-update.Bug-6249.sql @@ -0,0 +1,30 @@ +CREATE TABLE test1 (a INT DEFAULT -1); + +INSERT INTO test1 VALUES (1); +INSERT INTO test1 VALUES (DEFAULT); +INSERT INTO test1 VALUES (2), (DEFAULT), (3), (DEFAULT), (4); + +SELECT * FROM test1; + +UPDATE test1 SET a = DEFAULT WHERE a = 4; + +SELECT * FROM test1; + +DROP TABLE test1; + +CREATE TABLE test2 (a INT DEFAULT 0, b CLOB, c INT, d CLOB DEFAULT 'astring'); + +INSERT INTO test2 VALUES (1, 'a', 1, 'a'); +INSERT INTO test2 VALUES (DEFAULT, 'a', 1, DEFAULT); +INSERT INTO test2 VALUES (2, 'b', 2, 'b'), (100, 'other', -1, DEFAULT), (3, 'c', 3, 'c'), (DEFAULT, 'd', 4, 'd'); + +SELECT * FROM test2; + +UPDATE test2 SET d = DEFAULT, b = 'bbb' WHERE a = 1; + +SELECT * FROM test2; + +INSERT INTO test2 VALUES (1, 'a', DEFAULT, 'a'); --throw an error +UPDATE test2 SET b = DEFAULT; --throw an error + +DROP TABLE test2; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list