@@ -175,6 +175,23 @@ inline void checkPyObjIsNotNull(const PyObject *obj) {
175175 throw std::runtime_error (" F-UDF-CL-SL-PYTHON-1142" );
176176}
177177
178+ inline PyObject* convertPyStringToPyBytes (PyObject* pyString) {
179+ #ifdef SWIG_STRING_AS_BYTES_ENABLED
180+ return PyObject_CallMethod (pyString, " encode" , NULL );
181+ #else
182+ Py_INCREF (pyString);
183+ return pyString;
184+ #endif
185+ }
186+
187+ inline PyObject* convertPyBytesToPyString (PyObject* pyString) {
188+ #ifdef SWIG_STRING_AS_BYTES_ENABLED
189+ return PyObject_CallMethod (pyString, " decode" , NULL );
190+ #else
191+ Py_INCREF (pyString);
192+ return pyString;
193+ #endif
194+ }
178195
179196
180197struct ColumnInfo
@@ -923,8 +940,11 @@ inline void handleEmitPyInt(
923940 break ;
924941 }
925942 case SWIGVMContainers::NUMERIC :
926- pyValue.reset (PyObject_Str (pyInt));
943+ {
944+ PyPtr pyStrInt (PyObject_Str (pyInt));
945+ pyValue.reset (convertPyStringToPyBytes (pyStrInt.get ()));
927946 break ;
947+ }
928948 case SWIGVMContainers::DOUBLE :
929949 {
930950 double value = PyFloat_AsDouble (pyInt);
@@ -977,8 +997,11 @@ inline void handleEmitPyFloat(
977997 break ;
978998 }
979999 case SWIGVMContainers::NUMERIC :
980- pyValue.reset (PyObject_Str (pyFloat));
1000+ {
1001+ PyPtr pyStrFloat (PyObject_Str (pyFloat));
1002+ pyValue.reset (convertPyStringToPyBytes (pyStrFloat.get ()));
9811003 break ;
1004+ }
9821005 case SWIGVMContainers::DOUBLE :
9831006 {
9841007 // pyFloat points to a 'borrowed' reference. We need to explicitly increase the ref counter here, as pyValue will decrease it again later.
@@ -1020,15 +1043,21 @@ inline void handleEmitPyDecimal(
10201043 case SWIGVMContainers::INT64 :
10211044 case SWIGVMContainers::INT32 :
10221045 {
1046+ std::cout << " handleEmitPyDecimal: INT" << std::endl;
10231047 PyPtr pyInt (PyObject_CallMethodObjArgs (pyDecimal, pyIntMethodName.get (), NULL ));
10241048 pyValue.reset (pyInt.release ());
10251049 break ;
10261050 }
10271051 case SWIGVMContainers::NUMERIC :
1028- pyValue.reset (PyObject_Str (pyDecimal));
1052+ {
1053+ std::cout << " handleEmitPyDecimal: NUMERIC" << std::endl;
1054+ PyPtr pyStrDecimal (PyObject_Str (pyDecimal));
1055+ pyValue.reset (convertPyStringToPyBytes (pyStrDecimal.get ()));
10291056 break ;
1057+ }
10301058 case SWIGVMContainers::DOUBLE :
10311059 {
1060+ std::cout << " handleEmitPyDecimal: DOUBLE" << std::endl;
10321061 PyPtr pyFloat (PyObject_CallMethodObjArgs (pyDecimal, pyFloatMethodName.get (), NULL ));
10331062 pyValue.reset (pyFloat.release ());
10341063 break ;
@@ -1067,11 +1096,12 @@ inline void handleEmitPyStr(
10671096 case SWIGVMContainers::STRING :
10681097 {
10691098 Py_ssize_t size = -1 ;
1099+ PyPtr bytesString (convertPyStringToPyBytes (pyString));
10701100 const char *str = PyUnicode_AsUTF8AndSize (pyString, &size);
10711101 if (!str && size < 0 )
10721102 throw std::runtime_error (" F-UDF-CL-SL-PYTHON-1137: invalid size of string" );
10731103 PyPtr pySize (PyLong_FromSsize_t (size));
1074- pyResult.reset (PyObject_CallMethodObjArgs (resultHandler, pyColSetMethods[c].second .get (), pyColSetMethods[c].first .get (), pyString , pySize.get (), NULL ));
1104+ pyResult.reset (PyObject_CallMethodObjArgs (resultHandler, pyColSetMethods[c].second .get (), pyColSetMethods[c].first .get (), bytesString. get () , pySize.get (), NULL ));
10751105 break ;
10761106 }
10771107 default :
@@ -1105,7 +1135,8 @@ inline void handleEmitPyDate(
11051135 case SWIGVMContainers::DATE :
11061136 {
11071137 PyPtr pyIsoDate (PyObject_CallMethodObjArgs (pyDate, pyIsoformatMethodName.get (), NULL ));
1108- pyResult.reset (PyObject_CallMethodObjArgs (resultHandler, pyColSetMethods[c].second .get (), pyColSetMethods[c].first .get (), pyIsoDate.get (), NULL ));
1138+ PyPtr bytesIsoDate (convertPyStringToPyBytes (pyIsoDate.get ()));
1139+ pyResult.reset (PyObject_CallMethodObjArgs (resultHandler, pyColSetMethods[c].second .get (), pyColSetMethods[c].first .get (), bytesIsoDate.get (), NULL ));
11091140 break ;
11101141 }
11111142 default :
@@ -1141,8 +1172,9 @@ inline void handleEmitPyTimestamp(
11411172 // it to the generated string.
11421173 PyPtr pyTzLocalize (PyObject_CallMethod (pyTimestamp, " tz_localize" , " z" , NULL ));
11431174 PyPtr pyIsoDatetime (PyObject_CallMethod (pyTzLocalize.get (), " isoformat" , " s" , " " ));
1175+ PyPtr bytesDateTime (convertPyStringToPyBytes (pyIsoDatetime.get ()));
11441176 pyResult.reset (PyObject_CallMethodObjArgs (
1145- resultHandler, pyColSetMethods[c].second .get (), pyColSetMethods[c].first .get (), pyIsoDatetime .get (), NULL ));
1177+ resultHandler, pyColSetMethods[c].second .get (), pyColSetMethods[c].first .get (), bytesDateTime .get (), NULL ));
11461178 break ;
11471179 }
11481180 default :
@@ -1177,8 +1209,9 @@ inline void handleEmitNpyDateTime(
11771209 case SWIGVMContainers::TIMESTAMP :
11781210 {
11791211 PyPtr pyIsoDatetime (PyObject_CallMethod (pyTimestamp, " isoformat" , " s" , " " ));
1212+ PyPtr bytesDateTime (convertPyStringToPyBytes (pyIsoDatetime.get ()));
11801213 pyResult.reset (PyObject_CallMethodObjArgs (
1181- resultHandler, pyColSetMethods[c].second .get (), pyColSetMethods[c].first .get (), pyIsoDatetime .get (), NULL ));
1214+ resultHandler, pyColSetMethods[c].second .get (), pyColSetMethods[c].first .get (), bytesDateTime .get (), NULL ));
11821215 break ;
11831216 }
11841217 default :
@@ -1377,7 +1410,8 @@ void emit(PyObject *resultHandler, std::vector<ColumnInfo>& colInfo, PyObject *d
13771410
13781411 PyPtr pyCheckException (PyObject_CallMethodObjArgs (resultHandler, pyCheckExceptionMethodName.get (), NULL ));
13791412 if (pyCheckException.get () != Py_None) {
1380- const char *exMsg = PyUnicode_AsUTF8 (pyCheckException.get ());
1413+ PyPtr exceptionAsPyBytes (convertPyBytesToPyString (pyCheckException.get ()));
1414+ const char *exMsg = PyUnicode_AsUTF8 (exceptionAsPyBytes.get ());
13811415 if (exMsg) {
13821416 std::stringstream ss;
13831417 ss << " F-UDF-CL-SL-PYTHON-1075: emit(): " << exMsg;
0 commit comments