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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list