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

Reply via email to