Changeset: 8b00131c3de5 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8b00131c3de5
Modified Files:
clients/Tests/SQL-dump.stable.out
clients/Tests/SQL-dump.stable.out.int128
monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out
sql/common/sql_list.c
sql/include/sql_list.h
sql/server/rel_optimizer.c
sql/test/BugTracker-2009/Tests/copy_multiple_files.SF-2902320.stable.out
sql/test/BugTracker-2009/Tests/segfault_when_quitting_debugger.SF-2538837.stable.out
sql/test/Tests/systemfunctions.stable.out
sql/test/Tests/systemfunctions.stable.out.int128
sql/test/leaks/Tests/check1.stable.out.int128
sql/test/leaks/Tests/check2.stable.out.int128
sql/test/leaks/Tests/check3.stable.out.int128
sql/test/leaks/Tests/check4.stable.out.int128
sql/test/leaks/Tests/check5.stable.out.int128
Branch: default
Log Message:
approved output after fwf merge
optimized join reorder more.
diffs (truncated from 485 to 300 lines):
diff --git a/clients/Tests/SQL-dump.stable.out
b/clients/Tests/SQL-dump.stable.out
--- a/clients/Tests/SQL-dump.stable.out
+++ b/clients/Tests/SQL-dump.stable.out
@@ -3438,7 +3438,7 @@ drop function pcre_replace(string, strin
[ "sys", "concat", "arg_1", "varchar", 0, 0,
1, "arg_2", "varchar", 0, 0, 1, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL ]
[ "sys", "contains", "a", "geometry", 0, 0, 1,
"x", "double", 53, 0, 1, "y", "double", 53,
0, 1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL ]
[ "sys", "copyfrom", "arg_1", "varchar", 0, 0,
1, "arg_2", "varchar", 0, 0, 1, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL ]
-[ "sys", "copyfrom", "arg_1", "varchar", 0, 0,
1, "arg_2", "varchar", 0, 0, 1, "arg_3",
"varchar", 0, 0, 1, "arg_4", "varchar", 0,
0, 1, "arg_5", "varchar", 0, 0, 1,
"arg_6", "varchar", 0, 0, 1, "arg_7",
"bigint", 64, 0, 1, "arg_8", "bigint", 64,
0, 1, "arg_9", "int", 32, 0, 1, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL ]
+[ "sys", "copyfrom", "arg_1", "varchar", 0, 0,
1, "arg_2", "varchar", 0, 0, 1, "arg_3",
"varchar", 0, 0, 1, "arg_4", "varchar", 0,
0, 1, "arg_5", "varchar", 0, 0, 1,
"arg_6", "varchar", 0, 0, 1, "arg_7",
"bigint", 64, 0, 1, "arg_8", "bigint", 64,
0, 1, "arg_9", "int", 32, 0, 1, "arg_:",
"varchar", 0, 0, 1, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
]
[ "sys", "corr", "e1", "bigint", 64, 0, 1, "e2",
"bigint", 64, 0, 1, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
]
[ "sys", "corr", "e1", "double", 53, 0, 1, "e2",
"double", 53, 0, 1, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
]
[ "sys", "corr", "e1", "int", 32, 0, 1, "e2", "int",
32, 0, 1, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL ]
diff --git a/clients/Tests/SQL-dump.stable.out.int128
b/clients/Tests/SQL-dump.stable.out.int128
--- a/clients/Tests/SQL-dump.stable.out.int128
+++ b/clients/Tests/SQL-dump.stable.out.int128
@@ -3481,7 +3481,7 @@ drop function pcre_replace(string, strin
% sys.s, sys.f, .arg16, .arg16, .arg16, .arg16, .arg16, .arg16, .arg16,
.arg16, .arg16, .arg16, .arg16, .arg16, .arg16, .arg16, .arg16, .arg16, .arg16,
.arg16, .arg16, .arg16, .arg16, .arg16, .arg16, .arg16, .arg16, .arg16, .arg16,
.arg16, .arg16, .arg16, .arg16, .arg16, .arg16, .arg16, .arg16, .arg16, .arg16,
.arg16, .arg16, .arg16, .arg16, .arg16, .arg16, .arg16, .arg16, .arg16, .arg16,
.arg16, .arg16, .arg16, .arg16, .arg16, .arg16, .arg16, .arg16, .arg16, .arg16,
.arg16, .arg16, .arg16, .arg16, .arg16, .arg16, .arg16, .arg16, .arg16, .arg16,
.arg16, .arg16, .arg16, .arg16, .arg16, .arg16, .arg16, .arg16 # table_name
% name, name, name1, type1, type_digits1, type_scale1, inout1,
name2, type2, type_digits2, type_scale2, inout2, name3, type3,
type_digits3, type_scale3, inout3, name4, type4, type_digits4,
type_scale4, inout4, name5, type5, type_digits5, type_scale5, inout5,
name6, type6, type_digits6, type_scale6, inout6, name7, type7,
type_digits7, type_scale7, inout7, name8, type8, type_digits8,
type_scale8, inout8, name9, type9, type_digits9, type_scale9, inout9,
name10, type10, type_digits10, type_scale10, inout10, name11, type11,
type_digits11, type_scale11, inout11, name12, type12, type_digits12,
type_scale12, inout12, name13, type13, type_digits13, type_scale13,
inout13, name14, type14, type_digits14, type_scale14, inout14,
name15, type15, type_digits15, type_scale15, inout15 # name
% varchar, varchar, varchar, varchar, int, int,
tinyint, varchar, varchar, int, int, tinyint,
varchar, varchar, int, int, tinyint, varchar,
varchar, int, int, tinyint, varchar, varchar,
int, int, tinyint, varchar, varchar, int, int,
tinyint, varchar, varchar, int, int, tinyint,
varchar, varchar, int, int, tinyint, varchar,
varchar, int, int, tinyint, varchar, varchar,
int, int, tinyint, varchar, varchar, int, int,
tinyint, varchar, varchar, int, int, tinyint,
varchar, varchar, int, int, tinyint, varchar,
varchar, int, int, tinyint, varchar, varchar,
int, int, tinyint # type
-% 8, 35, 16, 14, 4, 1, 1, 16, 14, 3,
1, 1, 27, 12, 3, 1, 1, 12, 7, 2,
1, 1, 10, 7, 2, 1, 1, 8, 7, 2,
1, 1, 9, 6, 2, 1, 1, 10, 6, 2,
1, 1, 8, 7, 2, 1, 1, 8, 6, 2,
1, 1, 5, 7, 2, 1, 1, 8, 6, 2,
1, 1, 6, 7, 1, 1, 1, 8, 6, 2,
1, 1, 5, 4, 1, 1, 1 # length
+% 8, 35, 16, 14, 4, 1, 1, 16, 14, 3,
1, 1, 27, 12, 3, 1, 1, 12, 7, 2,
1, 1, 10, 7, 2, 1, 1, 8, 7, 2,
1, 1, 9, 6, 2, 1, 1, 10, 6, 2,
1, 1, 8, 7, 2, 1, 1, 8, 7, 2,
1, 1, 5, 7, 2, 1, 1, 8, 6, 2,
1, 1, 6, 7, 1, 1, 1, 8, 6, 2,
1, 1, 5, 4, 1, 1, 1 # length
[ "bam", "bam_drop_file", "dbschema", "smallint", 16,
0, 1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL ]
[ "bam", "bam_export", NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL ]
[ "bam", "bam_flag", "flag", "smallint", 16, 0, 1,
"name", "clob", 0, 0, 1, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
]
@@ -3635,7 +3635,7 @@ drop function pcre_replace(string, strin
[ "sys", "concat", "arg_1", "varchar", 0, 0,
1, "arg_2", "varchar", 0, 0, 1, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL ]
[ "sys", "contains", "a", "geometry", 0, 0, 1,
"x", "double", 53, 0, 1, "y", "double", 53,
0, 1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL ]
[ "sys", "copyfrom", "arg_1", "varchar", 0, 0,
1, "arg_2", "varchar", 0, 0, 1, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL ]
-[ "sys", "copyfrom", "arg_1", "varchar", 0, 0,
1, "arg_2", "varchar", 0, 0, 1, "arg_3",
"varchar", 0, 0, 1, "arg_4", "varchar", 0,
0, 1, "arg_5", "varchar", 0, 0, 1,
"arg_6", "varchar", 0, 0, 1, "arg_7",
"bigint", 64, 0, 1, "arg_8", "bigint", 64,
0, 1, "arg_9", "int", 32, 0, 1, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL ]
+[ "sys", "copyfrom", "arg_1", "varchar", 0, 0,
1, "arg_2", "varchar", 0, 0, 1, "arg_3",
"varchar", 0, 0, 1, "arg_4", "varchar", 0,
0, 1, "arg_5", "varchar", 0, 0, 1,
"arg_6", "varchar", 0, 0, 1, "arg_7",
"bigint", 64, 0, 1, "arg_8", "bigint", 64,
0, 1, "arg_9", "int", 32, 0, 1, "arg_:",
"varchar", 0, 0, 1, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
]
[ "sys", "corr", "e1", "bigint", 64, 0, 1, "e2",
"bigint", 64, 0, 1, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
]
[ "sys", "corr", "e1", "double", 53, 0, 1, "e2",
"double", 53, 0, 1, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
]
[ "sys", "corr", "e1", "hugeint", 128, 0, 1, "e2",
"hugeint", 128, 0, 1, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
]
diff --git
a/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out
b/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out
--- a/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out
+++ b/monetdb5/extras/mal_optimizer_template/Tests/opt_sql_append.stable.out
@@ -61,12 +61,12 @@ Ready.
% .explain # table_name
% mal # name
% clob # type
-% 118 # length
+% 126 # length
function user.s4_1():void;
X_24:void := querylog.define("explain copy into ttt from
\\'/tmp/xyz\\';","default_pipe",12);
barrier X_51 := language.dataflow();
X_1 := sql.mvc();
- (X_11:bat[:int],X_12:bat[:int],X_13:bat[:int]) :=
sql.copy_from(nil,"|","\\n",nil:str,"null","/tmp/xyz",-1,0,0,0);
+ (X_11:bat[:int],X_12:bat[:int],X_13:bat[:int]) :=
sql.copy_from(nil,"|","\\n",nil:str,"null","/tmp/xyz",-1,0,0,0,nil:str);
exit X_51;
X_14 := sql.append(X_1,"sys","ttt","a",X_11);
X_18 := sql.append(X_14,"sys","ttt","b",X_12);
@@ -95,12 +95,12 @@ end user.s4_1;
% .explain # table_name
% mal # name
% clob # type
-% 118 # length
+% 126 # length
function user.s12_1():void;
X_24:void := querylog.define("explain copy into ttt from
\\'/tmp/xyz\\';","user_1",12);
barrier X_52 := language.dataflow();
X_1 := sql.mvc();
- (X_11:bat[:int],X_12:bat[:int],X_13:bat[:int]) :=
sql.copy_from(nil,"|","\\n",nil:str,"null","/tmp/xyz",-1,0,0,0);
+ (X_11:bat[:int],X_12:bat[:int],X_13:bat[:int]) :=
sql.copy_from(nil,"|","\\n",nil:str,"null","/tmp/xyz",-1,0,0,0,nil:str);
exit X_52;
X_14 := sql.append(X_1,"sys","ttt","a",X_11);
X_18 := sql.append(X_14,"sys","ttt","b",X_12);
diff --git a/sql/common/sql_list.c b/sql/common/sql_list.c
--- a/sql/common/sql_list.c
+++ b/sql/common/sql_list.c
@@ -448,21 +448,6 @@ list_distinct(list *l, fcmp cmp, fdup du
return res;
}
-static node *
-list_find2(list *l, void *data, void *key, fcmp2 cmp)
-{
- node *n = NULL;
-
- if (key) {
- for (n = l->h; n; n = n->next) {
- if (cmp(data, n->data, key) == 0) {
- return n;
- }
- }
- }
- return NULL;
-}
-
int
list_position(list *l, void *val)
{
@@ -487,20 +472,6 @@ list_fetch(list *l, int pos)
return NULL;
}
-list *
-list_distinct2(list *l, void *data, fcmp2 cmp, fdup dup)
-{
- list *res = list_new_(l);
- node *n = NULL;
-
- for (n = l->h; n; n = n->next) {
- if (!list_find2(res, data, n->data, cmp)) {
- list_append(res, dup?dup(n->data):n->data);
- }
- }
- return res;
-}
-
void *
list_reduce(list *l, freduce red, fdup dup)
{
diff --git a/sql/include/sql_list.h b/sql/include/sql_list.h
--- a/sql/include/sql_list.h
+++ b/sql/include/sql_list.h
@@ -69,7 +69,6 @@ extern void * list_fetch(list *l, int po
extern list *list_select(list *l, void *key, fcmp cmp, fdup dup);
extern list *list_order(list *l, fcmp cmp, fdup dup);
extern list *list_distinct(list *l, fcmp cmp, fdup dup);
-extern list *list_distinct2(list *l, void *data, fcmp2 cmp, fdup dup);
extern void *list_reduce(list *l, freduce red, fdup dup);
extern void *list_reduce2(list *l, freduce2 red, sql_allocator *sa);
extern list *list_map(list *l, void *data, fmap f);
diff --git a/sql/server/rel_optimizer.c b/sql/server/rel_optimizer.c
--- a/sql/server/rel_optimizer.c
+++ b/sql/server/rel_optimizer.c
@@ -399,29 +399,6 @@ exp_keyvalue(sql_exp *e)
return cnt;
}
-static int
-joinexp_cmp(list *rels, sql_exp *h, sql_exp *key)
-{
- sql_rel *h_l;
- sql_rel *h_r;
- sql_rel *key_l;
- sql_rel *key_r;
-
- assert (!h || !key || (h->type == e_cmp && key->type == e_cmp));
- if (is_complex_exp(h->flag) || is_complex_exp(key->flag))
- return -1;
- h_l = find_rel(rels, h->l);
- h_r = find_rel(rels, h->r);
- key_l = find_rel(rels, key->l);
- key_r = find_rel(rels, key->r);
-
- if (h_l == key_l && h_r == key_r)
- return 0;
- if (h_r == key_l && h_l == key_r)
- return 0;
- return -1;
-}
-
static sql_exp *
joinexp_col(sql_exp *e, sql_rel *r)
{
@@ -640,15 +617,74 @@ rel_find_column( sql_allocator *sa, sql_
return NULL;
}
+static int
+find_join_rels(list **L, list **R, list *exps, list *rels)
+{
+ node *n;
+
+ *L = sa_list(exps->sa);
+ *R = sa_list(exps->sa);
+ if (!exps || list_length(exps) <= 1)
+ return -1;
+ for(n = exps->h; n; n = n->next) {
+ sql_exp *e = n->data;
+ sql_rel *l = NULL, *r = NULL;
+
+ if (!is_complex_exp(e->flag)){
+ l = find_rel(rels, e->l);
+ r = find_rel(rels, e->r);
+ }
+ if (l<r) {
+ list_append(*L, l);
+ list_append(*R, r);
+ } else {
+ list_append(*L, r);
+ list_append(*R, l);
+ }
+ }
+ return 0;
+}
+
+static list *
+distinct_join_exps(list *aje, list *lrels, list *rrels)
+{
+ node *n, *m, *o, *p;
+ int len = 0, i, j;
+ char *used = SA_NEW_ARRAY(aje->sa, char, len = list_length(aje));
+ list *res = sa_list(aje->sa);
+
+ memset(used, 0, len);
+ assert(len == list_length(lrels));
+ for(n = lrels->h, m = rrels->h, j = 0; n && m;
+ n = n->next, m = m->next, j++) {
+ if (n->data && m->data)
+ for(o = n->next, p = m->next, i = j+1; o && p;
+ o = o->next, p = p->next, i++) {
+ if (o->data == n->data && p->data == m->data)
+ used[i] = 1;
+ }
+ }
+ for (i = 0, n = aje->h; i < len; n = n->next, i++) {
+ if (!used[i])
+ list_append(res, n->data);
+ }
+ return res;
+}
+
static list *
find_fk( mvc *sql, list *rels, list *exps)
{
node *djn;
list *sdje, *aje, *dje;
+ list *lrels, *rrels;
/* first find the distinct join expressions */
aje = list_select(exps, rels, (fcmp) &exp_is_join, (fdup)NULL);
- dje = list_distinct2(aje, rels, (fcmp2) &joinexp_cmp, (fdup)NULL);
+ /* add left/right relation */
+ if (find_join_rels(&lrels, &rrels, aje, rels) < 0)
+ dje = aje;
+ else
+ dje = distinct_join_exps(aje, lrels, rrels);
for(djn=dje->h; djn; djn = djn->next) {
/* equal join expressions */
sql_idx *idx = NULL;
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
@@ -28,12 +28,12 @@ Ready.
% .plan # table_name
% rel # name
% clob # type
-% 180 # length
+% 196 # 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"), [ 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"), [ 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"), [ 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"), [ cm_tmp.i ] COUNT
| ) [ int "NULL" ]
)
diff --git
a/sql/test/BugTracker-2009/Tests/segfault_when_quitting_debugger.SF-2538837.stable.out
b/sql/test/BugTracker-2009/Tests/segfault_when_quitting_debugger.SF-2538837.stable.out
---
a/sql/test/BugTracker-2009/Tests/segfault_when_quitting_debugger.SF-2538837.stable.out
+++
b/sql/test/BugTracker-2009/Tests/segfault_when_quitting_debugger.SF-2538837.stable.out
@@ -22,7 +22,7 @@ Ready.
#debug select * from tables;
mdb>#X_1=0@0:void := user.s1_1();
-mdb>#X_159=0@0:void := querylog.define("debug select * from
tables;","default_pipe",630);
+mdb>#X_159=0@0:void := querylog.define("debug select * from
tables;","default_pipe",374);
# 16:24:01 >
# 16:24:01 > "Done."
diff --git a/sql/test/Tests/systemfunctions.stable.out
b/sql/test/Tests/systemfunctions.stable.out
--- a/sql/test/Tests/systemfunctions.stable.out
+++ b/sql/test/Tests/systemfunctions.stable.out
@@ -419,6 +419,7 @@ Ready.
[ "sys", "copyfrom", 7, "bigint", "" ]
[ "sys", "copyfrom", 8, "bigint", "" ]
[ "sys", "copyfrom", 9, "int", "" ]
+[ "sys", "copyfrom", 10, "varchar", "" ]
[ "sys", "copyfrom", 0, "table", "importTable" ]
[ "sys", "copyfrom", 1, "varchar", "" ]
[ "sys", "copyfrom", 2, "varchar", "" ]
diff --git a/sql/test/Tests/systemfunctions.stable.out.int128
b/sql/test/Tests/systemfunctions.stable.out.int128
--- a/sql/test/Tests/systemfunctions.stable.out.int128
+++ b/sql/test/Tests/systemfunctions.stable.out.int128
@@ -448,6 +448,7 @@ Ready.
[ "sys", "copyfrom", 7, "bigint", "" ]
[ "sys", "copyfrom", 8, "bigint", "" ]
[ "sys", "copyfrom", 9, "int", "" ]
+[ "sys", "copyfrom", 10, "varchar", "" ]
[ "sys", "copyfrom", 0, "table", "importTable" ]
[ "sys", "copyfrom", 1, "varchar", "" ]
[ "sys", "copyfrom", 2, "varchar", "" ]
diff --git a/sql/test/leaks/Tests/check1.stable.out.int128
b/sql/test/leaks/Tests/check1.stable.out.int128
--- a/sql/test/leaks/Tests/check1.stable.out.int128
+++ b/sql/test/leaks/Tests/check1.stable.out.int128
@@ -43,7 +43,7 @@ Ready.
[ "bit", 1726 ]
[ "bit", 1726 ]
[ "bit", 1726 ]
-[ "bte", 4877 ]
+[ "bte", 4878 ]
[ "int", 0 ]
[ "int", 0 ]
[ "int", 0 ]
@@ -123,11 +123,11 @@ Ready.
[ "int", 1726 ]
[ "int", 3911 ]
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list