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

Reply via email to