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