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
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list