Changeset: bc1dfec103c1 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=bc1dfec103c1
Modified Files:
sql/backends/monet5/Tests/pyloader07.sql
sql/backends/monet5/Tests/pyloader07.stable.out
sql/backends/monet5/Tests/pyloader07.stable.out.Windows
sql/backends/monet5/UDF/pyapi/convert_loops.h
sql/backends/monet5/UDF/pyapi/emit.c
sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out
sql/test/emptydb-upgrade/Tests/upgrade.stable.out
sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out
sql/test/testdb-upgrade/Tests/upgrade.stable.out
testing/Mtest.py.in
Branch: default
Log Message:
Merge with Jul2017 branch.
diffs (truncated from 351 to 300 lines):
diff --git a/sql/backends/monet5/Tests/pyloader07.sql
b/sql/backends/monet5/Tests/pyloader07.sql
--- a/sql/backends/monet5/Tests/pyloader07.sql
+++ b/sql/backends/monet5/Tests/pyloader07.sql
@@ -9,3 +9,21 @@ SELECT * FROM pyloader07table;
DROP TABLE pyloader07table;
DROP LOADER pyloader07;
ROLLBACK;
+
+START TRANSACTION;
+
+CREATE TABLE tstamp(d DATE, s TIME, t TIMESTAMP);
+
+
+CREATE LOADER pyloader07() LANGUAGE PYTHON {
+ _emit.emit({'d': '2014-05-20', 's': '00:02:30', 't': '2014-05-20
00:02:30'});
+ _emit.emit({'d': ['2014-05-20'], 's': ['00:02:30'], 't': ['2014-05-20
00:02:30']});
+};
+
+COPY LOADER INTO tstamp FROM pyloader07();
+
+SELECT * FROM tstamp;
+DROP TABLE tstamp;
+DROP LOADER pyloader07;
+
+ROLLBACK;
diff --git a/sql/backends/monet5/Tests/pyloader07.stable.out
b/sql/backends/monet5/Tests/pyloader07.stable.out
--- a/sql/backends/monet5/Tests/pyloader07.stable.out
+++ b/sql/backends/monet5/Tests/pyloader07.stable.out
@@ -75,6 +75,24 @@ Ready.
#DROP TABLE pyloader07table;
#DROP LOADER pyloader07;
#ROLLBACK;
+#START TRANSACTION;
+#CREATE TABLE tstamp(d DATE, s TIME, t TIMESTAMP);
+#CREATE LOADER pyloader07() LANGUAGE PYTHON {
+# _emit.emit({'d': '2014-05-20', 's': '00:02:30', 't': '2014-05-20
00:02:30'});
+# _emit.emit({'d': ['2014-05-20'], 's': ['00:02:30'], 't': ['2014-05-20
00:02:30']});
+#};
+#COPY LOADER INTO tstamp FROM pyloader07();
+[ 2 ]
+#SELECT * FROM tstamp;
+% sys.tstamp, sys.tstamp, sys.tstamp # table_name
+% d, s, t # name
+% date, time, timestamp # type
+% 10, 8, 26 # length
+[ 2014-05-20, 00:02:30, 2014-05-20 00:02:30.000000 ]
+[ 2014-05-20, 00:02:30, 2014-05-20 00:02:30.000000 ]
+#DROP TABLE tstamp;
+#DROP LOADER pyloader07;
+#ROLLBACK;
# 15:06:46 >
# 15:06:46 > "Done."
diff --git a/sql/backends/monet5/Tests/pyloader07.stable.out.Windows
b/sql/backends/monet5/Tests/pyloader07.stable.out.Windows
--- a/sql/backends/monet5/Tests/pyloader07.stable.out.Windows
+++ b/sql/backends/monet5/Tests/pyloader07.stable.out.Windows
@@ -75,6 +75,24 @@ Ready.
#DROP TABLE pyloader07table;
#DROP LOADER pyloader07;
#ROLLBACK;
+#START TRANSACTION;
+#CREATE TABLE tstamp(d DATE, s TIME, t TIMESTAMP);
+#CREATE LOADER pyloader07() LANGUAGE PYTHON {
+# _emit.emit({'d': '2014-05-20', 's': '00:02:30', 't': '2014-05-20
00:02:30'});
+# _emit.emit({'d': ['2014-05-20'], 's': ['00:02:30'], 't': ['2014-05-20
00:02:30']});
+#};
+#COPY LOADER INTO tstamp FROM pyloader07();
+[ 2 ]
+#SELECT * FROM tstamp;
+% sys.tstamp, sys.tstamp, sys.tstamp # table_name
+% d, s, t # name
+% date, time, timestamp # type
+% 10, 8, 26 # length
+[ 2014-05-20, 00:02:30, 2014-05-20 00:02:30.000000 ]
+[ 2014-05-20, 00:02:30, 2014-05-20 00:02:30.000000 ]
+#DROP TABLE tstamp;
+#DROP LOADER pyloader07;
+#ROLLBACK;
# 15:06:46 >
# 15:06:46 > "Done."
diff --git a/sql/backends/monet5/UDF/pyapi/convert_loops.h
b/sql/backends/monet5/UDF/pyapi/convert_loops.h
--- a/sql/backends/monet5/UDF/pyapi/convert_loops.h
+++ b/sql/backends/monet5/UDF/pyapi/convert_loops.h
@@ -278,6 +278,25 @@
}
\
}
+
+static gdk_return
+convert_and_append(BAT* b, const char* text, bit force) {
+ if (b->ttype == TYPE_str) {
+ return BUNappend(b, text, force);
+ } else if (text == str_nil) {
+ return BUNappend(b, BATatoms[b->ttype].atomNull, force);
+ } else {
+ void* element = NULL;
+ size_t len = 0;
+ gdk_return ret;
+
+ BATatoms[b->ttype].atomFromStr(text, &len, &element);
+ ret = BUNappend(b, element, force);
+ GDKfree(element);
+ return ret;
+ }
+}
+
// This #define is for converting a numeric numpy array into a string BAT.
// 'conv' is a function that turns a numeric value of type 'mtpe' to a char*
// array.
@@ -287,7 +306,7 @@
snprintf(utf8_string, utf8string_minlength, fmt,
\
*((mtpe *)&data[(index_offset *
ret->count + iu) * \
ret->memory_size])); \
- if (BUNappend(bat, utf8_string, FALSE) != GDK_SUCCEED)
{ \
+ if (convert_and_append(bat, utf8_string, FALSE) !=
GDK_SUCCEED) { \
msg =
\
createException(MAL, "pyapi.eval",
SQLSTATE(PY000) "BUNappend failed.\n"); \
goto wrapup;
\
@@ -297,7 +316,7 @@
for (iu = 0; iu < ret->count; iu++) {
\
if (mask[index_offset * ret->count + iu] == TRUE) {
\
bat->tnil = 1;
\
- if (BUNappend(bat, str_nil, FALSE) !=
GDK_SUCCEED) { \
+ if (convert_and_append(bat, str_nil, FALSE) !=
GDK_SUCCEED) { \
msg = createException(MAL,
"pyapi.eval", \
SQLSTATE(PY000) "BUNappend failed.\n"); \
goto wrapup;
\
@@ -306,7 +325,7 @@
snprintf(utf8_string, utf8string_minlength,
fmt, \
*((mtpe *)&data[(index_offset
* ret->count + iu) * \
ret->memory_size])); \
- if (BUNappend(bat, utf8_string, FALSE) !=
GDK_SUCCEED) { \
+ if (convert_and_append(bat, utf8_string, FALSE)
!= GDK_SUCCEED) { \
msg = createException(MAL,
"pyapi.eval", \
SQLSTATE(PY000) "BUNappend failed.\n"); \
goto wrapup;
\
@@ -430,7 +449,7 @@
if (mask != NULL &&
\
(mask[index_offset * ret->count + iu])
== TRUE) { \
b->tnil = 1;
\
- if (BUNappend(b, str_nil, FALSE) !=
GDK_SUCCEED) { \
+ if (convert_and_append(b, str_nil,
FALSE) != GDK_SUCCEED) { \
msg = createException(MAL,
"pyapi.eval", \
SQLSTATE(PY000) "BUNappend failed.\n"); \
goto wrapup;
\
@@ -446,7 +465,7 @@
"object.\n"); \
goto wrapup;
\
}
\
- if (BUNappend(b, utf8_string, FALSE) !=
GDK_SUCCEED) { \
+ if (convert_and_append(b, utf8_string,
FALSE) != GDK_SUCCEED) { \
msg = createException(MAL,
"pyapi.eval", \
SQLSTATE(PY000) "BUNappend failed.\n"); \
goto wrapup;
\
@@ -459,7 +478,7 @@
if (mask != NULL &&
\
(mask[index_offset * ret->count + iu])
== TRUE) { \
b->tnil = 1;
\
- if (BUNappend(b, str_nil, FALSE) !=
GDK_SUCCEED) { \
+ if (convert_and_append(b, str_nil,
FALSE) != GDK_SUCCEED) { \
msg = createException(MAL,
"pyapi.eval", \
SQLSTATE(PY000) "BUNappend failed.\n"); \
goto wrapup;
\
@@ -470,7 +489,7 @@
(const Py_UNICODE
\
*)(&data[(index_offset
* ret->count + iu) * \
ret->memory_size])); \
- if (BUNappend(b, utf8_string, FALSE) !=
GDK_SUCCEED) { \
+ if (convert_and_append(b, utf8_string,
FALSE) != GDK_SUCCEED) { \
msg = createException(MAL,
"pyapi.eval", \
SQLSTATE(PY000) "BUNappend failed.\n"); \
goto wrapup;
\
diff --git a/sql/backends/monet5/UDF/pyapi/emit.c
b/sql/backends/monet5/UDF/pyapi/emit.c
--- a/sql/backends/monet5/UDF/pyapi/emit.c
+++ b/sql/backends/monet5/UDF/pyapi/emit.c
@@ -12,6 +12,7 @@
#include "convert_loops.h"
#include "type_conversion.h"
#include "gdk_interprocess.h"
+#include "mtime.h"
#include "unicode.h"
@@ -264,7 +265,7 @@ PyObject *PyEmit_Emit(PyEmitObject *self
scalar_convert(hge);
break;
#endif
- case TYPE_str: {
+ default: {
str val = NULL;
gdk_return retval;
msg =
pyobject_to_str(&dictEntry, 42, &val);
@@ -272,18 +273,13 @@ PyObject *PyEmit_Emit(PyEmitObject *self
goto wrapup;
}
assert(val);
- retval =
BUNappend(self->cols[i].b, val, 0);
+ retval =
convert_and_append(self->cols[i].b, val, 0);
free(val);
if (retval !=
GDK_SUCCEED) {
msg =
GDKstrdup("BUNappend failed.");
goto wrapup;
}
} break;
- default:
-
PyErr_Format(PyExc_TypeError, "Unsupported BAT Type %s",
-
BatType_Format(self->cols[i].b->ttype));
- error = true;
- goto wrapup;
}
}
} else {
@@ -309,6 +305,7 @@ PyObject *PyEmit_Emit(PyEmitObject *self
mask = (bool *)ret->mask_data;
data = (char *)ret->array_data;
assert((size_t)el_count == (size_t)ret->count);
+
switch (self->cols[i].b->ttype) {
case TYPE_bit:
NP_INSERT_BAT(self->cols[i].b,
bit, self->nvals);
@@ -339,7 +336,7 @@ PyObject *PyEmit_Emit(PyEmitObject *self
NP_INSERT_BAT(self->cols[i].b,
hge, self->nvals);
break;
#endif
- case TYPE_str: {
+ default: {
char *utf8_string = NULL;
if (ret->result_type !=
NPY_OBJECT) {
utf8_string =
GDKzalloc(utf8string_minlength +
@@ -348,14 +345,8 @@ PyObject *PyEmit_Emit(PyEmitObject *self
ret->memory_size] = '\0';
}
NP_INSERT_STRING_BAT(self->cols[i].b);
- if (utf8_string)
- GDKfree(utf8_string);
- } break;
- default:
- PyErr_Format(PyExc_TypeError,
"Unsupported BAT Type %s",
-
BatType_Format(self->cols[i].b->ttype));
- error = true;
- goto wrapup;
+ GDKfree(utf8_string);
+ }
}
self->cols[i].b->tnonil = 1 -
self->cols[i].b->tnil;
}
diff --git a/sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out
b/sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out
--- a/sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out
+++ b/sql/test/emptydb-upgrade-chain/Tests/upgrade.stable.out
@@ -24,17 +24,6 @@ stdout of test 'upgrade` in directory 's
# MonetDB/R module loaded
Ready.
-Running database upgrade commands:
-GRANT SELECT ON sys.keywords TO PUBLIC;
-GRANT SELECT ON sys.table_types TO PUBLIC;
-GRANT SELECT ON sys.dependency_types TO PUBLIC;
-GRANT SELECT ON sys.function_types TO PUBLIC;
-GRANT SELECT ON sys.function_languages TO PUBLIC;
-GRANT SELECT ON sys.key_types TO PUBLIC;
-GRANT SELECT ON sys.index_types TO PUBLIC;
-GRANT SELECT ON sys.privilege_codes TO PUBLIC;
-GRANT EXECUTE ON FUNCTION sys.environment() TO PUBLIC;
-GRANT SELECT ON sys.environment TO PUBLIC;
Running database upgrade commands:
set schema "sys";
diff --git a/sql/test/emptydb-upgrade/Tests/upgrade.stable.out
b/sql/test/emptydb-upgrade/Tests/upgrade.stable.out
--- a/sql/test/emptydb-upgrade/Tests/upgrade.stable.out
+++ b/sql/test/emptydb-upgrade/Tests/upgrade.stable.out
@@ -24,17 +24,6 @@ stdout of test 'upgrade` in directory 's
# MonetDB/R module loaded
Ready.
-Running database upgrade commands:
-GRANT SELECT ON sys.keywords TO PUBLIC;
-GRANT SELECT ON sys.table_types TO PUBLIC;
-GRANT SELECT ON sys.dependency_types TO PUBLIC;
-GRANT SELECT ON sys.function_types TO PUBLIC;
-GRANT SELECT ON sys.function_languages TO PUBLIC;
-GRANT SELECT ON sys.key_types TO PUBLIC;
-GRANT SELECT ON sys.index_types TO PUBLIC;
-GRANT SELECT ON sys.privilege_codes TO PUBLIC;
-GRANT EXECUTE ON FUNCTION sys.environment() TO PUBLIC;
-GRANT SELECT ON sys.environment TO PUBLIC;
Running database upgrade commands:
set schema "sys";
diff --git a/sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out
b/sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out
--- a/sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out
+++ b/sql/test/testdb-upgrade-chain/Tests/upgrade.stable.out
@@ -19,17 +19,6 @@ stdout of test 'upgrade` in directory 's
# MonetDB/SQL module loaded
Ready.
-Running database upgrade commands:
-GRANT SELECT ON sys.keywords TO PUBLIC;
-GRANT SELECT ON sys.table_types TO PUBLIC;
-GRANT SELECT ON sys.dependency_types TO PUBLIC;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list