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 checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list