@@ -783,17 +783,15 @@ conn_inserttable(connObject *self, PyObject *args, PyObject *kwds)
783783
784784 encoding = PQclientEncoding (self -> cnx );
785785
786- /* starts query */
787- ext_char_buffer_s (& buffer , "copy " );
788-
789- /* return early if there is no buffer */
790- if (buffer .error ) {
791- if (buffer .data )
792- PyMem_Free (buffer .data );
786+ /* pre-allocate some memory for the query buffer */
787+ if (!init_char_buffer (& buffer , 4096 )) {
793788 Py_DECREF (iter_row );
794789 return PyErr_NoMemory ();
795790 }
796791
792+ /* starts query */
793+ ext_char_buffer_s (& buffer , "copy " );
794+
797795 s = table ;
798796 do {
799797 t = strchr (s , '.' );
@@ -838,13 +836,14 @@ conn_inserttable(connObject *self, PyObject *args, PyObject *kwds)
838836 col = PQescapeIdentifier (self -> cnx , col , (size_t )slen );
839837 Py_DECREF (obj );
840838 ext_char_buffer_s (& buffer , col );
841- ext_char_buffer_c (& buffer , j == n - 1 ? ')' : ',' );
842839 PQfreemem (col );
840+ ext_char_buffer_c (& buffer , j == n - 1 ? ')' : ',' );
843841 }
844842 }
845843 ext_char_buffer_s (& buffer , " from stdin" );
846844 if (freeze )
847845 ext_char_buffer_s (& buffer , " freeze" );
846+ ext_char_buffer_c (& buffer , '\0' );
848847
849848 if (buffer .error ) {
850849 PyMem_Free (buffer .data );
@@ -897,10 +896,10 @@ conn_inserttable(connObject *self, PyObject *args, PyObject *kwds)
897896 return NULL ;
898897 }
899898
900- /* reset buffer to empty */
901- buffer .len = 0 ;
899+ /* empty buffer while keeping allocated memory */
900+ buffer .size = 0 ;
902901
903- /* builds insert line */
902+ /* build insert line */
904903
905904 for (j = 0 ; j < n ; ++ j ) {
906905 if (j )
@@ -1015,22 +1014,21 @@ conn_inserttable(connObject *self, PyObject *args, PyObject *kwds)
10151014 }
10161015 Py_DECREF (s );
10171016 }
1018-
1019- if (buffer .error ) {
1020- PQputCopyEnd (self -> cnx , "Memory error" );
1021- PyMem_Free (buffer .data );
1022- Py_DECREF (columns );
1023- Py_DECREF (iter_row );
1024- return PyErr_NoMemory ();
1025- }
10261017 }
10271018
10281019 Py_DECREF (columns );
10291020
1021+ /* terminate line */
10301022 ext_char_buffer_c (& buffer , '\n' );
1023+ if (buffer .error ) {
1024+ PQputCopyEnd (self -> cnx , "Memory error" );
1025+ PyMem_Free (buffer .data );
1026+ Py_DECREF (iter_row );
1027+ return PyErr_NoMemory ();
1028+ }
10311029
1032- /* sends data */
1033- ret = PQputCopyData (self -> cnx , buffer .data , (int )buffer .len );
1030+ /* send data */
1031+ ret = PQputCopyData (self -> cnx , buffer .data , (int )buffer .size );
10341032 if (ret != 1 ) {
10351033 char * errormsg = ret == -1 ? PQerrorMessage (self -> cnx )
10361034 : "Data cannot be queued" ;
0 commit comments