Changeset: 6f614acb4529 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6f614acb4529
Modified Files:
sql/server/rel_schema.c
Branch: Dec2011
Log Message:
SQL: give error when creating a view with incorrect number of columsn.
Better to give an error than a crash when you do:
create view (a,b) as select x from t;
diffs (93 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
@@ -114,13 +114,13 @@ view_rename_columns( mvc *sql, char *nam
return sq;
}
-static char *
-as_subquery( mvc *sql, sql_table *t, sql_rel *sq, dlist *column_spec )
+static int
+as_subquery( mvc *sql, sql_table *t, sql_rel *sq, dlist *column_spec, const
char *msg )
{
sql_rel *r = sq;
if (!r)
- return NULL;
+ return 0;
if (is_topn(r->op) || is_sample(r->op))
r = sq->l;
@@ -129,15 +129,21 @@ as_subquery( mvc *sql, sql_table *t, sql
dnode *n = column_spec->h;
node *m = r->exps->h;
- for (; n; n = n->next, m = m->next) {
+ for (; n && m; n = n->next, m = m->next) {
char *cname = n->data.sval;
sql_exp *e = m->data;
sql_subtype *tp = exp_subtype(e);
- if (mvc_bind_column(sql, t, cname))
- return cname;
+ if (mvc_bind_column(sql, t, cname)) {
+ sql_error(sql, 01, "42S21!%s: duplicate column
name %s", msg, cname);
+ return -1;
+ }
mvc_create_column(sql, t, cname, tp);
}
+ if (n || m) {
+ sql_error(sql, 01, "21S02!%s: number of columns does
not match", msg);
+ return -1;
+ }
} else {
node *m;
@@ -148,28 +154,27 @@ as_subquery( mvc *sql, sql_table *t, sql
if (!cname)
cname = "v";
- if (mvc_bind_column(sql, t, cname))
- return cname;
+ if (mvc_bind_column(sql, t, cname)) {
+ sql_error(sql, 01, "42S21!%s: duplicate column
name %s", msg, cname);
+ return -1;
+ }
mvc_create_column(sql, t, cname, tp);
}
}
- return NULL;
+ return 0;
}
sql_table *
mvc_create_table_as_subquery( mvc *sql, sql_rel *sq, sql_schema *s, char
*tname, dlist *column_spec, int temp, int commit_action )
{
- char *n;
int tt =(temp == SQL_REMOTE)?tt_remote:
(temp == SQL_STREAM)?tt_stream:
((temp == SQL_MERGE_TABLE)?tt_merge_table:tt_table);
sql_table *t = mvc_create_table(sql, s, tname, tt, 0,
SQL_DECLARED_TABLE, commit_action, -1);
- if ((n = as_subquery( sql, t, sq, column_spec)) != NULL) {
- sql_error(sql, 01, "42S21!CREATE TABLE: duplicate column name
%s", n);
+ if (as_subquery( sql, t, sq, column_spec, "CREATE TABLE") != 0)
return NULL;
- }
return t;
}
@@ -916,11 +921,8 @@ rel_create_view(mvc *sql, sql_schema *ss
rel_add_intern(sql, sq);
if (create) {
- char *n;
-
t = mvc_create_view(sql, s, name, SQL_DECLARED_TABLE,
q, 0);
- if ((n = as_subquery( sql, t, sq, column_spec)) !=
NULL) {
- sql_error(sql, 01, "42S21!CREATE VIEW:
duplicate column name %s", n);
+ if (as_subquery( sql, t, sq, column_spec, "CREATE
VIEW") != 0) {
rel_destroy(sq);
return NULL;
}
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list