@@ -100,6 +100,14 @@ static i64 readI64(const u8** const data)
100100 return value ;
101101}
102102
103+ static PyObject * readString (const u8 * * const data )
104+ {
105+ const i32 size = readI32 (data );
106+ PyObject * value = checked (PyUnicode_FromStringAndSize ((const char * )* data , size ));
107+ * data += size ;
108+ return value ;
109+ }
110+
103111// skip type at the current position in the type descriptor
104112static void skipType (const u8 * * const type )
105113{
@@ -234,19 +242,14 @@ static PyObject* doBuildArgs(const u8** const type, const u8** const data)
234242 return checked (PyFloat_FromDouble (value ));
235243 }
236244 case DECIMAL : {
237- const i32 size = readI32 (data );
238- PyObject * number = checked (PyUnicode_FromStringAndSize ((const char * )* data , size ));
239- * data += size ;
245+ PyObject * number = readString (data );
240246 PyObject * value = checked (PyObject_CallOneArg (decimalClass , number ));
241247 Py_DECREF (number );
242248 return value ;
243249 }
244250 case VARCHAR :
245251 case JSON : {
246- const i32 size = readI32 (data );
247- PyObject * value = checked (PyUnicode_FromStringAndSize ((const char * )* data , size ));
248- * data += size ;
249- return value ;
252+ return readString (data );
250253 }
251254 case VARBINARY : {
252255 const i32 size = readI32 (data );
@@ -424,26 +427,38 @@ static void bufferAppend(Buffer* buffer, const u8* data, const i32 size)
424427 buffer -> used += size ;
425428}
426429
427- static void bufferAppendI8 (Buffer * buffer , const i8 value )
430+ static void bufferAppendI8 (Buffer * buffer , const i8 value )
428431{
429432 bufferAppend (buffer , (u8 * )& value , sizeof (i8 ));
430433}
431434
432- static void bufferAppendI16 (Buffer * buffer , const i16 value )
435+ static void bufferAppendI16 (Buffer * buffer , const i16 value )
433436{
434437 bufferAppend (buffer , (u8 * )& value , sizeof (i16 ));
435438}
436439
437- static void bufferAppendI32 (Buffer * buffer , const i32 value )
440+ static void bufferAppendI32 (Buffer * buffer , const i32 value )
438441{
439442 bufferAppend (buffer , (u8 * )& value , sizeof (i32 ));
440443}
441444
442- static void bufferAppendI64 (Buffer * buffer , const i64 value )
445+ static void bufferAppendI64 (Buffer * buffer , const i64 value )
443446{
444447 bufferAppend (buffer , (u8 * )& value , sizeof (i64 ));
445448}
446449
450+ static bool bufferAppendString (Buffer * buffer , PyObject * object )
451+ {
452+ Py_ssize_t size ;
453+ const char * value = PyUnicode_AsUTF8AndSize (object , & size );
454+ if (value == NULL ) {
455+ return false;
456+ }
457+ bufferAppendI32 (buffer , size );
458+ bufferAppend (buffer , (u8 * )value , size );
459+ return true;
460+ }
461+
447462static void overflowError (const char * message )
448463{
449464 trinoReturnError (NUMERIC_VALUE_OUT_OF_RANGE , (u8 * )message , strlen (message ), NULL , 0 );
@@ -634,15 +649,11 @@ static bool buildResult(const u8** const type, PyObject* input, Buffer* buffer)
634649 resultError (input , "DECIMAL" );
635650 return false;
636651 }
637- Py_ssize_t size ;
638- const char * value = PyUnicode_AsUTF8AndSize (string , & size );
639- if (value == NULL ) {
652+ if (!bufferAppendString (buffer , string )) {
640653 Py_DECREF (string );
641654 resultError (input , "DECIMAL" );
642655 return false;
643656 }
644- bufferAppendI32 (buffer , size );
645- bufferAppend (buffer , (u8 * )value , size );
646657 Py_DECREF (string );
647658 return true;
648659 }
@@ -653,14 +664,10 @@ static bool buildResult(const u8** const type, PyObject* input, Buffer* buffer)
653664 resultError (input , typeName );
654665 return false;
655666 }
656- Py_ssize_t size ;
657- const char * value = PyUnicode_AsUTF8AndSize (input , & size );
658- if (value == NULL ) {
667+ if (!bufferAppendString (buffer , input )) {
659668 resultError (input , typeName );
660669 return false;
661670 }
662- bufferAppendI32 (buffer , size );
663- bufferAppend (buffer , (u8 * )value , size );
664671 return true;
665672 }
666673 case VARBINARY : {
0 commit comments