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

Reply via email to