@@ -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