Changeset: f4b67f9daddb for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f4b67f9daddb
Modified Files:
        sql/server/rel_schema.c
        sql/server/sql_parser.y
Branch: Dec2016
Log Message:

Allow only atoms in the creation of a default value for a column. Also validate 
it correctly by casting to the column type


diffs (64 lines):

diff --git a/sql/server/rel_schema.c b/sql/server/rel_schema.c
--- a/sql/server/rel_schema.c
+++ b/sql/server/rel_schema.c
@@ -408,17 +408,16 @@ column_option(
                        if (e && is_atom(e->type)) {
                                atom *a = exp_value(sql, e, sql->args, 
sql->argc);
 
-                               if (atom_null(a)) {
-                                       mvc_default(sql, cs, NULL);
-                                       res = SQL_OK;
-                                       break;
+                               if(!atom_cast(sql->sa, a, &cs->type)) {
+                                       (void) sql_error(sql, 02, "42000!could 
not cast the default value to the column type\n");
+                                       return SQL_ERR;
                                }
                        }
                        /* reset error */
                        sql->session->status = 0;
                        sql->errstr[0] = '\0';
                }
-               r = symbol2string(sql, s->data.sym, &err);
+               r = symbol2string(sql, s->data.sym, &err);
                if (!r) {
                        (void) sql_error(sql, 02, "42000!incorrect default 
value '%s'\n", err?err:"");
                        if (err) _DELETE(err);
@@ -737,14 +736,25 @@ table_element(mvc *sql, symbol *s, sql_s
                char *cname = l->h->data.sval;
                symbol *sym = l->h->next->data.sym;
                sql_column *c = mvc_bind_column(sql, t, cname);
+               sql_exp *e = NULL;
 
                if (!c) {
                        sql_error(sql, 02, "42S22!ALTER TABLE: no such column 
'%s'\n", cname);
                        return SQL_ERR;
                }
+               e = rel_logical_value_exp(sql, NULL, sym, sql_sel);
+
+               if (e && is_atom(e->type)) {
+                       atom *a = exp_value(sql, e, sql->args, sql->argc);
+
+                       if(!atom_cast(sql->sa, a, &c->type)) {
+                               (void) sql_error(sql, 02, "42S22!ALTER TABLE: 
could not cast the default value to the column type\n");
+                               return SQL_ERR;
+                       }
+               }
                r = symbol2string(sql, sym, &err);
                if (!r) {
-                       (void) sql_error(sql, 02, "42000!incorrect default 
value '%s'\n", err?err:"");
+                       (void) sql_error(sql, 02, "42S22!ALTER TABLE: incorrect 
default value '%s'\n", err?err:"");
                        if (err) _DELETE(err);
                        return SQL_ERR;
                }
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
@@ -1517,7 +1517,7 @@ default:
  ;
 
 default_value:
-    simple_scalar_exp  { $$ = $1; }
+    atom       { $$ = $1; }
  ;
 
 column_constraint:
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to