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