Changeset: 2e498093cbf9 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=2e498093cbf9
Modified Files:
        sql/src/server/rel_dump.mx
        sql/src/server/rel_schema.mx
        sql/src/server/rel_select.mx
        sql/src/server/sql_mvc.mx
        sql/src/server/sql_semantic.mx
Branch: Oct2010
Log Message:

check for errors in default values.
Fix bug 2744


diffs (184 lines):

diff -r 8ebbfd337e71 -r 2e498093cbf9 sql/src/server/rel_dump.mx
--- a/sql/src/server/rel_dump.mx        Wed Dec 08 00:44:33 2010 +0100
+++ b/sql/src/server/rel_dump.mx        Fri Dec 10 14:49:30 2010 +0100
@@ -301,7 +301,9 @@
        }       break;
        case op_table:
                print_indent(sql, fout, depth);
-               mnstr_printf(fout, "table");
+               mnstr_printf(fout, "table ");
+               if (rel->l)
+                       exp_print(sql, fout, rel->l, depth, 1, 0);
                if (rel->exps) 
                        exps_print(sql, fout, rel->exps, depth, 1, 0);
                break;
diff -r 8ebbfd337e71 -r 2e498093cbf9 sql/src/server/rel_schema.mx
--- a/sql/src/server/rel_schema.mx      Wed Dec 08 00:44:33 2010 +0100
+++ b/sql/src/server/rel_schema.mx      Fri Dec 10 14:49:30 2010 +0100
@@ -359,11 +359,17 @@
                res = column_constraint_type(sql, opt_name, sym, ss, t, cs);
        }       break;
        case SQL_DEFAULT: {
-               char *r = symbol2string(sql, s->data.sym);
+               char *err = NULL, *r = symbol2string(sql, s->data.sym, &err);
 
-               mvc_default(sql, cs, r);
-               _DELETE(r);
-               res = SQL_OK;
+               if (!r) {
+                       (void) sql_error(sql, 02, "incorrect default value 
'%s'\n", err?err:"");
+                       if (err) _DELETE(err);
+                       return SQL_ERR;
+               } else {
+                       mvc_default(sql, cs, r);
+                       _DELETE(r);
+                       res = SQL_OK;
+               }
        }       break;
        case SQL_ATOM: {
                AtomNode *an = (AtomNode *) s;
@@ -637,7 +643,7 @@
        }       break;
        case SQL_DEFAULT:
        {
-               char *r;
+               char *r, *err = NULL;
                dlist *l = s->data.lval;
                char *cname = l->h->data.sval;
                symbol *sym = l->h->next->data.sym;
@@ -647,7 +653,12 @@
                        sql_error(sql, 02, "ALTER TABLE: no such column 
'%s'\n", cname);
                        return SQL_ERR;
                }
-               r = symbol2string(sql, sym);
+               r = symbol2string(sql, sym, &err);
+               if (!r) {
+                       (void) sql_error(sql, 02, "incorrect default value 
'%s'\n", err?err:"");
+                       if (err) _DELETE(err);
+                       return SQL_ERR;
+               }
                mvc_default(sql, c, r);
                _DELETE(r);
        }
diff -r 8ebbfd337e71 -r 2e498093cbf9 sql/src/server/rel_select.mx
--- a/sql/src/server/rel_select.mx      Wed Dec 08 00:44:33 2010 +0100
+++ b/sql/src/server/rel_select.mx      Fri Dec 10 14:49:30 2010 +0100
@@ -3468,9 +3468,11 @@
                if (groupby->r && exps_intern(groupby->r)) {
                        sql_rel *i = groupby->l;
 
-                       e = flatten_exps(sql, i->exps);
-                       e = exp_aggr1(e, a, distinct, 1, groupby->card, 0);
-                       return e;
+                       if (i->exps) {
+                               e = flatten_exps(sql, i->exps);
+                               e = exp_aggr1(e, a, distinct, 1, groupby->card, 
0);
+                               return e;
+                       }
                }
                e = exp_aggr(NULL, a, distinct, 0, groupby->card, 0);
                if (*rel == groupby && f == sql_sel) /* selection */
diff -r 8ebbfd337e71 -r 2e498093cbf9 sql/src/server/sql_mvc.mx
--- a/sql/src/server/sql_mvc.mx Wed Dec 08 00:44:33 2010 +0100
+++ b/sql/src/server/sql_mvc.mx Fri Dec 10 14:49:30 2010 +0100
@@ -1438,7 +1438,7 @@
                fprintf(stderr, "mvc_default %s %s\n", col->base.name, val);
 
        if (col->t->persistence == SQL_DECLARED_TABLE) {
-               col->def = sa_strdup(m->sa, val);
+               col->def = val?sa_strdup(m->sa, val):NULL;
                return col;
        } else {
                return sql_trans_alter_default(m->session->tr, col, val);
diff -r 8ebbfd337e71 -r 2e498093cbf9 sql/src/server/sql_semantic.mx
--- a/sql/src/server/sql_semantic.mx    Wed Dec 08 00:44:33 2010 +0100
+++ b/sql/src/server/sql_semantic.mx    Fri Dec 10 14:49:30 2010 +0100
@@ -102,8 +102,8 @@
 extern int stmt_set_type_param(mvc *sql, sql_subtype *type, stmt *param);
 extern void sql_destroy_params(mvc *sql);      /* used in backend */
 
-extern char *symbol2string(mvc *sql, symbol *s);
-extern char *dlist2string(mvc *sql, dlist *s);
+extern char *symbol2string(mvc *sql, symbol *s, char **err);
+extern char *dlist2string(mvc *sql, dlist *s, char **err);
 
 extern char * toUpperCopy(char *dest, const char *src); 
 
@@ -865,14 +865,21 @@
        return(dest);
 }
 
-char *dlist2string(mvc *sql, dlist *l)
+char *dlist2string(mvc *sql, dlist *l, char **err)
 {
        char *b = NULL;
        dnode *n;
 
        for (n=l->h; n; n = n->next) {
-               char *s = symbol2string(sql, n->data.sym);
+               char *s = NULL;
 
+               if (n->type == type_string && n->data.sval)
+                       s = _strdup(n->data.sval);
+               else if (n->type == type_symbol)
+                       s = symbol2string(sql, n->data.sym, err);
+
+               if (!s)
+                       return NULL;
                if (b) {
                        char *o = b;
                        b = strconcat(b,s);
@@ -885,7 +892,7 @@
        return b;
 }
 
-char *symbol2string(mvc *sql, symbol *se)
+char *symbol2string(mvc *sql, symbol *se, char **err)
 {
        int len = 0;
        char buf[BUFSIZ];
@@ -901,7 +908,7 @@
                for (; ops; ops = ops->next) {
                        char *tmp;
                        len = snprintf( buf+len, BUFSIZ-len, "%s%s", 
-                               tmp = symbol2string(sql, ops->data.sym), 
+                               tmp = symbol2string(sql, ops->data.sym, err), 
                                (ops->next)?",":"");
                        _DELETE(tmp);
                }
@@ -910,8 +917,8 @@
        case SQL_BINOP: {
                dnode *lst = se->data.lval->h;
                char *op = qname_fname(lst->data.lval);
-               char *l = symbol2string(sql, lst->next->data.sym);
-               char *r = symbol2string(sql, lst->next->next->data.sym);
+               char *l = symbol2string(sql, lst->next->data.sym, err);
+               char *r = symbol2string(sql, lst->next->next->data.sym, err);
                len = snprintf( buf+len, BUFSIZ-len, "%s(%s,%s)", op, l, r); 
                _DELETE(l);
                _DELETE(r);
@@ -924,7 +931,7 @@
        case SQL_UNOP: {
                dnode *lst = se->data.lval->h;
                char *op = qname_fname(lst->data.lval);
-               char *l = symbol2string(sql, lst->next->data.sym);
+               char *l = symbol2string(sql, lst->next->data.sym, err);
                len = snprintf( buf+len, BUFSIZ-len, "%s(%s)", op, l); 
                _DELETE(l);
                break;
@@ -957,12 +964,14 @@
                if (dlist_length(l) == 1 && l->h->type == type_int) {
                        atom *a = sql_bind_arg(sql, l->h->data.i_val);
                        return atom2sql(a);
+               } else {
+                       *err = dlist2string(sql, l, err);
                }
                return NULL;
        }       
        case SQL_CAST: {
                dlist *dl = se->data.lval;
-               char *val = symbol2string(sql, dl->h->data.sym);
+               char *val = symbol2string(sql, dl->h->data.sym, err);
                char *tpe = subtype2string(&dl->h->next->data.typeval);
        
                len = snprintf( buf+len, BUFSIZ-len, "cast ( %s as %s )",
_______________________________________________
Checkin-list mailing list
Checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to