Changeset: 6e51eb880463 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=6e51eb880463
Added Files:
        sql/test/BugTracker-2014/Tests/number_4_4.Bug-3543.sql
        sql/test/BugTracker-2014/Tests/number_4_4.Bug-3543.stable.err
        sql/test/BugTracker-2014/Tests/number_4_4.Bug-3543.stable.out
        sql/test/BugTracker-2014/Tests/round.Bug-3542.sql
        sql/test/BugTracker-2014/Tests/round.Bug-3542.stable.err
        sql/test/BugTracker-2014/Tests/round.Bug-3542.stable.out
Modified Files:
        MonetDB.spec
        debian/control
        sql/backends/monet5/sql_gencode.c
        sql/backends/monet5/sql_round_impl.h
        sql/server/rel_optimizer.c
        sql/server/sql_decimal.c
        sql/test/BugTracker-2014/Tests/All
Branch: Oct2014
Log Message:

merge


Unterschiede (gekürzt von 445 auf 300 Zeilen):

diff --git a/MonetDB.spec b/MonetDB.spec
--- a/MonetDB.spec
+++ b/MonetDB.spec
@@ -98,7 +98,6 @@ BuildRequires: bzip2-devel
 %if %{?with_fits:1}%{!?with_fits:0}
 BuildRequires: cfitsio-devel
 %endif
-BuildRequires: flex
 %if %{?with_geos:1}%{!?with_geos:0}
 BuildRequires: geos-devel >= 3.0.0
 %endif
diff --git a/debian/control b/debian/control
--- a/debian/control
+++ b/debian/control
@@ -7,7 +7,7 @@ Vcs-Browser: http://dev.monetdb.org/hg/M
 Vcs-Hg: http://dev.monetdb.org/hg/MonetDB/
 # for Build-Depends and Depends syntax, see
 # http://www.debian.org/doc/debian-policy/ch-relationships.html
-Build-Depends: debhelper (>= 5), autotools-dev, bison, flex, libbz2-dev,
+Build-Depends: debhelper (>= 5), autotools-dev, bison, libbz2-dev,
  libcurl4-gnutls-dev, libgeos-dev (>= 3.0.0), libgsl0-dev, libpcre3-dev,
  libreadline-gplv2-dev | libreadline-dev, libssl-dev, libxml2-dev, perl,
  ruby, rubygems | libyaml-0-2, unixodbc-dev, uuid-dev, zlib1g-dev,
diff --git a/sql/backends/monet5/sql_gencode.c 
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -1869,8 +1869,6 @@ static int
                                return -1;
                        mod = sql_func_mod(f->func);
                        fimp = sql_func_imp(f->func);
-                       if (s->op1 && list_length(s->op1->op4.lval) != 3 && 
strcmp(f->func->base.name, "ifthenelse") == 0)
-                               assert(0);
                        if (s->nrcols) {
                                sql_subtype *res = f->res->h->data;
                                fimp = convertMultiplexFcn(fimp);
diff --git a/sql/backends/monet5/sql_round_impl.h 
b/sql/backends/monet5/sql_round_impl.h
--- a/sql/backends/monet5/sql_round_impl.h
+++ b/sql/backends/monet5/sql_round_impl.h
@@ -302,6 +302,8 @@ str_2dec(TYPE *res, str *val, int *d, in
                } else {
                        scale = 0;
                }
+       } else { /* we have a dot in the string */
+               digits--;
        }
 
        value = decimal_from_str(s);
