Changeset: 21cd62446f5d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=21cd62446f5d
Added Files:
        sql/test/miscellaneous/Tests/column_aliases.sql
        sql/test/miscellaneous/Tests/column_aliases.stable.err
        sql/test/miscellaneous/Tests/column_aliases.stable.out
Modified Files:
        sql/server/rel_rel.c
        sql/server/rel_select.c
        sql/test/BugTracker-2018/Tests/lateral-join-crash.Bug-6613.sql
        sql/test/BugTracker-2018/Tests/lateral-join-crash.Bug-6613.stable.out
        
sql/test/BugTracker-2018/Tests/lateral-join-crash.Bug-6613.stable.out.int128
        sql/test/miscellaneous/Tests/All
Branch: default
Log Message:

Added missing column cast in table and table returning UDF aliases e.g. select 
t2.c, t2.d from t1 as t2(c, d)


diffs (truncated from 408 to 300 lines):

diff --git a/sql/server/rel_rel.c b/sql/server/rel_rel.c
--- a/sql/server/rel_rel.c
+++ b/sql/server/rel_rel.c
@@ -545,6 +545,7 @@ rel_project_add_exp( mvc *sql, sql_rel *
                if (!rel->exps)
                        rel->exps = new_exp_list(sql->sa);
                append(rel->exps, e);
+               rel->nrcols++;
                if (e->card > rel->card)
                        rel->card = e->card;
        } else if (rel->op == op_groupby) {
@@ -647,6 +648,7 @@ rel_groupby_add_aggr(mvc *sql, sql_rel *
                        exp_setname(sql->sa, e, nme, nme);
                }
                append(rel->exps, e);
+               rel->nrcols++;
                m = e;
        }
        ne = exp_column(sql->sa, exp_relname(m), exp_name(m), exp_subtype(m),
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -217,6 +217,8 @@ rel_table_optname(mvc *sql, sql_rel *sq,
                        sq = rel_project(sql->sa, sq, rel_projections(sql, sq, 
NULL, 1, 1));
                        osq = sq;
                }
+               if (columnrefs && dlist_length(columnrefs) > sq->nrcols)
+                       return sql_error(sql, 02, SQLSTATE(42000) "SELECT: The 
number of aliases is longer than the number of columns (%d>%d)", 
dlist_length(columnrefs), sq->nrcols);
                if (columnrefs && sq->exps) {
                        dnode *d = columnrefs->h;
                        node *ne = sq->exps->h;
@@ -608,7 +610,7 @@ rel_named_table_function(sql_query *quer
                        append(tl, exp_subtype(e));
                }
        }
-               
+
        if (sname)
                s = mvc_bind_schema(sql, sname);
        e = find_table_function(sql, s, fname, exps, tl);
@@ -650,6 +652,8 @@ rel_named_table_function(sql_query *quer
                append(exps, exp_column(sql->sa, tname, a->name, &a->type, 
CARD_MULTI, 1, 0));
        }
        rel = rel_table_func(sql->sa, rel, e, exps, (sq != NULL));
+       if (ast->data.lval->h->next->data.sym && 
ast->data.lval->h->next->data.sym->data.lval->h->next->data.lval)
+               rel = rel_table_optname(sql, rel, 
ast->data.lval->h->next->data.sym);
        return rel;
 }
 
@@ -712,7 +716,7 @@ rel_values(sql_query *query, symbol *tab
        symbol *optname = rowlist->t->data.sym;
        dnode *o;
        node *m;
-       list *exps = sa_list(sql->sa); 
+       list *exps = sa_list(sql->sa);
 
        exp_kind ek = {type_value, card_value, TRUE};
        if (!rowlist->h)
@@ -784,8 +788,8 @@ rel_values(sql_query *query, symbol *tab
                vals->f = nexps;
        }
        r = rel_project(sql->sa, NULL, exps);
-       rel_table_optname(sql, r, optname);
-       return r;
+       r->nrcols = list_length(exps);
+       return rel_table_optname(sql, r, optname);
 }
 
 static int
