Changeset: 24d1f738cf7c for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=24d1f738cf7c
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
Branch: Dec2016
Log Message:
INSERT INTO and UPDATE statements with default values of columns. Fixes bug 6249
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
@@ -2822,6 +2822,7 @@ simple_atom:
insert_atom:
simple_atom
+ | DEFAULT { $$ = _symbol_create(SQL_DEFAULT, NULL ); }
;
value:
@@ -2842,7 +2843,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
prepare.Bug-6133
null-quantile.Bug-6218
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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list