Changeset: 4615c8d963c7 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4615c8d963c7 Removed Files: sql/jdbc/tests/Tests/bogus-auto-generated-keys.SQL.bat sql/jdbc/tests/Tests/bogus-auto-generated-keys.SQL.sh Modified Files: gdk/gdk_bbp.c sql/jdbc/tests/Tests/All sql/jdbc/tests/Tests/JDBC_API_Tester.stable.err sql/jdbc/tests/Tests/JDBC_API_Tester.stable.out sql/server/rel_optimizer.c sql/test/FeatureRequests/Tests/foreign_key_outer_join_dead_code_elimination-prologue.stable.out Branch: Oct2020 Log Message:
merged diffs (truncated from 351 to 300 lines): diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c --- a/gdk/gdk_bbp.c +++ b/gdk/gdk_bbp.c @@ -2447,7 +2447,7 @@ decref(bat i, bool logical, bool release * if they have been made cold or are not dirty */ if (BBP_refs(i) > 0 || (BBP_lrefs(i) > 0 && - (b == NULL || BATdirtydata(b) || !(BBP_status(i) & BBPPERSISTENT) || GDKinmemory()))) { + (b == NULL || BATdirty(b) || !(BBP_status(i) & BBPPERSISTENT) || GDKinmemory()))) { /* bat cannot be swapped out */ } else if (b ? b->batSharecnt == 0 : (BBP_status(i) & BBPTMP)) { /* bat will be unloaded now. set the UNLOADING bit diff --git a/sql/jdbc/tests/Tests/All b/sql/jdbc/tests/Tests/All --- a/sql/jdbc/tests/Tests/All +++ b/sql/jdbc/tests/Tests/All @@ -1,7 +1,6 @@ HAVE_JDBCTESTS?JDBC_API_Tester #HAVE_JDBCTESTS?Test_Csendthread # unfortunately has runtime-dependant output -HAVE_JDBCCLIENT_JAR?Test_JdbcClient -HAVE_JDBCCLIENT_JAR?bogus-auto-generated-keys #HAVE_JDBCTESTS?Test_PSlargeamount # scalabity test which is disabled by default (it takes a long time to run and does not need to be run everytime, only before a new release) # next test should be done AFTER all the other tests have completed +HAVE_JDBCCLIENT_JAR?Test_JdbcClient HAVE_JDBCCLIENT_JAR?ValidateSystemCatalogTables diff --git a/sql/jdbc/tests/Tests/bogus-auto-generated-keys.SQL.bat b/sql/jdbc/tests/Tests/bogus-auto-generated-keys.SQL.bat deleted file mode 100755 --- a/sql/jdbc/tests/Tests/bogus-auto-generated-keys.SQL.bat +++ /dev/null @@ -1,11 +0,0 @@ -@echo off - -echo user=monetdb> .monetdb -echo password=monetdb>> .monetdb - -prompt # $t $g -echo on - -call java org.monetdb.client.JdbcClient -h %HOST% -p %MAPIPORT% -d %TSTDB% -e -f "%TSTSRCBASE%\%TSTDIR%\Tests\bogus-auto-generated-keys.sql" - -@del .monetdb diff --git a/sql/jdbc/tests/Tests/bogus-auto-generated-keys.SQL.sh b/sql/jdbc/tests/Tests/bogus-auto-generated-keys.SQL.sh deleted file mode 100755 --- a/sql/jdbc/tests/Tests/bogus-auto-generated-keys.SQL.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -cat << EOF > .monetdb -user=monetdb -password=monetdb -EOF - -Mlog -x "java org.monetdb.client.JdbcClient -h $HOST -p $MAPIPORT -d ${TSTDB} -e -f \"$TSTSRCBASE/$TSTDIR/Tests/bogus-auto-generated-keys.sql\"" - -rm -f .monetdb diff --git a/sql/jdbc/tests/Tests/bogus-auto-generated-keys.sql b/sql/jdbc/tests/Tests/bogus-auto-generated-keys.sql deleted file mode 100644 --- a/sql/jdbc/tests/Tests/bogus-auto-generated-keys.sql +++ /dev/null @@ -1,21 +0,0 @@ -START TRANSACTION; --- generate a simple table with an auto-generated key (id) -CREATE TABLE gen_keys ( - "id" serial, - "x" varchar(12) -); - --- perform an update, useless, but illustrates the bug, this time no --- generated key is reported, which is correct -UPDATE gen_keys SET "x" = 'bla' WHERE "id" = 12; - --- insert some value, should get a generated key -INSERT INTO gen_keys ("x") VALUES ('boe'); - --- update again, we expect NO generated key, but we DO get one -UPDATE gen_keys SET "x" = 'bla' WHERE "id" = 1; -UPDATE gen_keys SET "x" = 'bla' WHERE "id" = 12; - --- ok, cleanup a bit -DROP TABLE gen_keys; -ROLLBACK; diff --git a/sql/jdbc/tests/Tests/bogus-auto-generated-keys.stable.err b/sql/jdbc/tests/Tests/bogus-auto-generated-keys.stable.err deleted file mode 100644 --- a/sql/jdbc/tests/Tests/bogus-auto-generated-keys.stable.err +++ /dev/null @@ -1,17 +0,0 @@ -stderr of test 'bogus-auto-generated-keys` in directory 'sql/jdbc/tests` itself: - - -# 19:33:44 > -# 19:33:44 > "./bogus-auto-generated-keys.SQL.sh" "bogus-auto-generated-keys" -# 19:33:44 > - - -# 19:33:44 > -# 19:33:44 > java nl.cwi.monetdb.client.JdbcClient -h monetdb-nuc2 -p 30491 -d mTests_sql_jdbc_tests -e -f "/home/dinther/dev/dev/MonetDB/sql/jdbc/tests/Tests/bogus-auto-generated-keys.sql" -# 19:33:44 > - - -# 19:33:44 > -# 19:33:44 > "Done." -# 19:33:44 > - diff --git a/sql/jdbc/tests/Tests/bogus-auto-generated-keys.stable.out b/sql/jdbc/tests/Tests/bogus-auto-generated-keys.stable.out deleted file mode 100644 --- a/sql/jdbc/tests/Tests/bogus-auto-generated-keys.stable.out +++ /dev/null @@ -1,46 +0,0 @@ -stdout of test 'bogus-auto-generated-keys` in directory 'sql/jdbc/tests` itself: - - -# 19:33:44 > -# 19:33:44 > "./bogus-auto-generated-keys.SQL.sh" "bogus-auto-generated-keys" -# 19:33:44 > - - -# 19:33:44 > -# 19:33:44 > java nl.cwi.monetdb.client.JdbcClient -h monetdb-nuc2 -p 30491 -d mTests_sql_jdbc_tests -e -f "/home/dinther/dev/dev/MonetDB/sql/jdbc/tests/Tests/bogus-auto-generated-keys.sql" -# 19:33:44 > - -START TRANSACTION; -Operation successful --- generate a simple table with an auto-generated key (id) -CREATE TABLE gen_keys ( - "id" serial, - "x" varchar(12) -); -Operation successful - --- perform an update, useless, but illustrates the bug, this time no --- generated key is reported, which is correct -UPDATE gen_keys SET "x" = 'bla' WHERE "id" = 12; -0 affected rows - --- insert some value, should get a generated key -INSERT INTO gen_keys ("x") VALUES ('boe'); -1 affected row, last generated key: 1 - --- update again, we expect NO generated key, but we DO get one -UPDATE gen_keys SET "x" = 'bla' WHERE "id" = 1; -1 affected row, last generated key: 1 -UPDATE gen_keys SET "x" = 'bla' WHERE "id" = 12; -0 affected rows, last generated key: 1 - --- ok, cleanup a bit -DROP TABLE gen_keys; -Operation successful -ROLLBACK; -Operation successful - -# 19:33:44 > -# 19:33:44 > "Done." -# 19:33:44 > - 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 @@ -1676,13 +1676,32 @@ rel_push_count_down(visitor *v, sql_rel return rel; } +static bool +check_projection_on_foreignside(sql_rel *r, list *pexps, int fk_left) +{ + /* projection columns from the foreign side */ + if (list_empty(pexps)) + return true; + for (node *n = pexps->h; n; n = n->next) { + sql_exp *pe = n->data; + + if (pe && is_atom(pe->type)) + continue; + if (pe && !is_alias(pe->type)) + return false; + /* check for columns from the pk side, then keep the join with the pk */ + if ((fk_left && rel_find_exp(r->r, pe)) || (!fk_left && rel_find_exp(r->l, pe))) + return false; + } + return true; +} + static sql_rel * -rel_simplify_project_fk_join(mvc *sql, sql_rel *r, list *pexps, int *changes) +rel_simplify_project_fk_join(mvc *sql, sql_rel *r, list *pexps, list *orderexps, int *changes) { sql_rel *rl = r->l; sql_rel *rr = r->r; sql_exp *je, *le, *nje, *re; - node *n; int fk_left = 1; /* check for foreign key join */ @@ -1713,22 +1732,11 @@ rel_simplify_project_fk_join(mvc *sql, s #endif /* primary side must be a full table */ if ((fk_left && (!is_left(r->op) && !is_full(r->op)) && !is_basetable(rr->op)) || - (!fk_left && (!is_right(r->op) && !is_full(r->op)) && !is_basetable(rl->op))) + (!fk_left && (!is_right(r->op) && !is_full(r->op)) && !is_basetable(rl->op))) return r; - /* projection columns from the foreign side */ - for (n = pexps->h; n; n = n->next) { - sql_exp *pe = n->data; - - if (pe && is_atom(pe->type)) - continue; - if (pe && !is_alias(pe->type)) - return r; - /* check for columns from the pk side, then keep the join with the pk */ - if ((fk_left && rel_find_exp(r->r, pe)) || - (!fk_left && rel_find_exp(r->l, pe))) - return r; - } + if (!check_projection_on_foreignside(r, pexps, fk_left) || !check_projection_on_foreignside(r, orderexps, fk_left)) + return r; /* rewrite, ie remove pkey side if possible */ le = (sql_exp*)je->l, re = (sql_exp*)je->l; @@ -1751,7 +1759,7 @@ rel_simplify_project_fk_join(mvc *sql, s } static sql_rel * -rel_simplify_count_fk_join(mvc *sql, sql_rel *r, list *gexps, int *changes) +rel_simplify_count_fk_join(mvc *sql, sql_rel *r, list *gexps, list *gcols, int *changes) { sql_rel *rl = r->l; sql_rel *rr = r->r; @@ -1779,18 +1787,21 @@ rel_simplify_count_fk_join(mvc *sql, sql /* primary side must be a full table */ if ((fk_left && (!is_left(r->op) && !is_full(r->op)) && !is_basetable(rr->op)) || - (!fk_left && (!is_right(r->op) && !is_full(r->op)) && !is_basetable(rl->op))) + (!fk_left && (!is_right(r->op) && !is_full(r->op)) && !is_basetable(rl->op))) return r; if (fk_left && is_join(rl->op) && !rel_is_ref(rl)) { - rl = rel_simplify_count_fk_join(sql, rl, gexps, changes); + rl = rel_simplify_count_fk_join(sql, rl, gexps, gcols, changes); r->l = rl; } if (!fk_left && is_join(rr->op) && !rel_is_ref(rr)) { - rr = rel_simplify_count_fk_join(sql, rr, gexps, changes); + rr = rel_simplify_count_fk_join(sql, rr, gexps, gcols, changes); r->r = rr; } + if (!check_projection_on_foreignside(r, gcols, fk_left)) + return r; + /* rewrite, ie remove pkey side if possible */ le = (sql_exp*)je->l, re = (sql_exp*)je->l; @@ -1813,7 +1824,7 @@ rel_simplify_count_fk_join(mvc *sql, sql /* * Handle (left/right/outer/natural) join fk-pk rewrites - * 1 group by ( fk-pk-join () ) [ count(*) ] -> groub py ( fk ) + * 1 group by ( fk-pk-join () ) [ count(*) ] -> group by ( fk ) * 2 project ( fk-pk-join () ) [ fk-column ] -> project (fk table)[ fk-column ] * 3 project ( fk1-pk1-join( fk2-pk2-join()) [ fk-column, pk1 column ] -> project (fk1-pk1-join)[ fk-column, pk1 column ] */ @@ -1822,13 +1833,13 @@ rel_simplify_fk_joins(visitor *v, sql_re { sql_rel *r = NULL; - if (rel->op == op_project) + if (is_simple_project(rel->op)) r = rel->l; - while (rel->op == op_project && r && r->exps && list_length(r->exps) == 1 && is_join(r->op) && !(rel_is_ref(r))) { + while (is_simple_project(rel->op) && r && list_length(r->exps) == 1 && is_join(r->op) && !(rel_is_ref(r))) { sql_rel *or = r; - r = rel_simplify_project_fk_join(v->sql, r, rel->exps, &v->changes); + r = rel_simplify_project_fk_join(v->sql, r, rel->exps, rel->r, &v->changes); if (r == or) return rel; rel->l = r; @@ -1838,16 +1849,15 @@ rel_simplify_fk_joins(visitor *v, sql_re return rel; r = rel->l; - while(r && r->op == op_project) + while(r && is_simple_project(r->op)) r = r->l; - while (is_groupby(rel->op) && !rel_is_ref(rel) && - r && r->exps && is_join(r->op) && list_length(r->exps) == 1 && !(rel_is_ref(r)) && - /* currently only single count aggregation is handled, no other projects or aggregation */ - list_length(rel->exps) == 1 && exp_aggr_is_count(rel->exps->h->data)) { + while (is_groupby(rel->op) && !rel_is_ref(rel) && r && is_join(r->op) && list_length(r->exps) == 1 && !(rel_is_ref(r)) && + /* currently only single count aggregation is handled, no other projects or aggregation */ + list_length(rel->exps) == 1 && exp_aggr_is_count(rel->exps->h->data)) { sql_rel *or = r; - r = rel_simplify_count_fk_join(v->sql, r, rel->exps, &v->changes); + r = rel_simplify_count_fk_join(v->sql, r, rel->exps, rel->r, &v->changes); if (r == or) return rel; rel->l = r; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list