Changeset: ab82fe1e7222 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/ab82fe1e7222
Branch: odbc_loader
Log Message:
merge with default
diffs (truncated from 1296 to 300 lines):
diff --git a/ctest/tools/monetdbe/Tests/example_proxy.SQL.py
b/ctest/tools/monetdbe/Tests/example_proxy.SQL.py
--- a/ctest/tools/monetdbe/Tests/example_proxy.SQL.py
+++ b/ctest/tools/monetdbe/Tests/example_proxy.SQL.py
@@ -1,4 +1,5 @@
-import os, pymonetdb
+from MonetDBtesting import tpymonetdb as pymonetdb
+import os
import subprocess
db = os.getenv("TSTDB")
diff --git a/sql/server/rel_optimize_proj.c b/sql/server/rel_optimize_proj.c
--- a/sql/server/rel_optimize_proj.c
+++ b/sql/server/rel_optimize_proj.c
@@ -2504,9 +2504,91 @@ rel_distinct_aggregate_on_unique_values(
static inline sql_rel *
rel_remove_const_aggr(visitor *v, sql_rel *rel)
{
- if (!rel)
+ if(!rel) {
+ return rel;
+ }
+
+ list *exps = rel->exps;
+
+ if(rel->op != op_groupby || list_empty(exps)) {
return rel;
- if (rel && is_groupby(rel->op) && list_length(rel->exps) >= 1 &&
!rel_is_ref(rel)) {
+ }
+
+ if(!list_empty(rel->r)) {
+ /* in the general case in an expression of an aggregate over
+ * a constant can be rewritten as just the const e.g.
+ * aggr(const) -> const
+ */
+
+ for(node *n = exps->h; n; n = n->next) {
+ sql_exp *e = n->data;
+
+ if(e->type != e_aggr) {
+ continue;
+ }
+
+ sql_func *j = ((sql_subfunc *)e->f)->func;
+
+ /* some aggregates with const values can only be
eliminated
+ * under certain circumstances e.g.
+ * sum(NULL) -> NULL, sum(0) -> 0
+ * prod(NULL) -> NULL, prod(1) -> 1
+ * count(NULL) -> 0
+ */
+ int sum = strcmp(j->base.name, "sum") == 0,
+ prd = strcmp(j->base.name, "prod") == 0,
+ cnt = strcmp(j->base.name, "count") == 0;
+
+ if(!j->s && j->system == 1) {
+ list *se = e->l;
+
+ if(se == NULL) {
+ continue;
+ }
+
+ for(node *m = se->h; m; m = m->next) {
+ sql_exp *w = m->data;
+
+ if(w->type == e_atom && w->card ==
CARD_ATOM) {
+ atom *wa = w->l;
+
+ if(sum && !(wa->isnull ||
atom_is_zero(wa))) {
+ continue;
+ }
+
+ if(prd && !(wa->isnull ||
atom_is_one(wa))) {
+ continue;
+ }
+
+ if(cnt) {
+ if(wa->isnull) {
+
list_remove_node(se, NULL, m);
+
+
w=exp_atom_lng(v->sql->sa, 0);
+ list_append(se,
w);
+ }
+ else {
+ continue;
+ }
+ }
+
+
exp_setalias(w,e->alias.label,e->alias.rname,e->alias.name);
+
+ n->data = w;
+ v->changes++;
+ }
+ }
+ }
+ }
+ }
+
+ /*
+ * Below code replaces GROUP BY with PROJECT in some cases;
+ * Triggers on...
+ * select 1 having true; select 42 from foo group by x; select n from
foo group by rollup(n);
+ */
+
+ if (!rel_is_ref(rel)) {
int needed = 0;
for (node *n = rel->exps->h; n; n = n->next) {
sql_exp *exp = (sql_exp*) n->data;
@@ -2524,6 +2606,7 @@ rel_remove_const_aggr(visitor *v, sql_re
if (exp_is_atom(exp))
atoms++;
}
+ /* possible edge case, never triggers in
coverage tests */
if (atoms == list_length(rel->r)) {
list *nexps = sa_list(v->sql->sa);
for (node *n = rel->exps->h; n; ) {
@@ -2588,6 +2671,7 @@ rel_remove_const_aggr(visitor *v, sql_re
return nrel;
}
}
+
return rel;
}
@@ -3035,6 +3119,7 @@ rel_optimize_projections_(visitor *v, sq
return rel;
rel = rel_remove_const_aggr(v, rel);
+
if (v->value_based_opt) {
rel = rel_simplify_sum(v, rel);
rel = rel_simplify_groupby_columns(v, rel);
@@ -3046,6 +3131,7 @@ rel_optimize_projections_(visitor *v, sq
rel = rel_distinct_aggregate_on_unique_values(v, rel);
rel = rel_groupby_distinct(v, rel);
rel = rel_push_count_down(v, rel);
+
/* only when value_based_opt is on, ie not for dependency resolution */
if (v->value_based_opt) {
rel = rel_simplify_count(v, rel);
diff --git a/sql/server/sql_atom.c b/sql/server/sql_atom.c
--- a/sql/server/sql_atom.c
+++ b/sql/server/sql_atom.c
@@ -1080,6 +1080,33 @@ atom_is_zero(atom *a)
}
int
+atom_is_one(atom *a)
+{
+ if (a->isnull || !ATOMlinear(a->tpe.type->localtype))
+ return 0;
+ switch (ATOMstorage(a->tpe.type->localtype)) {
+ case TYPE_bte:
+ return a->data.val.btval == 1;
+ case TYPE_sht:
+ return a->data.val.shval == 1;
+ case TYPE_int:
+ return a->data.val.ival == 1;
+ case TYPE_lng:
+ return a->data.val.lval == 1;
+#ifdef HAVE_HGE
+ case TYPE_hge:
+ return a->data.val.hval == 1;
+#endif
+ case TYPE_flt:
+ return a->data.val.fval == 1;
+ case TYPE_dbl:
+ return a->data.val.dval == 1;
+ default:
+ return 0;
+ }
+}
+
+int
atom_is_true(atom *a)
{
if (a->isnull)
diff --git a/sql/server/sql_atom.h b/sql/server/sql_atom.h
--- a/sql/server/sql_atom.h
+++ b/sql/server/sql_atom.h
@@ -65,6 +65,7 @@ extern atom *atom_inc(allocator *sa, ato
extern int atom_is_true(atom *a);
extern int atom_is_false(atom *a);
extern int atom_is_zero(atom *a);
+extern int atom_is_one(atom *a);
extern unsigned int atom_digits(atom *a);
diff --git a/sql/test/BugTracker-2009/Tests/bit_and.SF-2850341.py
b/sql/test/BugTracker-2009/Tests/bit_and.SF-2850341.py
--- a/sql/test/BugTracker-2009/Tests/bit_and.SF-2850341.py
+++ b/sql/test/BugTracker-2009/Tests/bit_and.SF-2850341.py
@@ -1,4 +1,5 @@
-import sys, os, pymonetdb
+from MonetDBtesting import tpymonetdb as pymonetdb
+import sys, os
db = os.getenv("TSTDB")
port = int(os.getenv("MAPIPORT"))
diff --git
a/sql/test/BugTracker-2011/Tests/interrupted-initialization.Bug-2875.SQL.py
b/sql/test/BugTracker-2011/Tests/interrupted-initialization.Bug-2875.SQL.py
--- a/sql/test/BugTracker-2011/Tests/interrupted-initialization.Bug-2875.SQL.py
+++ b/sql/test/BugTracker-2011/Tests/interrupted-initialization.Bug-2875.SQL.py
@@ -1,4 +1,5 @@
-import os, sys, tempfile, pymonetdb
+from MonetDBtesting import tpymonetdb as pymonetdb
+import os, sys, tempfile
try:
from MonetDBtesting import process
except ImportError:
diff --git a/sql/test/BugTracker-2011/Tests/many-connects-cache.Bug-2904.SQL.py
b/sql/test/BugTracker-2011/Tests/many-connects-cache.Bug-2904.SQL.py
--- a/sql/test/BugTracker-2011/Tests/many-connects-cache.Bug-2904.SQL.py
+++ b/sql/test/BugTracker-2011/Tests/many-connects-cache.Bug-2904.SQL.py
@@ -1,4 +1,5 @@
-import sys, os, pymonetdb, threading
+from MonetDBtesting import tpymonetdb as pymonetdb
+import sys, os, threading
db = os.getenv("TSTDB")
port = int(os.getenv("MAPIPORT"))
diff --git a/sql/test/BugTracker-2011/Tests/python-connections-Bug.2901.SQL.py
b/sql/test/BugTracker-2011/Tests/python-connections-Bug.2901.SQL.py
--- a/sql/test/BugTracker-2011/Tests/python-connections-Bug.2901.SQL.py
+++ b/sql/test/BugTracker-2011/Tests/python-connections-Bug.2901.SQL.py
@@ -1,4 +1,4 @@
-import pymonetdb
+from MonetDBtesting import tpymonetdb as pymonetdb
import os
c = pymonetdb.connect(port=int(os.getenv('MAPIPORT')),
diff --git
a/sql/test/BugTracker-2011/Tests/user_create_temp_table.Bug-2916.SQL.py
b/sql/test/BugTracker-2011/Tests/user_create_temp_table.Bug-2916.SQL.py
--- a/sql/test/BugTracker-2011/Tests/user_create_temp_table.Bug-2916.SQL.py
+++ b/sql/test/BugTracker-2011/Tests/user_create_temp_table.Bug-2916.SQL.py
@@ -1,4 +1,5 @@
-import sys, os, pymonetdb
+from MonetDBtesting import tpymonetdb as pymonetdb
+import sys, os
db = os.getenv("TSTDB")
port = int(os.getenv("MAPIPORT"))
diff --git
a/sql/test/BugTracker-2012/Tests/day-of-month-localization.Bug-2962.SQL.py
b/sql/test/BugTracker-2012/Tests/day-of-month-localization.Bug-2962.SQL.py
--- a/sql/test/BugTracker-2012/Tests/day-of-month-localization.Bug-2962.SQL.py
+++ b/sql/test/BugTracker-2012/Tests/day-of-month-localization.Bug-2962.SQL.py
@@ -1,4 +1,5 @@
-import time, sys, os, pymonetdb
+from MonetDBtesting import tpymonetdb as pymonetdb
+import time, sys, os
client1 = pymonetdb.connect(database=os.getenv("TSTDB"),
port=int(os.getenv("MAPIPORT")))
cur1 = client1.cursor()
diff --git
a/sql/test/BugTracker-2012/Tests/large-number-operation-strange-results.Bug-2929.py
b/sql/test/BugTracker-2012/Tests/large-number-operation-strange-results.Bug-2929.py
---
a/sql/test/BugTracker-2012/Tests/large-number-operation-strange-results.Bug-2929.py
+++
b/sql/test/BugTracker-2012/Tests/large-number-operation-strange-results.Bug-2929.py
@@ -1,4 +1,5 @@
-import sys, os, pymonetdb
+from MonetDBtesting import tpymonetdb as pymonetdb
+import sys, os
from decimal import *
db = os.getenv("TSTDB")
diff --git
a/sql/test/BugTracker-2012/Tests/table_functions_fail_after_restart.Bug-3063.py
b/sql/test/BugTracker-2012/Tests/table_functions_fail_after_restart.Bug-3063.py
---
a/sql/test/BugTracker-2012/Tests/table_functions_fail_after_restart.Bug-3063.py
+++
b/sql/test/BugTracker-2012/Tests/table_functions_fail_after_restart.Bug-3063.py
@@ -1,4 +1,5 @@
-import os, sys, tempfile, pymonetdb
+from MonetDBtesting import tpymonetdb as pymonetdb
+import os, sys, tempfile
try:
from MonetDBtesting import process
diff --git a/sql/test/BugTracker-2013/Tests/binary_copy_into.Bug-3345.SQL.py
b/sql/test/BugTracker-2013/Tests/binary_copy_into.Bug-3345.SQL.py
--- a/sql/test/BugTracker-2013/Tests/binary_copy_into.Bug-3345.SQL.py
+++ b/sql/test/BugTracker-2013/Tests/binary_copy_into.Bug-3345.SQL.py
@@ -1,4 +1,5 @@
-import os, sys, shutil, pymonetdb
+from MonetDBtesting import tpymonetdb as pymonetdb
+import os, sys, shutil
src = os.environ['RELSRCDIR']
dst = os.environ['TSTTRGDIR']
diff --git
a/sql/test/BugTracker-2013/Tests/corrupt-after-restart.Bug-3282.SQL.py
b/sql/test/BugTracker-2013/Tests/corrupt-after-restart.Bug-3282.SQL.py
--- a/sql/test/BugTracker-2013/Tests/corrupt-after-restart.Bug-3282.SQL.py
+++ b/sql/test/BugTracker-2013/Tests/corrupt-after-restart.Bug-3282.SQL.py
@@ -1,4 +1,5 @@
-import os, sys, tempfile, pymonetdb
+from MonetDBtesting import tpymonetdb as pymonetdb
+import os, sys, tempfile
try:
from MonetDBtesting import process
except ImportError:
diff --git a/sql/test/BugTracker-2013/Tests/empty-strings.Bug-3261.SQL.py
b/sql/test/BugTracker-2013/Tests/empty-strings.Bug-3261.SQL.py
--- a/sql/test/BugTracker-2013/Tests/empty-strings.Bug-3261.SQL.py
+++ b/sql/test/BugTracker-2013/Tests/empty-strings.Bug-3261.SQL.py
@@ -1,4 +1,5 @@
-import pymonetdb, sys, os
+from MonetDBtesting import tpymonetdb as pymonetdb
+import sys, os
port = int(os.environ['MAPIPORT'])
db = os.environ['TSTDB']
diff --git a/sql/test/BugTracker-2014/Tests/acidity-fail.Bug-3635.py
b/sql/test/BugTracker-2014/Tests/acidity-fail.Bug-3635.py
--- a/sql/test/BugTracker-2014/Tests/acidity-fail.Bug-3635.py
+++ b/sql/test/BugTracker-2014/Tests/acidity-fail.Bug-3635.py
@@ -3,7 +3,8 @@ try:
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]