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

Reply via email to