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

Reply via email to