@@ -813,6 +817,7 @@ table_ref(sql_query *query, sql_rel *rel
        mvc *sql = query->sql;
        char *tname = NULL;
        sql_table *t = NULL;
+       sql_rel *res = NULL;
 
        if (tableref->token == SQL_NAME) {
                dlist *name = tableref->data.lval->h->data.lval;
@@ -888,7 +893,10 @@ table_ref(sql_query *query, sql_rel *rel
                if ((isMergeTable(t) || isReplicaTable(t)) && 
list_empty(t->members.set))
                        return sql_error(sql, 02, SQLSTATE(42000) "MERGE or 
REPLICA TABLE should have at least one table associated");
 
-               return rel_basetable(sql, t, tname);
+               res = rel_basetable(sql, t, tname);
+               if (tableref->data.lval->h->next->data.sym && 
tableref->data.lval->h->next->data.sym->data.lval->h->next->data.lval) /* AS 
with column aliases */
+                       res = rel_table_optname(sql, res, 
tableref->data.lval->h->next->data.sym);
+               return res;
        } else if (tableref->token == SQL_VALUES) {
                return rel_values(query, tableref);
        } else if (tableref->token == SQL_TABLE) {
diff --git a/sql/test/BugTracker-2018/Tests/lateral-join-crash.Bug-6613.sql 
b/sql/test/BugTracker-2018/Tests/lateral-join-crash.Bug-6613.sql
--- a/sql/test/BugTracker-2018/Tests/lateral-join-crash.Bug-6613.sql
+++ b/sql/test/BugTracker-2018/Tests/lateral-join-crash.Bug-6613.sql
@@ -5,4 +5,6 @@ select t.* from segments as s, lateral g
 select t.value, s.distance, s.speed from segments as s, lateral 
generate_series(s.meter, s.meter+s.distance+1) as t;
 select * from segments as s, lateral generate_series(s.meter, 
s.meter+s.distance+1);
 select t.*, s.distance, s.speed from segments as s, lateral 
generate_series(s.meter, s.meter+s.distance+1) as t;
+select t.meter, s.distance, s.speed from segments as s, lateral 
generate_series(s.meter, s.meter+s.distance+1) as t(meter);
+select t.*, s.distance, s.speed from segments as s, lateral 
generate_series(s.meter, s.meter+s.distance+1) as t(meter);
 rollback;
diff --git 
a/sql/test/BugTracker-2018/Tests/lateral-join-crash.Bug-6613.stable.out 
b/sql/test/BugTracker-2018/Tests/lateral-join-crash.Bug-6613.stable.out
--- a/sql/test/BugTracker-2018/Tests/lateral-join-crash.Bug-6613.stable.out
+++ b/sql/test/BugTracker-2018/Tests/lateral-join-crash.Bug-6613.stable.out
@@ -142,6 +142,64 @@ stdout of test 'lateral-join-crash.Bug-6
 [ 16,  9,      9       ]
 [ 17,  9,      9       ]
 [ 18,  9,      9       ]
+#select t.meter, s.distance, s.speed from segments as s, lateral 
generate_series(s.meter, s.meter+s.distance+1) as t(meter);
+% .t,  sys.s,  sys.s # table_name
+% meter,       distance,       speed # name
+% bigint,      int,    int # type
+% 2,   1,      1 # length
+[ 1,   1,      1       ]
+[ 2,   1,      1       ]
+[ 9,   1,      1       ]
+[ 10,  1,      1       ]
+[ 11,  1,      1       ]
+[ 12,  1,      1       ]
+[ 13,  1,      1       ]
+[ 14,  1,      1       ]
+[ 15,  1,      1       ]
+[ 16,  1,      1       ]
+[ 17,  1,      1       ]
+[ 18,  1,      1       ]
+[ 1,   9,      9       ]
+[ 2,   9,      9       ]
+[ 9,   9,      9       ]
+[ 10,  9,      9       ]
+[ 11,  9,      9       ]
+[ 12,  9,      9       ]
+[ 13,  9,      9       ]
+[ 14,  9,      9       ]
+[ 15,  9,      9       ]
+[ 16,  9,      9       ]
+[ 17,  9,      9       ]
+[ 18,  9,      9       ]
+#select t.*, s.distance, s.speed from segments as s, lateral 
generate_series(s.meter, s.meter+s.distance+1) as t(meter);
+% .t,  sys.s,  sys.s # table_name
+% meter,       distance,       speed # name
+% bigint,      int,    int # type
+% 2,   1,      1 # length
+[ 1,   1,      1       ]
+[ 2,   1,      1       ]
+[ 9,   1,      1       ]
+[ 10,  1,      1       ]
+[ 11,  1,      1       ]
+[ 12,  1,      1       ]
+[ 13,  1,      1       ]
+[ 14,  1,      1       ]
+[ 15,  1,      1       ]
+[ 16,  1,      1       ]
+[ 17,  1,      1       ]
+[ 18,  1,      1       ]
+[ 1,   9,      9       ]
+[ 2,   9,      9       ]
+[ 9,   9,      9       ]
+[ 10,  9,      9       ]
+[ 11,  9,      9       ]
+[ 12,  9,      9       ]
+[ 13,  9,      9       ]
+[ 14,  9,      9       ]
+[ 15,  9,      9       ]
+[ 16,  9,      9       ]
+[ 17,  9,      9       ]
+[ 18,  9,      9       ]
 #rollback;
 
 # 00:28:47 >  
diff --git 
a/sql/test/BugTracker-2018/Tests/lateral-join-crash.Bug-6613.stable.out.int128 
b/sql/test/BugTracker-2018/Tests/lateral-join-crash.Bug-6613.stable.out.int128
--- 
a/sql/test/BugTracker-2018/Tests/lateral-join-crash.Bug-6613.stable.out.int128
+++ 
b/sql/test/BugTracker-2018/Tests/lateral-join-crash.Bug-6613.stable.out.int128
@@ -142,6 +142,64 @@ stdout of test 'lateral-join-crash.Bug-6
 [ 16,  9,      9       ]
 [ 17,  9,      9       ]
 [ 18,  9,      9       ]
+#select t.meter, s.distance, s.speed from segments as s, lateral 
generate_series(s.meter, s.meter+s.distance+1) as t(meter);
+% .t,  sys.s,  sys.s # table_name
+% meter,       distance,       speed # name
+% hugeint,     int,    int # type
+% 2,   1,      1 # length
+[ 1,   1,      1       ]
+[ 2,   1,      1       ]
+[ 9,   1,      1       ]
+[ 10,  1,      1       ]
+[ 11,  1,      1       ]
+[ 12,  1,      1       ]
+[ 13,  1,      1       ]
+[ 14,  1,      1       ]
+[ 15,  1,      1       ]
+[ 16,  1,      1       ]
+[ 17,  1,      1       ]
+[ 18,  1,      1       ]
+[ 1,   9,      9       ]
+[ 2,   9,      9       ]
+[ 9,   9,      9       ]
+[ 10,  9,      9       ]
+[ 11,  9,      9       ]
+[ 12,  9,      9       ]
+[ 13,  9,      9       ]
+[ 14,  9,      9       ]
+[ 15,  9,      9       ]
+[ 16,  9,      9       ]
+[ 17,  9,      9       ]
+[ 18,  9,      9       ]
+#select t.*, s.distance, s.speed from segments as s, lateral 
generate_series(s.meter, s.meter+s.distance+1) as t(meter);
+% .t,  sys.s,  sys.s # table_name
+% meter,       distance,       speed # name
+% hugeint,     int,    int # type
+% 2,   1,      1 # length
+[ 1,   1,      1       ]
+[ 2,   1,      1       ]
+[ 9,   1,      1       ]
+[ 10,  1,      1       ]
+[ 11,  1,      1       ]
+[ 12,  1,      1       ]
+[ 13,  1,      1       ]
+[ 14,  1,      1       ]
+[ 15,  1,      1       ]
+[ 16,  1,      1       ]
+[ 17,  1,      1       ]
+[ 18,  1,      1       ]
+[ 1,   9,      9       ]
+[ 2,   9,      9       ]
+[ 9,   9,      9       ]
+[ 10,  9,      9       ]
+[ 11,  9,      9       ]
+[ 12,  9,      9       ]
+[ 13,  9,      9       ]
+[ 14,  9,      9       ]
+[ 15,  9,      9       ]
+[ 16,  9,      9       ]
+[ 17,  9,      9       ]
+[ 18,  9,      9       ]
 #rollback;
 
 # 00:28:47 >  
diff --git a/sql/test/miscellaneous/Tests/All b/sql/test/miscellaneous/Tests/All
--- a/sql/test/miscellaneous/Tests/All
+++ b/sql/test/miscellaneous/Tests/All
@@ -1,3 +1,4 @@
+column_aliases
 declared_tables
 #now
 trace_test
diff --git a/sql/test/miscellaneous/Tests/column_aliases.sql 
b/sql/test/miscellaneous/Tests/column_aliases.sql
new file mode 100644
--- /dev/null
+++ b/sql/test/miscellaneous/Tests/column_aliases.sql
@@ -0,0 +1,9 @@
+create table t1 (aa int, bb int, cc int);
+insert into t1 values (1,1,1);
+select t2.dd, t2.ee, t2.ff from t1 as t2(dd,ee,ff);
+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
+drop table t1;
+select t3.output from generate_series(1, 2) as t3(output);
diff --git a/sql/test/miscellaneous/Tests/column_aliases.stable.err 
b/sql/test/miscellaneous/Tests/column_aliases.stable.err
new file mode 100644
--- /dev/null
+++ b/sql/test/miscellaneous/Tests/column_aliases.stable.err
@@ -0,0 +1,44 @@
+stderr of test 'column_aliases` in directory 'sql/test/miscellaneous` itself:
+
+
+# 11:21:19 >  
+# 11:21:19 >  "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" 
"mapi_open=true" "--set" "mapi_port=38503" "--set" 
"mapi_usock=/var/tmp/mtest-2631/.s.monetdb.38503" "--set" "monet_prompt=" 
"--forcemito" 
"--dbpath=/home/ferreira/repositories/MonetDB-default/BUILD/var/MonetDB/mTests_sql_test_miscellaneous"
 "--set" "monet_daemon=yes" "--set" "embedded_c=true"
+# 11:21:19 >  
+
+# builtin opt  gdk_dbpath = 
/home/ferreira/repositories/MonetDB-default/BUILD/var/monetdb5/dbfarm/demo
+# builtin opt  monet_prompt = >
+# builtin opt  monet_daemon = no
+# builtin opt  mapi_port = 50000
+# builtin opt  mapi_open = false
+# builtin opt  mapi_ipv6 = false
+# builtin opt  mapi_autosense = false
+# builtin opt  sql_optimizer = default_pipe
+# builtin opt  sql_debug = 0
+# cmdline opt  gdk_nr_threads = 0
+# cmdline opt  mapi_open = true
+# cmdline opt  mapi_port = 38503
+# cmdline opt  mapi_usock = /var/tmp/mtest-2631/.s.monetdb.38503
+# cmdline opt  monet_prompt = 
+# cmdline opt  gdk_dbpath = 
/home/ferreira/repositories/MonetDB-default/BUILD/var/MonetDB/mTests_sql_test_miscellaneous
+# cmdline opt  monet_daemon = yes
+# cmdline opt  embedded_c = true
+#client2:!ERROR:ParseException:SQLparser:42000!SELECT: Duplicate column name 
't2.dd'
+#client2:!ERROR:ParseException:SQLparser:42000!SELECT: The number of aliases 
is longer the number of columns (4>3)
+
+# 11:21:19 >  
+# 11:21:19 >  "mclient" "-lsql" "-ftest" "-tnone" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-2631" "--port=38503"
+# 11:21:19 >  
+
+MAPI  = (monetdb) /var/tmp/mtest-2631/.s.monetdb.38503
+QUERY = select t2.aa from t1 as t2(dd,dd,cc); --error
+ERROR = !SELECT: Duplicate column name 't2.dd'
+CODE  = 42000
+MAPI  = (monetdb) /var/tmp/mtest-2631/.s.monetdb.38503
+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)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to