@@ -309,20 +311,27 @@ str_2dec(TYPE *res, str *val, int *d, in
                digits--;
        if (scale < *sc) {
                /* the current scale is too small, increase it by adding 0's */
-               int d = *sc - scale;    /* CANNOT be 0! */
+               int dff = *sc - scale;  /* CANNOT be 0! */
 
-               value *= scales[d];
-               scale += d;
-               digits += d;
+               value *= scales[dff];
+               scale += dff;
+               digits += dff;
        } else if (scale > *sc) {
                /* the current scale is too big, decrease it by correctly 
rounding */
-               int d = scale - *sc;    /* CANNOT be 0 */
-               lng rnd = scales[d] >> 1;
+               /* we should round properly, and check for overflow (res >= 
10^digits+scale) */
+               int dff = scale - *sc;  /* CANNOT be 0 */
+               lng rnd = scales[dff] >> 1;
 
-               value += rnd;
-               value /= scales[d];
-               scale -= d;
-               digits -= d;
+               if (value > 0)
+                       value += rnd;
+               else
+                       value -= rnd;
+               value /= scales[dff];
+               scale -= dff;
+               digits -= dff;
+               if (value >= scales[*d] || value <= -scales[*d]) {
+                       throw(SQL, STRING(TYPE), "rounding of decimal (%s) 
doesn't fit format (%d.%d)", *val, *d, *sc);
+               }
        }
        if (digits > *d) {
                throw(SQL, STRING(TYPE), "decimal (%s) doesn't have format 
(%d.%d)", *val, *d, *sc);
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
@@ -204,7 +204,8 @@ list_find_exp( list *exps, sql_exp *e)
 {
        sql_exp *ne = NULL;
 
-       assert(e->type == e_column);
+       if (e->type != e_column)
+               return NULL;
        if ((e->l && (ne=exps_bind_column2(exps, e->l, e->r)) != NULL) ||
            ((ne=exps_bind_column(exps, e->r, NULL)) != NULL))
                return ne;
@@ -1733,6 +1734,7 @@ rel_push_topn_down(int *changes, mvc *sq
                        sql_rel *u = rp, *ou = u, *x;
                        sql_rel *ul = u->l;
                        sql_rel *ur = u->r;
+                       int add_r = 0;
 
                        /* only push topn once */
                        x = ul;
@@ -1746,6 +1748,8 @@ rel_push_topn_down(int *changes, mvc *sq
                        if (x && x->op == op_topn)
                                return rel;
 
+                       if (list_length(ul->exps) > list_length(r->exps))
+                               add_r = 1;
                        ul = rel_dup(ul);
                        ur = rel_dup(ur);
                        if (!is_project(ul->op)) 
@@ -1760,14 +1764,23 @@ rel_push_topn_down(int *changes, mvc *sq
                        /* introduce projects under the set */
                        ul = rel_project(sql->sa, ul, NULL);
                        ul->exps = exps_copy(sql->sa, r->exps);
+                       /* possibly add order by column */
+                       if (add_r)
+                               ul->exps = list_merge(ul->exps, 
exps_copy(sql->sa, r->r), NULL);
                        ul->r = exps_copy(sql->sa, r->r);
                        ul = rel_topn(sql->sa, ul, sum_limit_offset(sql, 
rel->exps));
                        ur = rel_project(sql->sa, ur, NULL);
                        ur->exps = exps_copy(sql->sa, r->exps);
+                       /* possibly add order by column */
+                       if (add_r)
+                               ur->exps = list_merge(ur->exps, 
exps_copy(sql->sa, r->r), NULL);
                        ur->r = exps_copy(sql->sa, r->r);
                        ur = rel_topn(sql->sa, ur, sum_limit_offset(sql, 
rel->exps));
                        u = rel_setop(sql->sa, ul, ur, op_union);
                        u->exps = exps_copy(sql->sa, r->exps); 
+                       /* possibly add order by column */
+                       if (add_r)
+                               u->exps = list_merge(u->exps, 
exps_copy(sql->sa, r->r), NULL);
                        /* zap names */
                        rel_no_rename_exps(u->exps);
                        rel_destroy(ou);
diff --git a/sql/server/sql_decimal.c b/sql/server/sql_decimal.c
--- a/sql/server/sql_decimal.c
+++ b/sql/server/sql_decimal.c
@@ -31,6 +31,10 @@ decimal_from_str(char *dec)
                neg = 1;
                dec++;
        }
+       if (*dec == '+') {
+               neg = 0;
+               dec++;
+       }
        for (; *dec; dec++) {
                if (*dec != '.') {
                        res *= 10;
diff --git a/sql/test/BugTracker-2014/Tests/All 
b/sql/test/BugTracker-2014/Tests/All
--- a/sql/test/BugTracker-2014/Tests/All
+++ b/sql/test/BugTracker-2014/Tests/All
@@ -32,4 +32,6 @@ non_groupby_column.Bug-3524
 orderby_count.Bug-3526
 outer_join_using_diff_types_using.Bug-3536
 select-distinct-order-limit.Bug-3527
+round.Bug-3542
+number_4_4.Bug-3543
 ifthenelse.Bug-3546
diff --git a/sql/test/BugTracker-2014/Tests/number_4_4.Bug-3543.sql 
b/sql/test/BugTracker-2014/Tests/number_4_4.Bug-3543.sql
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2014/Tests/number_4_4.Bug-3543.sql
@@ -0,0 +1,29 @@
+CREATE TABLE fract_only (id int, val numeric(4,4));
+--Note that the precision is equal to the scale, so the allowed number of 
significant digits before the decimal dot should not exceed 0 (4 - 4 = 0).
+
+--the following SQL are NOT accepted but should be accepted:
+INSERT INTO fract_only VALUES (1, '-0.9999');
+INSERT INTO fract_only VALUES (2, '+0.9999');
+
+--the following SQL are accepted but incorrect data is stored:
+INSERT INTO fract_only VALUES (3, '+.9999');
+SELECT * FROM fract_only;
+-- returns value 2.5535 !!
+
+--the following SQL are accepted but should error:
+INSERT INTO fract_only VALUES (4, '0.99995');  -- should fail but is invalidly 
accepted
+INSERT INTO fract_only VALUES (5, '0.99999');  -- should fail but is invalidly 
accepted
+SELECT * FROM fract_only;
+-- both show 1.0000 which out of the allowed value range of numeric(4,4)
+
+INSERT INTO fract_only VALUES (6, '+0.99995'); -- correctly fails
+INSERT INTO fract_only VALUES (6, '+.99995');  -- should fail but is invalidly 
accepted
+SELECT * FROM fract_only;
+-- returns value 2.5536 for id 6 !!
+
+INSERT INTO fract_only VALUES (7, '-0.99995'); -- correctly fails
+INSERT INTO fract_only VALUES (7, '-.999998');  -- should fail but is 
invalidly accepted
+SELECT * FROM fract_only;
+-- returns value -0.9999 for id 7 !!
+
+drop table fract_only;
diff --git a/sql/test/BugTracker-2014/Tests/number_4_4.Bug-3543.stable.err 
b/sql/test/BugTracker-2014/Tests/number_4_4.Bug-3543.stable.err
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2014/Tests/number_4_4.Bug-3543.stable.err
@@ -0,0 +1,55 @@
+stderr of test 'number_4_4.Bug-3543` in directory 'sql/test/BugTracker-2014` 
itself:
+
+
+# 14:07:37 >  
+# 14:07:37 >  "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" 
"mapi_open=true" "--set" "mapi_port=38282" "--set" 
"mapi_usock=/var/tmp/mtest-23224/.s.monetdb.38282" "--set" "monet_prompt=" 
"--forcemito" "--set" "mal_listing=2" 
"--dbpath=/home/niels/scratch/rc-monetdb/Linux-x86_64/var/MonetDB/mTests_sql_test_BugTracker-2014"
 "--set" "mal_listing=0" "--set" "embedded_r=yes"
+# 14:07:37 >  
+
+# builtin opt  gdk_dbpath = 
/home/niels/scratch/rc-monetdb/Linux-x86_64/var/monetdb5/dbfarm/demo
+# builtin opt  gdk_debug = 0
+# builtin opt  gdk_vmtrim = no
+# builtin opt  monet_prompt = >
+# builtin opt  monet_daemon = no
+# builtin opt  mapi_port = 50000
+# builtin opt  mapi_open = false
+# builtin opt  mapi_autosense = false
+# builtin opt  sql_optimizer = default_pipe
+# builtin opt  sql_debug = 0
+# cmdline opt  gdk_nr_threads = 0
+# cmdline opt  mapi_open = true
+# cmdline opt  mapi_port = 38282
+# cmdline opt  mapi_usock = /var/tmp/mtest-23224/.s.monetdb.38282
+# cmdline opt  monet_prompt = 
+# cmdline opt  mal_listing = 2
+# cmdline opt  gdk_dbpath = 
/home/niels/scratch/rc-monetdb/Linux-x86_64/var/MonetDB/mTests_sql_test_BugTracker-2014
+# cmdline opt  mal_listing = 0
+# cmdline opt  embedded_r = yes
+# cmdline opt  gdk_debug = 536870922
+
+# 14:07:38 >  
+# 14:07:38 >  "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-23224" "--port=38282"
+# 14:07:38 >  
+
+MAPI  = (monetdb) /var/tmp/mtest-23224/.s.monetdb.38282
+QUERY = INSERT INTO fract_only VALUES (4, '0.99995');  -- should fail but is 
invalidly accepted
+ERROR = !rounding of decimal (0.99995) doesn't fit format (4.4)
+MAPI  = (monetdb) /var/tmp/mtest-23224/.s.monetdb.38282
+QUERY = INSERT INTO fract_only VALUES (5, '0.99999');  -- should fail but is 
invalidly accepted
+ERROR = !rounding of decimal (0.99999) doesn't fit format (4.4)
+MAPI  = (monetdb) /var/tmp/mtest-23224/.s.monetdb.38282
+QUERY = INSERT INTO fract_only VALUES (6, '+0.99995'); -- correctly fails
+ERROR = !rounding of decimal (+0.99995) doesn't fit format (4.4)
+MAPI  = (monetdb) /var/tmp/mtest-23224/.s.monetdb.38282
+QUERY = INSERT INTO fract_only VALUES (6, '+.99995');  -- should fail but is 
invalidly accepted
+ERROR = !rounding of decimal (+.99995) doesn't fit format (4.4)
+MAPI  = (monetdb) /var/tmp/mtest-23224/.s.monetdb.38282
+QUERY = INSERT INTO fract_only VALUES (7, '-0.99995'); -- correctly fails
+ERROR = !rounding of decimal (-0.99995) doesn't fit format (4.4)
+MAPI  = (monetdb) /var/tmp/mtest-23224/.s.monetdb.38282
+QUERY = INSERT INTO fract_only VALUES (7, '-.999998');  -- should fail but is 
invalidly accepted
+ERROR = !rounding of decimal (-.999998) doesn't fit format (4.4)
+
+# 14:07:38 >  
+# 14:07:38 >  "Done."
+# 14:07:38 >  
+
diff --git a/sql/test/BugTracker-2014/Tests/number_4_4.Bug-3543.stable.out 
b/sql/test/BugTracker-2014/Tests/number_4_4.Bug-3543.stable.out
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2014/Tests/number_4_4.Bug-3543.stable.out
@@ -0,0 +1,72 @@
+stdout of test 'number_4_4.Bug-3543` in directory 'sql/test/BugTracker-2014` 
itself:
+
+
+# 14:07:37 >  
+# 14:07:37 >  "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set" 
"mapi_open=true" "--set" "mapi_port=38282" "--set" 
"mapi_usock=/var/tmp/mtest-23224/.s.monetdb.38282" "--set" "monet_prompt=" 
"--forcemito" "--set" "mal_listing=2" 
"--dbpath=/home/niels/scratch/rc-monetdb/Linux-x86_64/var/MonetDB/mTests_sql_test_BugTracker-2014"
 "--set" "mal_listing=0" "--set" "embedded_r=yes"
+# 14:07:37 >  
+
+# MonetDB 5 server v11.19.0
+# This is an unreleased version
+# Serving database 'mTests_sql_test_BugTracker-2014', using 4 threads
+# Compiled for x86_64-unknown-linux-gnu/64bit with 64bit OIDs dynamically 
linked
+# Found 7.334 GiB available main-memory.
+# Copyright (c) 1993-July 2008 CWI.
+# Copyright (c) August 2008-2014 MonetDB B.V., all rights reserved
+# Visit http://www.monetdb.org/ for further information
+# Listening for connection requests on mapi:monetdb://localhost.nes.nl:38282/
+# Listening for UNIX domain connection requests on 
mapi:monetdb:///var/tmp/mtest-23224/.s.monetdb.38282
+# MonetDB/GIS module loaded
+# MonetDB/SQL module loaded
+# MonetDB/R   module loaded
+
+Ready.
+
+# 14:07:38 >  
+# 14:07:38 >  "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e" 
"--host=/var/tmp/mtest-23224" "--port=38282"
+# 14:07:38 >  
+
+#CREATE TABLE fract_only (id int, val numeric(4,4));
+#INSERT INTO fract_only VALUES (1, '-0.9999');
+[ 1    ]
+#INSERT INTO fract_only VALUES (2, '+0.9999');
+[ 1    ]
+#INSERT INTO fract_only VALUES (3, '+.9999');
+[ 1    ]
+#SELECT * FROM fract_only;
+% sys.fract_only,      sys.fract_only # table_name
+% id,  val # name
+% int, decimal # type
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to