Changeset: 8419e638e083 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8419e638e083
Modified Files:
sql/server/rel_dump.c
sql/server/rel_unnest.c
sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out
Branch: linear-hashing
Log Message:
handle correlated subqueries with table functions better
diffs (90 lines):
diff --git a/sql/server/rel_dump.c b/sql/server/rel_dump.c
--- a/sql/server/rel_dump.c
+++ b/sql/server/rel_dump.c
@@ -405,7 +405,7 @@ rel_print_(mvc *sql, stream *fout, sql_
} break;
case op_table:
print_indent(sql, fout, depth, decorate);
- mnstr_printf(fout, "table ");
+ mnstr_printf(fout, "table (");
if (rel->r)
exp_print(sql, fout, rel->r, depth, refs, 1, 0);
@@ -415,6 +415,8 @@ rel_print_(mvc *sql, stream *fout, sql_
else
rel_print_(sql, fout, rel->l, depth+1, refs,
decorate);
}
+ print_indent(sql, fout, depth, decorate);
+ mnstr_printf(fout, ")");
if (rel->exps)
exps_print(sql, fout, rel->exps, depth, refs, 1, 0);
break;
diff --git a/sql/server/rel_unnest.c b/sql/server/rel_unnest.c
--- a/sql/server/rel_unnest.c
+++ b/sql/server/rel_unnest.c
@@ -1187,6 +1187,8 @@ push_up_set(mvc *sql, sql_rel *rel, list
return rel;
}
+static sql_rel * rel_unnest_dependent(mvc *sql, sql_rel *rel);
+
static sql_rel *
push_up_table(mvc *sql, sql_rel *rel, list *ad)
{
@@ -1194,16 +1196,23 @@ push_up_table(mvc *sql, sql_rel *rel, li
if (rel && (is_join(rel->op) || is_semi(rel->op)) && is_dependent(rel))
{
sql_rel *d = rel->l, *tf = rel->r;
- /* for now just push d into function */
+ /* push d into function */
if (d && is_distinct_set(sql, d, ad) && tf && is_base(tf->op)) {
if (tf->l) {
sql_rel *l = tf->l;
- assert(tf->flag == TABLE_FROM_RELATION ||
!l->l); /* TODO table functions implementation */
- l->l = rel_dup(d);
+ assert(tf->flag == TABLE_FROM_RELATION ||
!l->l);
+ if (l->l) {
+ l = tf->l = rel_crossproduct(sql->sa,
rel_dup(d), l, op_join);
+ set_dependent(l);
+ tf->l = rel_unnest_dependent(sql, l);
+ } else {
+ l->l = rel_dup(d);
+ }
} else {
tf->l = rel_dup(d);
}
+ reset_dependent(rel);
return rel;
}
}
@@ -1309,7 +1318,7 @@ rel_unnest_dependent(mvc *sql, sql_rel *
return rel_unnest_dependent(sql, rel);
}
- if (r && is_base(r->op) && is_distinct_set(sql, l, ad))
{ /* TODO table functions need dependent implementation */
+ if (r && is_base(r->op) && is_distinct_set(sql, l, ad))
{
rel = push_up_table(sql, rel, ad);
return rel;
}
diff --git
a/sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out
b/sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out
--- a/sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out
+++ b/sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out
@@ -27,12 +27,14 @@ stdout of test 'copy_multiple_files.SF-2
% .plan # table_name
% rel # name
% clob # type
-% 209 # length
+% 185 # length
insert(
| table(sys.cm_tmp) [ "cm_tmp"."i", "cm_tmp"."%TID%" NOT NULL ]
| union (
-| | table sys.copyfrom(table(cm_tmp), varchar "|", varchar "\n", varchar
"NULL", varchar "null", varchar "/file1", bigint "-1", bigint "0", int "0", int
"0", varchar "NULL", int "0"), [ "cm_tmp"."i" ] COUNT ,
-| | table sys.copyfrom(table(cm_tmp), varchar "|", varchar "\n", varchar
"NULL", varchar "null", varchar "/file2", bigint "-1", bigint "0", int "0", int
"0", varchar "NULL", int "0"), [ "cm_tmp"."i" ] COUNT
+| | table (sys.copyfrom(table(cm_tmp), varchar "|", varchar "\n", varchar
"NULL", varchar "null", varchar "/file1", bigint "-1", bigint "0", int "0", int
"0", varchar "NULL", int "0"),
+| | ) [ "cm_tmp"."i" ] COUNT ,
+| | table (sys.copyfrom(table(cm_tmp), varchar "|", varchar "\n", varchar
"NULL", varchar "null", varchar "/file2", bigint "-1", bigint "0", int "0", int
"0", varchar "NULL", int "0"),
+| | ) [ "cm_tmp"."i" ] COUNT
| ) [ int "NULL" ]
)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list