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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list