Changeset: 77b303797442 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=77b303797442
Modified Files:
sql/backends/monet5/sql.c
sql/server/rel_schema.c
sql/test/miscellaneous/Tests/column_aliases.sql
sql/test/miscellaneous/Tests/column_aliases.stable.err
sql/test/miscellaneous/Tests/column_aliases.stable.out
Branch: default
Log Message:
Defensive lines. Disallow generated labels in columns names, otherwise at
rel_bin the code generation confuses columns with indexes
diffs (156 lines):
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -494,7 +494,10 @@ create_table_from_emit(Client cntxt, cha
tpe = *t;
}
- if (!(col = mvc_create_column(sql, t, columns[i].name, &tpe))) {
+ if (columns[i].name && columns[i].name[0] == '%') {
+ msg = sql_error(sql, 02, SQLSTATE(42000) "CREATE TABLE:
generated labels not allowed in column names, use an alias instead");
+ goto cleanup;
+ } else if (!(col = mvc_create_column(sql, t, columns[i].name,
&tpe))) {
msg = sql_error(sql, 02, SQLSTATE(3F000) "CREATE TABLE:
could not create column %s", columns[i].name);
goto cleanup;
}
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
@@ -133,15 +133,15 @@ view_rename_columns( mvc *sql, char *nam
}
static int
-as_subquery( mvc *sql, sql_table *t, sql_rel *sq, dlist *column_spec, const
char *msg )
+as_subquery(mvc *sql, sql_table *t, sql_rel *sq, dlist *column_spec, const
char *msg)
{
- sql_rel *r = sq;
+ sql_rel *r = sq;
if (!r)
return 0;
- if (is_topn(r->op) || is_sample(r->op))
- r = sq->l;
+ if (is_topn(r->op) || is_sample(r->op))
+ r = sq->l;
if (column_spec) {
dnode *n = column_spec->h;
@@ -152,7 +152,10 @@ as_subquery( mvc *sql, sql_table *t, sql
sql_exp *e = m->data;
sql_subtype *tp = exp_subtype(e);
- if (mvc_bind_column(sql, t, cname)) {
+ if (!isView(t) && cname && cname[0] == '%') {
+ sql_error(sql, 01, SQLSTATE(42000) "%s:
generated labels not allowed in column names, use an alias instead", msg);
+ return -1;
+ } else if (mvc_bind_column(sql, t, cname)) {
sql_error(sql, 01, SQLSTATE(42S21) "%s:
duplicate column name %s", msg, cname);
return -1;
}
@@ -170,9 +173,12 @@ as_subquery( mvc *sql, sql_table *t, sql
const char *cname = exp_name(e);
sql_subtype *tp = exp_subtype(e);
- if (!cname)
+ if (!cname) {
cname = "v";
- if (mvc_bind_column(sql, t, cname)) {
+ } else if (!isView(t) && cname[0] == '%') {
+ sql_error(sql, 01, SQLSTATE(42000) "%s:
generated labels not allowed in column names, use an alias instead", msg);
+ return -1;
+ } else if (mvc_bind_column(sql, t, cname)) {
sql_error(sql, 01, SQLSTATE(42S21) "%s:
duplicate column name %s", msg, cname);
return -1;
}
@@ -192,7 +198,6 @@ mvc_create_table_as_subquery( mvc *sql,
sql_table *t = mvc_create_table(sql, s, tname, tt, 0,
SQL_DECLARED_TABLE, commit_action, -1, 0);
if (as_subquery( sql, t, sq, column_spec, "CREATE TABLE") != 0)
-
return NULL;
return t;
}
@@ -695,8 +700,10 @@ create_column(sql_query *query, symbol *
if (cname && ctype) {
sql_column *cs = NULL;
- cs = find_sql_column(t, cname);
- if (cs) {
+ if (!isView(t) && cname && cname[0] == '%') {
+ sql_error(sql, 01, SQLSTATE(42000) "%s TABLE: generated
labels not allowed in column names, use an alias instead",
(alter)?"ALTER":"CREATE");
+ return SQL_ERR;
+ } else if ((cs = find_sql_column(t, cname))) {
sql_error(sql, 02, SQLSTATE(42S21) "%s TABLE: a column
named '%s' already exists\n", (alter)?"ALTER":"CREATE", cname);
return SQL_ERR;
}
@@ -872,7 +879,10 @@ table_element(sql_query *query, symbol *
for (n = ot->columns.set->h; n; n = n->next) {
sql_column *oc = n->data;
- if (mvc_bind_column(sql, t, oc->base.name)) {
+ if (!isView(t) && oc->base.name && oc->base.name[0] ==
'%') {
+ sql_error(sql, 02, SQLSTATE(42000) "CREATE
TABLE: generated labels not allowed in column names, use an alias instead");
+ return SQL_ERR;
+ } else if (mvc_bind_column(sql, t, oc->base.name)) {
sql_error(sql, 02, SQLSTATE(42S21) "CREATE
TABLE: a column named '%s' already exists\n", oc->base.name);
return SQL_ERR;
}
@@ -1213,7 +1223,7 @@ rel_create_view(sql_query *query, sql_sc
q = query_cleaned(q);
t = mvc_create_view(sql, s, name, SQL_DECLARED_TABLE,
q, 0);
GDKfree(q);
- if (as_subquery( sql, t, sq, column_spec, "CREATE
VIEW") != 0) {
+ if (as_subquery(sql, t, sq, column_spec, "CREATE VIEW")
!= 0) {
rel_destroy(sq);
return NULL;
}
diff --git a/sql/test/miscellaneous/Tests/column_aliases.sql
b/sql/test/miscellaneous/Tests/column_aliases.sql
--- a/sql/test/miscellaneous/Tests/column_aliases.sql
+++ b/sql/test/miscellaneous/Tests/column_aliases.sql
@@ -5,5 +5,11 @@ select t2.cc from t1 as t2(dd);
select t2.ee from t1 as t2(dd,ee);
select t2.aa from t1 as t2(dd,dd,cc); --error
select t2.dd from t1 as t2(dd,ee,ff,gg); --error
+select t3.output from generate_series(1, 2) as t3(output);
+
+create table t2 as (select count(*) from t1); --error, labels not allowed in
column names
+create table t2 as (select count(*) as "mylabel" from t1); --allowed
+select count(*) from t2;
+
drop table t1;
-select t3.output from generate_series(1, 2) as t3(output);
+drop table t2;
diff --git a/sql/test/miscellaneous/Tests/column_aliases.stable.err
b/sql/test/miscellaneous/Tests/column_aliases.stable.err
--- a/sql/test/miscellaneous/Tests/column_aliases.stable.err
+++ b/sql/test/miscellaneous/Tests/column_aliases.stable.err
@@ -37,6 +37,10 @@ MAPI = (monetdb) /var/tmp/mtest-2631/.s
QUERY = select t2.dd from t1 as t2(dd,ee,ff,gg); --error
ERROR = !SELECT: The number of aliases is longer than the number of columns
(4>3)
CODE = 42000
+MAPI = (monetdb) /var/tmp/mtest-92354/.s.monetdb.36336
+QUERY = create table t2 as (select count(*) from t1); --error, labels not
allowed in column names
+ERROR = !CREATE TABLE: generated labels not allowed in column names, use an
alias instead
+CODE = 42000
# 11:21:19 >
# 11:21:19 > "Done."
diff --git a/sql/test/miscellaneous/Tests/column_aliases.stable.out
b/sql/test/miscellaneous/Tests/column_aliases.stable.out
--- a/sql/test/miscellaneous/Tests/column_aliases.stable.out
+++ b/sql/test/miscellaneous/Tests/column_aliases.stable.out
@@ -90,6 +90,15 @@ stdout of test 'column_aliases` in direc
% tinyint # type
% 1 # length
[ 1 ]
+#create table t2 as (select count(*) as "mylabel" from t1); --allowed
+#select count(*) from t2;
+% .%1 # table_name
+% %1 # name
+% bigint # type
+% 1 # length
+[ 1 ]
+#drop table t1;
+#drop table t2;
# 11:21:19 >
# 11:21:19 > "Done."
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list