Changeset: 9875e705f062 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=9875e705f062
Added Files:
sql/test/BugTracker-2014/Tests/integer-cast.Bug-3424.sql
sql/test/BugTracker-2014/Tests/integer-cast.Bug-3424.stable.err
sql/test/BugTracker-2014/Tests/integer-cast.Bug-3424.stable.out
sql/test/BugTracker-2014/Tests/python-microseconds.Bug-3439.SQL.py
sql/test/BugTracker-2014/Tests/python-microseconds.Bug-3439.stable.err
sql/test/BugTracker-2014/Tests/python-microseconds.Bug-3439.stable.out
Modified Files:
clients/python2/monetdb/sql/pythonize.py
clients/python3/monetdb/sql/pythonize.py
gdk/gdk_calc.c
sql/test/ADT2006/bram.sql
sql/test/BugTracker-2014/Tests/All
Branch: default
Log Message:
Merge with Jan2014 branch.
diffs (truncated from 468 to 300 lines):
diff --git a/clients/python2/monetdb/sql/pythonize.py
b/clients/python2/monetdb/sql/pythonize.py
--- a/clients/python2/monetdb/sql/pythonize.py
+++ b/clients/python2/monetdb/sql/pythonize.py
@@ -40,6 +40,22 @@ def _extract_timezone(data):
return dt, tzhour, tzmin
+def _extract_time(data, tzhour = 0, tzmin = 0):
+ time = data.split(':')
+ hour = int(time[0]) + tzhour
+ minute = int(time[1]) + tzmin
+ second = time[2]
+ if '.' in second:
+ second, microsecond = second.split('.')
+ while len(microsecond) < 6:
+ microsecond += '0'
+ while len(microsecond) > 6:
+ microsecond = microsecond[:-1]
+ microsecond = int(microsecond)
+ else:
+ microsecond = 0
+ second = int(second)
+ return hour, minute, second, microsecond
def strip(data):
""" returns a python string, with chopped off quotes,
@@ -55,29 +71,28 @@ def py_bool(data):
def py_time(data):
""" returns a python Time
"""
- return Time(*[int(float(x)) for x in data.split(':')])
+ return Time(*_extract_time(data))
def py_timetz(data):
""" returns a python Time where data contains a tz code
"""
dt, tzhour, tzmin = _extract_timezone(data)
- hour, minute, second = [int(float(x)) for x in dt.split(':')]
- return Time(hour + tzhour, minute + tzmin, second)
+ return Time(*_extract_time(dt, tzhour, tzmin))
def py_date(data):
""" Returns a python Date
"""
- return Date(*[int(float(x)) for x in data.split('-')])
+ return Date(*[int(x) for x in data.split('-')])
def py_timestamp(data):
""" Returns a python Timestamp
"""
- splitted = data.split(" ")
- date = [int(float(x)) for x in splitted[0].split('-')]
- time = [int(float(x)) for x in splitted[1].split(':')]
+ (datestr, timestr) = data.split(" ")
+ date = [int(x) for x in datestr.split('-')]
+ time = list(_extract_time(timestr))
return Timestamp(*(date + time))
@@ -86,11 +101,9 @@ def py_timestamptz(data):
"""
dt, tzhour, tzmin = _extract_timezone(data)
(datestr, timestr) = dt.split(" ")
- date = [int(float(x)) for x in datestr.split('-')]
- time = [int(float(x)) for x in timestr.split(':')]
- year, month, day = date
- hour, minute, second = time
- return Timestamp(year, month, day, hour + tzhour, minute + tzmin, second)
+ date = [int(x) for x in datestr.split('-')]
+ time = list(_extract_time(timestr, tzhour, tzmin))
+ return Timestamp(*(date + time))
mapping = {
diff --git a/clients/python3/monetdb/sql/pythonize.py
b/clients/python3/monetdb/sql/pythonize.py
--- a/clients/python3/monetdb/sql/pythonize.py
+++ b/clients/python3/monetdb/sql/pythonize.py
@@ -41,6 +41,22 @@ def _extract_timezone(data):
return dt, tzhour, tzmin
+def _extract_time(data, tzhour = 0, tzmin = 0):
+ time = data.split(':')
+ hour = int(time[0]) + tzhour
+ minute = int(time[1]) + tzmin
+ second = time[2]
+ if '.' in second:
+ second, microsecond = second.split('.')
+ while len(microsecond) < 6:
+ microsecond += '0'
+ while len(microsecond) > 6:
+ microsecond = microsecond[:-1]
+ microsecond = int(microsecond)
+ else:
+ microsecond = 0
+ second = int(second)
+ return hour, minute, second, microsecond
def strip(data):
""" returns a python string, with chopped off quotes,
@@ -59,29 +75,28 @@ def py_bool(data):
def py_time(data):
""" returns a python Time
"""
- return Time(*[int(float(x)) for x in data.split(':')])
+ return Time(*_extract_time(data))
def py_timetz(data):
""" returns a python Time where data contains a tz code
"""
dt, tzhour, tzmin = _extract_timezone(data)
- hour, minute, second = [int(float(x)) for x in dt.split(':')]
- return Time(hour + tzhour, minute + tzmin, second)
+ return Time(*_extract_time(dt, tzhour, tzmin))
def py_date(data):
""" Returns a python Date
"""
- return Date(*[int(float(x)) for x in data.split('-')])
+ return Date(*[int(x) for x in data.split('-')])
def py_timestamp(data):
""" Returns a python Timestamp
"""
- splitted = data.split(" ")
- date = [int(float(x)) for x in splitted[0].split('-')]
- time = [int(float(x)) for x in splitted[1].split(':')]
+ (datestr, timestr) = data.split(" ")
+ date = [int(x) for x in datestr.split('-')]
+ time = list(_extract_time(timestr))
return Timestamp(*(date + time))
@@ -90,11 +105,9 @@ def py_timestamptz(data):
"""
dt, tzhour, tzmin = _extract_timezone(data)
(datestr, timestr) = dt.split(" ")
- date = [int(float(x)) for x in datestr.split('-')]
- time = [int(float(x)) for x in timestr.split(':')]
- year, month, day = date
- hour, minute, second = time
- return Timestamp(year, month, day, hour + tzhour, minute + tzmin, second)
+ date = [int(x) for x in datestr.split('-')]
+ time = list(_extract_time(timestr, tzhour, tzmin))
+ return Timestamp(*(date + time))
mapping = {
diff --git a/gdk/gdk_calc.c b/gdk/gdk_calc.c
--- a/gdk/gdk_calc.c
+++ b/gdk/gdk_calc.c
@@ -9198,6 +9198,7 @@ convert_str_any(BAT *b, int tp, void *ds
char *s;
void *d;
int len = ATOMsize(tp);
+ int l;
int (*atomfromstr)(const char *, int *, ptr *) =
BATatoms[tp].atomFromStr;
BATiter bi = bat_iterator(b);
@@ -9223,7 +9224,8 @@ convert_str_any(BAT *b, int tp, void *ds
nils++;
} else {
d = dst;
- if ((*atomfromstr)(s, &len, &d) <= 0) {
+ if ((l = (*atomfromstr)(s, &len, &d)) <= 0 ||
+ l < (int) strlen(s)) {
if (abort_on_error) {
GDKerror("22018!conversion of string "
"'%s' to type %s failed.\n",
@@ -9828,11 +9830,12 @@ VARconvert(ValPtr ret, const ValRecord *
1, 0, 1, NULL, NULL, 0,
abort_on_error);
} else {
+ int len;
p = VALget(ret);
ret->len = BATatoms[ret->vtype].size;
- if ((*BATatoms[ret->vtype].atomFromStr)(v->val.sval,
- &ret->len,
- &p) <= 0) {
+ if ((len = (*BATatoms[ret->vtype].atomFromStr)(
+ v->val.sval, &ret->len, &p)) <= 0 ||
+ len < (int) strlen(v->val.sval)) {
GDKerror("22018!conversion of string "
"'%s' to type %s failed.\n",
v->val.sval, ATOMname(ret->vtype));
diff --git a/sql/test/ADT2006/bram.sql b/sql/test/ADT2006/bram.sql
--- a/sql/test/ADT2006/bram.sql
+++ b/sql/test/ADT2006/bram.sql
@@ -357,7 +357,7 @@ where
length is not NULL and length like '%\'' and hair like '%blonde%')
UNION ALL
(select name, (12*cast(substring(length from 0 for (position('\'' in length) -
1)) AS integer)
- + cast(substring(length from (position('\'' in length) + 1) for
(position('"' in length) + 1)) AS integer)) as height from victim v
+ + cast(substring(length from (position('\'' in length) + 1) for
(position('"' in length) - position('\'' in length) - 1)) AS integer)) as
height from victim v
where
length is not NULL and length like '%\'%"' and hair like '%blonde%')) AS h
)
@@ -371,7 +371,7 @@ where
length is not NULL and length like '%\'' and hair like '%brown%')
UNION ALL
(select name, (12*cast(substring(length from 0 for (position('\'' in length) -
1)) AS integer)
- + cast(substring(length from (position('\'' in length) + 1) for
(position('"' in length) + 1)) AS integer)) as height from victim v
+ + cast(substring(length from (position('\'' in length) + 1) for
(position('"' in length) - position('\'' in length) - 1)) AS integer)) as
height from victim v
where
length is not NULL and length like '%\'%"' and hair like '%brown%')) AS h
);
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
@@ -3,18 +3,19 @@ nested_common_table_exp.Bug-3417
query-crash.Bug-3418
groupby.Bug-3421
groupby_distict.Bug-3423
+integer-cast.Bug-3424
current_timestamp.Bug-3427
two-column-aggr-with-null.Bug-3428
sample-crash.Bug-3429
temporary.Bug-3430
indices.Bug-3435
utf8bom.Bug-3436
+python-microseconds.Bug-3439
left-outer-join-with-and.Bug-3444
setreadonly_forgets_changes.Bug-3446
select-having.Bug-3458
crash_on_or_with_in.Bug-3461
in_incorrect_multi.Bug-3462
crash_on_groupby_distinct_serial.Bug-3463
-local-temp-1.Bug-3468.sql
-local-temp-2.Bug-3468.sql
-
+local-temp-1.Bug-3468
+local-temp-2.Bug-3468
diff --git a/sql/test/BugTracker-2014/Tests/integer-cast.Bug-3424.sql
b/sql/test/BugTracker-2014/Tests/integer-cast.Bug-3424.sql
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2014/Tests/integer-cast.Bug-3424.sql
@@ -0,0 +1,1 @@
+select cast('00asdf1' as INTEGER);
diff --git a/sql/test/BugTracker-2014/Tests/integer-cast.Bug-3424.stable.err
b/sql/test/BugTracker-2014/Tests/integer-cast.Bug-3424.stable.err
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2014/Tests/integer-cast.Bug-3424.stable.err
@@ -0,0 +1,38 @@
+stderr of test 'integer-cast.Bug-3424` in directory 'sql/test/BugTracker-2014`
itself:
+
+
+# 17:58:28 >
+# 17:58:28 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set"
"mapi_open=true" "--set" "mapi_port=38988" "--set"
"mapi_usock=/var/tmp/mtest-25467/.s.monetdb.38988" "--set" "monet_prompt="
"--forcemito" "--set" "mal_listing=2"
"--dbpath=/home/sjoerd/Monet-stable/var/MonetDB/mTests_sql_test_BugTracker-2014"
"--set" "mal_listing=0"
+# 17:58:28 >
+
+# builtin opt gdk_dbpath = /home/sjoerd/Monet-stable/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 = 38988
+# cmdline opt mapi_usock = /var/tmp/mtest-25467/.s.monetdb.38988
+# cmdline opt monet_prompt =
+# cmdline opt mal_listing = 2
+# cmdline opt gdk_dbpath =
/home/sjoerd/Monet-stable/var/MonetDB/mTests_sql_test_BugTracker-2014
+# cmdline opt mal_listing = 0
+
+# 17:58:28 >
+# 17:58:28 > "mclient" "-lsql" "-ftest" "-Eutf-8" "-i" "-e"
"--host=/var/tmp/mtest-25467" "--port=38988"
+# 17:58:28 >
+
+MAPI = (monetdb) /var/tmp/mtest-25467/.s.monetdb.38988
+QUERY = select cast('00asdf1' as INTEGER);
+ERROR = !conversion of string '00asdf1' to type int failed.
+
+# 17:58:29 >
+# 17:58:29 > "Done."
+# 17:58:29 >
+
diff --git a/sql/test/BugTracker-2014/Tests/integer-cast.Bug-3424.stable.out
b/sql/test/BugTracker-2014/Tests/integer-cast.Bug-3424.stable.out
new file mode 100644
--- /dev/null
+++ b/sql/test/BugTracker-2014/Tests/integer-cast.Bug-3424.stable.out
@@ -0,0 +1,58 @@
+stdout of test 'integer-cast.Bug-3424` in directory 'sql/test/BugTracker-2014`
itself:
+
+
+# 17:58:28 >
+# 17:58:28 > "mserver5" "--debug=10" "--set" "gdk_nr_threads=0" "--set"
"mapi_open=true" "--set" "mapi_port=38988" "--set"
"mapi_usock=/var/tmp/mtest-25467/.s.monetdb.38988" "--set" "monet_prompt="
"--forcemito" "--set" "mal_listing=2"
"--dbpath=/home/sjoerd/Monet-stable/var/MonetDB/mTests_sql_test_BugTracker-2014"
"--set" "mal_listing=0"
+# 17:58:28 >
+
+# MonetDB 5 server v11.17.14 (hg id: a1c694f27eeb+)
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list