From 4c127f2542ef16ed609e0c990ee0ee5f42c80d0c Mon Sep 17 00:00:00 2001 From: Stanley Kudrow Date: Tue, 12 Mar 2024 14:05:30 +0300 Subject: [PATCH 1/2] rebase after sync'ing the repositories --- clickhouse_driver/block.py | 48 +-- clickhouse_driver/bufferedreader.c | 123 ++++---- clickhouse_driver/bufferedwriter.c | 323 ++++++++++---------- clickhouse_driver/client.py | 426 +++++++++++++++------------ clickhouse_driver/columns/largeint.c | 123 ++++---- clickhouse_driver/columns/service.py | 184 ++++++------ clickhouse_driver/connection.py | 293 +++++++++--------- clickhouse_driver/util/helpers.py | 36 ++- clickhouse_driver/varint.c | 123 ++++---- tests/test_insert.py | 275 ++++++++++------- 10 files changed, 1028 insertions(+), 926 deletions(-) diff --git a/clickhouse_driver/block.py b/clickhouse_driver/block.py index 15589e96..0e7a0112 100644 --- a/clickhouse_driver/block.py +++ b/clickhouse_driver/block.py @@ -8,6 +8,13 @@ class BlockInfo(object): is_overflows = False bucket_num = -1 + def __repr__(self) -> str: + cls_name = self.__class__.__name__ + attrs = { + key: val for key, val in (vars(self)).items() if not key.startswith("_") + } + return f"{cls_name}({', '.join([f'{aname}={aval}' for aname, aval in attrs.items()])})" + def write(self, buf): # Set of pairs (`FIELD_NUM`, value) in binary form. Then 0. write_varint(1, buf) @@ -32,8 +39,9 @@ def read(self, buf): class BaseBlock(object): - def __init__(self, columns_with_types=None, data=None, - info=None, types_check=False): + def __init__( + self, columns_with_types=None, data=None, info=None, types_check=False + ): self.columns_with_types = columns_with_types or [] self.types_check = types_check self.info = info or BlockInfo() @@ -41,6 +49,13 @@ def __init__(self, columns_with_types=None, data=None, super(BaseBlock, self).__init__() + def __repr__(self) -> str: + cls_name = self.__class__.__name__ + attrs = { + key: val for key, val in (vars(self)).items() if not key.startswith("_") + } + return f"{cls_name}({', '.join([f'{aname}={aval}' for aname, aval in attrs.items()])})" + def normalize(self, data): return data @@ -96,7 +111,7 @@ def _check_number_of_columns(self, data): got = len(data) if expected_row_len != got: - msg = 'Expected {} columns, got {}'.format(expected_row_len, got) + msg = "Expected {} columns, got {}".format(expected_row_len, got) raise ValueError(msg) def _check_all_columns_equal_length(self, data): @@ -105,12 +120,12 @@ def _check_all_columns_equal_length(self, data): for column in data: got = len(column) if got != expected: - msg = 'Expected {} rows, got {}'.format(expected, got) + msg = "Expected {} rows, got {}".format(expected, got) raise ValueError(msg) class RowOrientedBlock(BaseBlock): - dict_row_types = (dict, ) + dict_row_types = (dict,) tuple_row_types = (list, tuple) supported_row_types = dict_row_types + tuple_row_types @@ -171,8 +186,8 @@ def _pure_mutate_dicts_to_rows( columns_with_cwt = [] for name, type_ in columns_with_types: cwt = None - if type_.startswith('Nested'): - inner_spec = get_inner_spec('Nested', type_) + if type_.startswith("Nested"): + inner_spec = get_inner_spec("Nested", type_) cwt = get_inner_columns_with_types(inner_spec) columns_with_cwt.append((name, cwt)) @@ -185,9 +200,9 @@ def _pure_mutate_dicts_to_rows( if cwt is None: new_data.append(row[name]) else: - new_data.append(self._pure_mutate_dicts_to_rows( - row[name], cwt, check_row_type - )) + new_data.append( + self._pure_mutate_dicts_to_rows(row[name], cwt, check_row_type) + ) data[i] = new_data # return for recursion return data @@ -197,7 +212,7 @@ def _check_rows(self, data): got = len(data[0]) if expected_row_len != got: - msg = 'Expected {} columns, got {}'.format(expected_row_len, got) + msg = "Expected {} columns, got {}".format(expected_row_len, got) raise ValueError(msg) if self.types_check: @@ -208,20 +223,19 @@ def _check_rows(self, data): def _check_row_type(self, row): if not isinstance(row, self.supported_row_types): raise TypeError( - 'Unsupported row type: {}. dict, list or tuple is expected.' - .format(type(row)) + "Unsupported row type: {}. dict, list or tuple is expected.".format( + type(row) + ) ) def _check_tuple_row_type(self, row): if not isinstance(row, self.tuple_row_types): raise TypeError( - 'Unsupported row type: {}. list or tuple is expected.' - .format(type(row)) + "Unsupported row type: {}. list or tuple is expected.".format(type(row)) ) def _check_dict_row_type(self, row): if not isinstance(row, self.dict_row_types): raise TypeError( - 'Unsupported row type: {}. dict is expected.' - .format(type(row)) + "Unsupported row type: {}. dict is expected.".format(type(row)) ) diff --git a/clickhouse_driver/bufferedreader.c b/clickhouse_driver/bufferedreader.c index 88e227ca..3ae384d8 100644 --- a/clickhouse_driver/bufferedreader.c +++ b/clickhouse_driver/bufferedreader.c @@ -1,4 +1,4 @@ -/* Generated by Cython 3.0.6 */ +/* Generated by Cython 3.0.9 */ /* BEGIN: Cython Metadata { @@ -54,10 +54,10 @@ END: Cython Metadata */ #else #define __PYX_EXTRA_ABI_MODULE_NAME "" #endif -#define CYTHON_ABI "3_0_6" __PYX_EXTRA_ABI_MODULE_NAME +#define CYTHON_ABI "3_0_9" __PYX_EXTRA_ABI_MODULE_NAME #define __PYX_ABI_MODULE_NAME "_cython_" CYTHON_ABI #define __PYX_TYPE_MODULE_PREFIX __PYX_ABI_MODULE_NAME "." -#define CYTHON_HEX_VERSION 0x030006F0 +#define CYTHON_HEX_VERSION 0x030009F0 #define CYTHON_FUTURE_DIVISION 1 #include #ifndef offsetof @@ -599,14 +599,14 @@ END: Cython Metadata */ PyObject *exception_table = NULL; PyObject *types_module=NULL, *code_type=NULL, *result=NULL; #if __PYX_LIMITED_VERSION_HEX < 0x030B0000 - PyObject *version_info; // borrowed + PyObject *version_info; PyObject *py_minor_version = NULL; #endif long minor_version = 0; PyObject *type, *value, *traceback; PyErr_Fetch(&type, &value, &traceback); #if __PYX_LIMITED_VERSION_HEX >= 0x030B0000 - minor_version = 11; // we don't yet need to distinguish between versions > 11 + minor_version = 11; #else if (!(version_info = PySys_GetObject("version_info"))) goto end; if (!(py_minor_version = PySequence_GetItem(version_info, 1))) goto end; @@ -664,7 +664,7 @@ END: Cython Metadata */ PyObject *fv, PyObject *cell, PyObject* fn, PyObject *name, int fline, PyObject *lnos) { PyCodeObject *result; - PyObject *empty_bytes = PyBytes_FromStringAndSize("", 0); // we don't have access to __pyx_empty_bytes here + PyObject *empty_bytes = PyBytes_FromStringAndSize("", 0); if (!empty_bytes) return NULL; result = #if PY_VERSION_HEX >= 0x030C0000 @@ -750,8 +750,13 @@ END: Cython Metadata */ typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames); #else - #define __Pyx_PyCFunctionFast _PyCFunctionFast - #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords + #if PY_VERSION_HEX >= 0x030d00A4 + # define __Pyx_PyCFunctionFast PyCFunctionFast + # define __Pyx_PyCFunctionFastWithKeywords PyCFunctionFastWithKeywords + #else + # define __Pyx_PyCFunctionFast _PyCFunctionFast + # define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords + #endif #endif #if CYTHON_METH_FASTCALL #define __Pyx_METH_FASTCALL METH_FASTCALL @@ -1103,7 +1108,7 @@ static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStrWithError(PyObject *dict, #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_Size(o) #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_Size(o) #endif -#if PY_VERSION_HEX >= 0x030d00A1 +#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 #define __Pyx_PyImport_AddModuleRef(name) PyImport_AddModuleRef(name) #else static CYTHON_INLINE PyObject *__Pyx_PyImport_AddModuleRef(const char *name) { @@ -1190,7 +1195,7 @@ static CYTHON_INLINE float __PYX_NAN() { #endif #define __PYX_MARK_ERR_POS(f_index, lineno) \ - { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } + { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } #define __PYX_ERR(f_index, lineno, Ln_error) \ { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } @@ -1297,24 +1302,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); #define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) #define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) #define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) -#if CYTHON_COMPILING_IN_LIMITED_API -static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const wchar_t *u) -{ - const wchar_t *u_end = u; - while (*u_end++) ; - return (size_t)(u_end - u - 1); -} -#else -static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) -{ - const Py_UNICODE *u_end = u; - while (*u_end++) ; - return (size_t)(u_end - u - 1); -} -#endif #define __Pyx_PyUnicode_FromOrdinal(o) PyUnicode_FromOrdinal((int)o) -#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) -#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode #define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode #define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) #define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) @@ -1364,7 +1352,7 @@ static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); #endif typedef Py_ssize_t __Pyx_compact_pylong; typedef size_t __Pyx_compact_upylong; - #else // Py < 3.12 + #else #define __Pyx_PyLong_IsNeg(x) (Py_SIZE(x) < 0) #define __Pyx_PyLong_IsNonNeg(x) (Py_SIZE(x) >= 0) #define __Pyx_PyLong_IsZero(x) (Py_SIZE(x) == 0) @@ -1484,11 +1472,11 @@ static const char *__pyx_filename; static const char *__pyx_f[] = { "clickhouse_driver/bufferedreader.pyx", - "venv/lib/python3.10/site-packages/Cython/Includes/cpython/contextvars.pxd", + "chenv/lib/python3.10/site-packages/Cython/Includes/cpython/contextvars.pxd", "", - "venv/lib/python3.10/site-packages/Cython/Includes/cpython/type.pxd", - "venv/lib/python3.10/site-packages/Cython/Includes/cpython/bool.pxd", - "venv/lib/python3.10/site-packages/Cython/Includes/cpython/complex.pxd", + "chenv/lib/python3.10/site-packages/Cython/Includes/cpython/type.pxd", + "chenv/lib/python3.10/site-packages/Cython/Includes/cpython/bool.pxd", + "chenv/lib/python3.10/site-packages/Cython/Includes/cpython/complex.pxd", }; /* #### Code section: utility_code_proto_before_types ### */ /* ForceInitThreads.proto */ @@ -1744,8 +1732,8 @@ static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int #define __Pyx_Arg_NewRef_VARARGS(arg) __Pyx_NewRef(arg) #define __Pyx_Arg_XDECREF_VARARGS(arg) Py_XDECREF(arg) #else - #define __Pyx_Arg_NewRef_VARARGS(arg) arg // no-op - #define __Pyx_Arg_XDECREF_VARARGS(arg) // no-op - arg is borrowed + #define __Pyx_Arg_NewRef_VARARGS(arg) arg + #define __Pyx_Arg_XDECREF_VARARGS(arg) #endif #define __Pyx_NumKwargs_VARARGS(kwds) PyDict_Size(kwds) #define __Pyx_KwValues_VARARGS(args, nargs) NULL @@ -1761,8 +1749,9 @@ static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int #else #define __Pyx_KwargsAsDict_FASTCALL(kw, kwvalues) _PyStack_AsDict(kwvalues, kw) #endif - #define __Pyx_Arg_NewRef_FASTCALL(arg) arg // no-op, __Pyx_Arg_FASTCALL is direct and this needs - #define __Pyx_Arg_XDECREF_FASTCALL(arg) // no-op - arg was returned from array + #define __Pyx_Arg_NewRef_FASTCALL(arg) arg /* no-op, __Pyx_Arg_FASTCALL is direct and this needs + to have the same reference counting */ + #define __Pyx_Arg_XDECREF_FASTCALL(arg) #else #define __Pyx_Arg_FASTCALL __Pyx_Arg_VARARGS #define __Pyx_NumKwargs_FASTCALL __Pyx_NumKwargs_VARARGS @@ -2053,22 +2042,22 @@ static int __Pyx_setup_reduce(PyObject* type_obj); #endif /* TypeImport.proto */ -#ifndef __PYX_HAVE_RT_ImportType_proto_3_0_6 -#define __PYX_HAVE_RT_ImportType_proto_3_0_6 +#ifndef __PYX_HAVE_RT_ImportType_proto_3_0_9 +#define __PYX_HAVE_RT_ImportType_proto_3_0_9 #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L #include #endif #if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || __cplusplus >= 201103L -#define __PYX_GET_STRUCT_ALIGNMENT_3_0_6(s) alignof(s) +#define __PYX_GET_STRUCT_ALIGNMENT_3_0_9(s) alignof(s) #else -#define __PYX_GET_STRUCT_ALIGNMENT_3_0_6(s) sizeof(void*) +#define __PYX_GET_STRUCT_ALIGNMENT_3_0_9(s) sizeof(void*) #endif -enum __Pyx_ImportType_CheckSize_3_0_6 { - __Pyx_ImportType_CheckSize_Error_3_0_6 = 0, - __Pyx_ImportType_CheckSize_Warn_3_0_6 = 1, - __Pyx_ImportType_CheckSize_Ignore_3_0_6 = 2 +enum __Pyx_ImportType_CheckSize_3_0_9 { + __Pyx_ImportType_CheckSize_Error_3_0_9 = 0, + __Pyx_ImportType_CheckSize_Warn_3_0_9 = 1, + __Pyx_ImportType_CheckSize_Ignore_3_0_9 = 2 }; -static PyTypeObject *__Pyx_ImportType_3_0_6(PyObject* module, const char *module_name, const char *class_name, size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_6 check_size); +static PyTypeObject *__Pyx_ImportType_3_0_9(PyObject* module, const char *module_name, const char *class_name, size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_9 check_size); #endif /* FetchSharedCythonModule.proto */ @@ -2161,7 +2150,7 @@ typedef struct { #endif void *defaults; int defaults_pyobjects; - size_t defaults_size; // used by FusedFunction for copying defaults + size_t defaults_size; int flags; PyObject *defaults_tuple; PyObject *defaults_kwdict; @@ -11236,23 +11225,23 @@ static int __Pyx_modinit_type_import_code(void) { /*--- Type import code ---*/ __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 9, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_ptype_7cpython_4type_type = __Pyx_ImportType_3_0_6(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", + __pyx_ptype_7cpython_4type_type = __Pyx_ImportType_3_0_9(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 - sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_6(PyTypeObject), + sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_9(PyTypeObject), #elif CYTHON_COMPILING_IN_LIMITED_API - sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_6(PyTypeObject), + sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_9(PyTypeObject), #else - sizeof(PyHeapTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_6(PyHeapTypeObject), + sizeof(PyHeapTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_9(PyHeapTypeObject), #endif - __Pyx_ImportType_CheckSize_Warn_3_0_6); if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(3, 9, __pyx_L1_error) + __Pyx_ImportType_CheckSize_Warn_3_0_9); if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(3, 9, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(4, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_ptype_7cpython_4bool_bool = __Pyx_ImportType_3_0_6(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "bool", sizeof(PyBoolObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_6(PyBoolObject),__Pyx_ImportType_CheckSize_Warn_3_0_6); if (!__pyx_ptype_7cpython_4bool_bool) __PYX_ERR(4, 8, __pyx_L1_error) + __pyx_ptype_7cpython_4bool_bool = __Pyx_ImportType_3_0_9(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "bool", sizeof(PyBoolObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_9(PyBoolObject),__Pyx_ImportType_CheckSize_Warn_3_0_9); if (!__pyx_ptype_7cpython_4bool_bool) __PYX_ERR(4, 8, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_ptype_7cpython_7complex_complex = __Pyx_ImportType_3_0_6(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "complex", sizeof(PyComplexObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_6(PyComplexObject),__Pyx_ImportType_CheckSize_Warn_3_0_6); if (!__pyx_ptype_7cpython_7complex_complex) __PYX_ERR(5, 15, __pyx_L1_error) + __pyx_ptype_7cpython_7complex_complex = __Pyx_ImportType_3_0_9(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "complex", sizeof(PyComplexObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_9(PyComplexObject),__Pyx_ImportType_CheckSize_Warn_3_0_9); if (!__pyx_ptype_7cpython_7complex_complex) __PYX_ERR(5, 15, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_RefNannyFinishContext(); return 0; @@ -11466,7 +11455,7 @@ static CYTHON_SMALL_CODE int __pyx_pymod_exec_bufferedreader(PyObject *__pyx_pyi __pyx_t_1 = PyModule_Create(&__pyx_moduledef); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) { int add_module_result = PyState_AddModule(__pyx_t_1, &__pyx_moduledef); - __pyx_t_1 = 0; /* transfer ownership from __pyx_t_1 to bufferedreader pseudovariable */ + __pyx_t_1 = 0; /* transfer ownership from __pyx_t_1 to "bufferedreader" pseudovariable */ if (unlikely((add_module_result < 0))) __PYX_ERR(0, 1, __pyx_L1_error) pystate_addmodule_run = 1; } @@ -12199,11 +12188,11 @@ static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyO { int eq = __Pyx_PyUnicode_Equals(s, PyTuple_GET_ITEM(kwnames, i), Py_EQ); if (unlikely(eq != 0)) { - if (unlikely(eq < 0)) return NULL; // error + if (unlikely(eq < 0)) return NULL; return kwvalues[i]; } } - return NULL; // not found (no exception set) + return NULL; } #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 CYTHON_UNUSED static PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues) { @@ -12290,7 +12279,7 @@ static int __Pyx_ParseOptionalKeywords( if (*name) { values[name-argnames] = value; #if CYTHON_AVOID_BORROWED_REFS - Py_INCREF(value); // transfer ownership of value to values + Py_INCREF(value); Py_DECREF(key); #endif key = NULL; @@ -12309,7 +12298,7 @@ static int __Pyx_ParseOptionalKeywords( && _PyString_Eq(**name, key)) { values[name-argnames] = value; #if CYTHON_AVOID_BORROWED_REFS - value = NULL; // ownership transferred to values + value = NULL; #endif break; } @@ -12341,7 +12330,7 @@ static int __Pyx_ParseOptionalKeywords( if (cmp == 0) { values[name-argnames] = value; #if CYTHON_AVOID_BORROWED_REFS - value = NULL; // ownership transferred to values + value = NULL; #endif break; } @@ -14034,10 +14023,10 @@ static int __Pyx_setup_reduce(PyObject* type_obj) { #endif /* TypeImport */ -#ifndef __PYX_HAVE_RT_ImportType_3_0_6 -#define __PYX_HAVE_RT_ImportType_3_0_6 -static PyTypeObject *__Pyx_ImportType_3_0_6(PyObject *module, const char *module_name, const char *class_name, - size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_6 check_size) +#ifndef __PYX_HAVE_RT_ImportType_3_0_9 +#define __PYX_HAVE_RT_ImportType_3_0_9 +static PyTypeObject *__Pyx_ImportType_3_0_9(PyObject *module, const char *module_name, const char *class_name, + size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_9 check_size) { PyObject *result = 0; char warning[200]; @@ -14091,7 +14080,7 @@ static PyTypeObject *__Pyx_ImportType_3_0_6(PyObject *module, const char *module module_name, class_name, size, basicsize+itemsize); goto bad; } - if (check_size == __Pyx_ImportType_CheckSize_Error_3_0_6 && + if (check_size == __Pyx_ImportType_CheckSize_Error_3_0_9 && ((size_t)basicsize > size || (size_t)(basicsize + itemsize) < size)) { PyErr_Format(PyExc_ValueError, "%.200s.%.200s size changed, may indicate binary incompatibility. " @@ -14099,7 +14088,7 @@ static PyTypeObject *__Pyx_ImportType_3_0_6(PyObject *module, const char *module module_name, class_name, size, basicsize, basicsize+itemsize); goto bad; } - else if (check_size == __Pyx_ImportType_CheckSize_Warn_3_0_6 && (size_t)basicsize > size) { + else if (check_size == __Pyx_ImportType_CheckSize_Warn_3_0_9 && (size_t)basicsize > size) { PyOS_snprintf(warning, sizeof(warning), "%s.%s size changed, may indicate binary incompatibility. " "Expected %zd from C header, got %zd from PyObject", @@ -15099,7 +15088,7 @@ static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, default: return NULL; } - return ((_PyCFunctionFastWithKeywords)(void(*)(void))def->ml_meth)(self, args, nargs, kwnames); + return ((__Pyx_PyCFunctionFastWithKeywords)(void(*)(void))def->ml_meth)(self, args, nargs, kwnames); } static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { @@ -15558,7 +15547,7 @@ static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( #else py_code = PyCode_NewEmpty(filename, funcname, py_line); #endif - Py_XDECREF(py_funcname); // XDECREF since it's only set on Py3 if cline + Py_XDECREF(py_funcname); return py_code; bad: Py_XDECREF(py_funcname); diff --git a/clickhouse_driver/bufferedwriter.c b/clickhouse_driver/bufferedwriter.c index a4494aa5..dc0744bb 100644 --- a/clickhouse_driver/bufferedwriter.c +++ b/clickhouse_driver/bufferedwriter.c @@ -1,4 +1,4 @@ -/* Generated by Cython 3.0.6 */ +/* Generated by Cython 3.0.9 */ /* BEGIN: Cython Metadata { @@ -54,10 +54,10 @@ END: Cython Metadata */ #else #define __PYX_EXTRA_ABI_MODULE_NAME "" #endif -#define CYTHON_ABI "3_0_6" __PYX_EXTRA_ABI_MODULE_NAME +#define CYTHON_ABI "3_0_9" __PYX_EXTRA_ABI_MODULE_NAME #define __PYX_ABI_MODULE_NAME "_cython_" CYTHON_ABI #define __PYX_TYPE_MODULE_PREFIX __PYX_ABI_MODULE_NAME "." -#define CYTHON_HEX_VERSION 0x030006F0 +#define CYTHON_HEX_VERSION 0x030009F0 #define CYTHON_FUTURE_DIVISION 1 #include #ifndef offsetof @@ -599,14 +599,14 @@ END: Cython Metadata */ PyObject *exception_table = NULL; PyObject *types_module=NULL, *code_type=NULL, *result=NULL; #if __PYX_LIMITED_VERSION_HEX < 0x030B0000 - PyObject *version_info; // borrowed + PyObject *version_info; PyObject *py_minor_version = NULL; #endif long minor_version = 0; PyObject *type, *value, *traceback; PyErr_Fetch(&type, &value, &traceback); #if __PYX_LIMITED_VERSION_HEX >= 0x030B0000 - minor_version = 11; // we don't yet need to distinguish between versions > 11 + minor_version = 11; #else if (!(version_info = PySys_GetObject("version_info"))) goto end; if (!(py_minor_version = PySequence_GetItem(version_info, 1))) goto end; @@ -664,7 +664,7 @@ END: Cython Metadata */ PyObject *fv, PyObject *cell, PyObject* fn, PyObject *name, int fline, PyObject *lnos) { PyCodeObject *result; - PyObject *empty_bytes = PyBytes_FromStringAndSize("", 0); // we don't have access to __pyx_empty_bytes here + PyObject *empty_bytes = PyBytes_FromStringAndSize("", 0); if (!empty_bytes) return NULL; result = #if PY_VERSION_HEX >= 0x030C0000 @@ -750,8 +750,13 @@ END: Cython Metadata */ typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames); #else - #define __Pyx_PyCFunctionFast _PyCFunctionFast - #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords + #if PY_VERSION_HEX >= 0x030d00A4 + # define __Pyx_PyCFunctionFast PyCFunctionFast + # define __Pyx_PyCFunctionFastWithKeywords PyCFunctionFastWithKeywords + #else + # define __Pyx_PyCFunctionFast _PyCFunctionFast + # define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords + #endif #endif #if CYTHON_METH_FASTCALL #define __Pyx_METH_FASTCALL METH_FASTCALL @@ -1103,7 +1108,7 @@ static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStrWithError(PyObject *dict, #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_Size(o) #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_Size(o) #endif -#if PY_VERSION_HEX >= 0x030d00A1 +#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 #define __Pyx_PyImport_AddModuleRef(name) PyImport_AddModuleRef(name) #else static CYTHON_INLINE PyObject *__Pyx_PyImport_AddModuleRef(const char *name) { @@ -1190,7 +1195,7 @@ static CYTHON_INLINE float __PYX_NAN() { #endif #define __PYX_MARK_ERR_POS(f_index, lineno) \ - { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } + { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } #define __PYX_ERR(f_index, lineno, Ln_error) \ { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } @@ -1297,24 +1302,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); #define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) #define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) #define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) -#if CYTHON_COMPILING_IN_LIMITED_API -static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const wchar_t *u) -{ - const wchar_t *u_end = u; - while (*u_end++) ; - return (size_t)(u_end - u - 1); -} -#else -static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) -{ - const Py_UNICODE *u_end = u; - while (*u_end++) ; - return (size_t)(u_end - u - 1); -} -#endif #define __Pyx_PyUnicode_FromOrdinal(o) PyUnicode_FromOrdinal((int)o) -#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) -#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode #define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode #define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) #define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) @@ -1364,7 +1352,7 @@ static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); #endif typedef Py_ssize_t __Pyx_compact_pylong; typedef size_t __Pyx_compact_upylong; - #else // Py < 3.12 + #else #define __Pyx_PyLong_IsNeg(x) (Py_SIZE(x) < 0) #define __Pyx_PyLong_IsNonNeg(x) (Py_SIZE(x) >= 0) #define __Pyx_PyLong_IsZero(x) (Py_SIZE(x) == 0) @@ -1484,11 +1472,11 @@ static const char *__pyx_filename; static const char *__pyx_f[] = { "clickhouse_driver/bufferedwriter.pyx", - "venv/lib/python3.10/site-packages/Cython/Includes/cpython/contextvars.pxd", + "chenv/lib/python3.10/site-packages/Cython/Includes/cpython/contextvars.pxd", "", - "venv/lib/python3.10/site-packages/Cython/Includes/cpython/type.pxd", - "venv/lib/python3.10/site-packages/Cython/Includes/cpython/bool.pxd", - "venv/lib/python3.10/site-packages/Cython/Includes/cpython/complex.pxd", + "chenv/lib/python3.10/site-packages/Cython/Includes/cpython/type.pxd", + "chenv/lib/python3.10/site-packages/Cython/Includes/cpython/bool.pxd", + "chenv/lib/python3.10/site-packages/Cython/Includes/cpython/complex.pxd", }; /* #### Code section: utility_code_proto_before_types ### */ /* ForceInitThreads.proto */ @@ -1547,7 +1535,7 @@ struct __pyx_obj_17clickhouse_driver_14bufferedwriter_BufferedWriter { }; -/* "clickhouse_driver/bufferedwriter.pyx":120 +/* "clickhouse_driver/bufferedwriter.pyx":119 * * * cdef class BufferedSocketWriter(BufferedWriter): # <<<<<<<<<<<<<< @@ -1560,7 +1548,7 @@ struct __pyx_obj_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter { }; -/* "clickhouse_driver/bufferedwriter.pyx":134 +/* "clickhouse_driver/bufferedwriter.pyx":133 * * * cdef class CompressedBufferedWriter(BufferedWriter): # <<<<<<<<<<<<<< @@ -1589,7 +1577,7 @@ struct __pyx_vtabstruct_17clickhouse_driver_14bufferedwriter_BufferedWriter { static struct __pyx_vtabstruct_17clickhouse_driver_14bufferedwriter_BufferedWriter *__pyx_vtabptr_17clickhouse_driver_14bufferedwriter_BufferedWriter; -/* "clickhouse_driver/bufferedwriter.pyx":120 +/* "clickhouse_driver/bufferedwriter.pyx":119 * * * cdef class BufferedSocketWriter(BufferedWriter): # <<<<<<<<<<<<<< @@ -1603,7 +1591,7 @@ struct __pyx_vtabstruct_17clickhouse_driver_14bufferedwriter_BufferedSocketWrite static struct __pyx_vtabstruct_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter *__pyx_vtabptr_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter; -/* "clickhouse_driver/bufferedwriter.pyx":134 +/* "clickhouse_driver/bufferedwriter.pyx":133 * * * cdef class CompressedBufferedWriter(BufferedWriter): # <<<<<<<<<<<<<< @@ -1788,8 +1776,8 @@ static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int #define __Pyx_Arg_NewRef_VARARGS(arg) __Pyx_NewRef(arg) #define __Pyx_Arg_XDECREF_VARARGS(arg) Py_XDECREF(arg) #else - #define __Pyx_Arg_NewRef_VARARGS(arg) arg // no-op - #define __Pyx_Arg_XDECREF_VARARGS(arg) // no-op - arg is borrowed + #define __Pyx_Arg_NewRef_VARARGS(arg) arg + #define __Pyx_Arg_XDECREF_VARARGS(arg) #endif #define __Pyx_NumKwargs_VARARGS(kwds) PyDict_Size(kwds) #define __Pyx_KwValues_VARARGS(args, nargs) NULL @@ -1805,8 +1793,9 @@ static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int #else #define __Pyx_KwargsAsDict_FASTCALL(kw, kwvalues) _PyStack_AsDict(kwvalues, kw) #endif - #define __Pyx_Arg_NewRef_FASTCALL(arg) arg // no-op, __Pyx_Arg_FASTCALL is direct and this needs - #define __Pyx_Arg_XDECREF_FASTCALL(arg) // no-op - arg was returned from array + #define __Pyx_Arg_NewRef_FASTCALL(arg) arg /* no-op, __Pyx_Arg_FASTCALL is direct and this needs + to have the same reference counting */ + #define __Pyx_Arg_XDECREF_FASTCALL(arg) #else #define __Pyx_Arg_FASTCALL __Pyx_Arg_VARARGS #define __Pyx_NumKwargs_FASTCALL __Pyx_NumKwargs_VARARGS @@ -2088,22 +2077,22 @@ static int __Pyx_setup_reduce(PyObject* type_obj); #endif /* TypeImport.proto */ -#ifndef __PYX_HAVE_RT_ImportType_proto_3_0_6 -#define __PYX_HAVE_RT_ImportType_proto_3_0_6 +#ifndef __PYX_HAVE_RT_ImportType_proto_3_0_9 +#define __PYX_HAVE_RT_ImportType_proto_3_0_9 #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L #include #endif #if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || __cplusplus >= 201103L -#define __PYX_GET_STRUCT_ALIGNMENT_3_0_6(s) alignof(s) +#define __PYX_GET_STRUCT_ALIGNMENT_3_0_9(s) alignof(s) #else -#define __PYX_GET_STRUCT_ALIGNMENT_3_0_6(s) sizeof(void*) +#define __PYX_GET_STRUCT_ALIGNMENT_3_0_9(s) sizeof(void*) #endif -enum __Pyx_ImportType_CheckSize_3_0_6 { - __Pyx_ImportType_CheckSize_Error_3_0_6 = 0, - __Pyx_ImportType_CheckSize_Warn_3_0_6 = 1, - __Pyx_ImportType_CheckSize_Ignore_3_0_6 = 2 +enum __Pyx_ImportType_CheckSize_3_0_9 { + __Pyx_ImportType_CheckSize_Error_3_0_9 = 0, + __Pyx_ImportType_CheckSize_Warn_3_0_9 = 1, + __Pyx_ImportType_CheckSize_Ignore_3_0_9 = 2 }; -static PyTypeObject *__Pyx_ImportType_3_0_6(PyObject* module, const char *module_name, const char *class_name, size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_6 check_size); +static PyTypeObject *__Pyx_ImportType_3_0_9(PyObject* module, const char *module_name, const char *class_name, size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_9 check_size); #endif /* FetchSharedCythonModule.proto */ @@ -2196,7 +2185,7 @@ typedef struct { #endif void *defaults; int defaults_pyobjects; - size_t defaults_size; // used by FusedFunction for copying defaults + size_t defaults_size; int flags; PyObject *defaults_tuple; PyObject *defaults_kwdict; @@ -5968,7 +5957,7 @@ static PyObject *__pyx_pf_17clickhouse_driver_14bufferedwriter_14BufferedWriter_ * * memcpy(&items_buf[buf_pos], c_value, value_len) # <<<<<<<<<<<<<< * buf_pos += length - * + * try: */ (void)(memcpy((&(__pyx_v_items_buf[__pyx_v_buf_pos])), __pyx_v_c_value, __pyx_v_value_len)); @@ -5976,8 +5965,8 @@ static PyObject *__pyx_pf_17clickhouse_driver_14bufferedwriter_14BufferedWriter_ * * memcpy(&items_buf[buf_pos], c_value, value_len) * buf_pos += length # <<<<<<<<<<<<<< - * * try: + * self.write(PyBytes_FromStringAndSize(items_buf, items_buf_size)) */ __pyx_v_buf_pos = (__pyx_v_buf_pos + __pyx_v_length); @@ -5991,31 +5980,31 @@ static PyObject *__pyx_pf_17clickhouse_driver_14bufferedwriter_14BufferedWriter_ } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - /* "clickhouse_driver/bufferedwriter.pyx":114 + /* "clickhouse_driver/bufferedwriter.pyx":113 + * memcpy(&items_buf[buf_pos], c_value, value_len) * buf_pos += length - * * try: # <<<<<<<<<<<<<< * self.write(PyBytes_FromStringAndSize(items_buf, items_buf_size)) * finally: */ /*try:*/ { - /* "clickhouse_driver/bufferedwriter.pyx":115 - * + /* "clickhouse_driver/bufferedwriter.pyx":114 + * buf_pos += length * try: * self.write(PyBytes_FromStringAndSize(items_buf, items_buf_size)) # <<<<<<<<<<<<<< * finally: * PyMem_Free(items_buf) */ - __pyx_t_2 = PyBytes_FromStringAndSize(__pyx_v_items_buf, __pyx_v_items_buf_size); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 115, __pyx_L11_error) + __pyx_t_2 = PyBytes_FromStringAndSize(__pyx_v_items_buf, __pyx_v_items_buf_size); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 114, __pyx_L11_error) __Pyx_GOTREF(__pyx_t_2); - __pyx_t_3 = ((struct __pyx_vtabstruct_17clickhouse_driver_14bufferedwriter_BufferedWriter *)__pyx_v_self->__pyx_vtab)->write(__pyx_v_self, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 115, __pyx_L11_error) + __pyx_t_3 = ((struct __pyx_vtabstruct_17clickhouse_driver_14bufferedwriter_BufferedWriter *)__pyx_v_self->__pyx_vtab)->write(__pyx_v_self, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 114, __pyx_L11_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } - /* "clickhouse_driver/bufferedwriter.pyx":117 + /* "clickhouse_driver/bufferedwriter.pyx":116 * self.write(PyBytes_FromStringAndSize(items_buf, items_buf_size)) * finally: * PyMem_Free(items_buf) # <<<<<<<<<<<<<< @@ -6504,7 +6493,7 @@ static PyObject *__pyx_pf_17clickhouse_driver_14bufferedwriter_14BufferedWriter_ return __pyx_r; } -/* "clickhouse_driver/bufferedwriter.pyx":123 +/* "clickhouse_driver/bufferedwriter.pyx":122 * cdef object sock * * def __init__(self, sock, bufsize): # <<<<<<<<<<<<<< @@ -6551,7 +6540,7 @@ static int __pyx_pw_17clickhouse_driver_14bufferedwriter_20BufferedSocketWriter_ (void)__Pyx_Arg_NewRef_VARARGS(values[0]); kw_args--; } - else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L3_error) + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 122, __pyx_L3_error) else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: @@ -6559,14 +6548,14 @@ static int __pyx_pw_17clickhouse_driver_14bufferedwriter_20BufferedSocketWriter_ (void)__Pyx_Arg_NewRef_VARARGS(values[1]); kw_args--; } - else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 123, __pyx_L3_error) + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 122, __pyx_L3_error) else { - __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, 1); __PYX_ERR(0, 123, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, 1); __PYX_ERR(0, 122, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { const Py_ssize_t kwd_pos_args = __pyx_nargs; - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__init__") < 0)) __PYX_ERR(0, 123, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__init__") < 0)) __PYX_ERR(0, 122, __pyx_L3_error) } } else if (unlikely(__pyx_nargs != 2)) { goto __pyx_L5_argtuple_error; @@ -6579,7 +6568,7 @@ static int __pyx_pw_17clickhouse_driver_14bufferedwriter_20BufferedSocketWriter_ } goto __pyx_L6_skip; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 123, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 122, __pyx_L3_error) __pyx_L6_skip:; goto __pyx_L4_argument_unpacking_done; __pyx_L3_error:; @@ -6618,7 +6607,7 @@ static int __pyx_pf_17clickhouse_driver_14bufferedwriter_20BufferedSocketWriter_ int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__init__", 1); - /* "clickhouse_driver/bufferedwriter.pyx":124 + /* "clickhouse_driver/bufferedwriter.pyx":123 * * def __init__(self, sock, bufsize): * self.sock = sock # <<<<<<<<<<<<<< @@ -6631,25 +6620,25 @@ static int __pyx_pf_17clickhouse_driver_14bufferedwriter_20BufferedSocketWriter_ __Pyx_DECREF(__pyx_v_self->sock); __pyx_v_self->sock = __pyx_v_sock; - /* "clickhouse_driver/bufferedwriter.pyx":125 + /* "clickhouse_driver/bufferedwriter.pyx":124 * def __init__(self, sock, bufsize): * self.sock = sock * super(BufferedSocketWriter, self).__init__(bufsize) # <<<<<<<<<<<<<< * * cpdef write_into_stream(self): */ - __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 125, __pyx_L1_error) + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 124, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF((PyObject *)__pyx_ptype_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter); __Pyx_GIVEREF((PyObject *)__pyx_ptype_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_ptype_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter))) __PYX_ERR(0, 125, __pyx_L1_error); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_ptype_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter))) __PYX_ERR(0, 124, __pyx_L1_error); __Pyx_INCREF((PyObject *)__pyx_v_self); __Pyx_GIVEREF((PyObject *)__pyx_v_self); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_self))) __PYX_ERR(0, 125, __pyx_L1_error); - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_super, __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 125, __pyx_L1_error) + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_self))) __PYX_ERR(0, 124, __pyx_L1_error); + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_super, __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 124, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_init); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 125, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_init); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 124, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = NULL; @@ -6670,13 +6659,13 @@ static int __pyx_pf_17clickhouse_driver_14bufferedwriter_20BufferedSocketWriter_ PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_v_bufsize}; __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 125, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 124, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "clickhouse_driver/bufferedwriter.pyx":123 + /* "clickhouse_driver/bufferedwriter.pyx":122 * cdef object sock * * def __init__(self, sock, bufsize): # <<<<<<<<<<<<<< @@ -6698,7 +6687,7 @@ static int __pyx_pf_17clickhouse_driver_14bufferedwriter_20BufferedSocketWriter_ return __pyx_r; } -/* "clickhouse_driver/bufferedwriter.pyx":127 +/* "clickhouse_driver/bufferedwriter.pyx":126 * super(BufferedSocketWriter, self).__init__(bufsize) * * cpdef write_into_stream(self): # <<<<<<<<<<<<<< @@ -6734,7 +6723,7 @@ static PyObject *__pyx_f_17clickhouse_driver_14bufferedwriter_20BufferedSocketWr if (unlikely(!__Pyx_object_dict_version_matches(((PyObject *)__pyx_v_self), __pyx_tp_dict_version, __pyx_obj_dict_version))) { PY_UINT64_T __pyx_typedict_guard = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self)); #endif - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_write_into_stream); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 127, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_write_into_stream); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 126, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (!__Pyx_IsSameCFunction(__pyx_t_1, (void*) __pyx_pw_17clickhouse_driver_14bufferedwriter_20BufferedSocketWriter_3write_into_stream)) { __Pyx_XDECREF(__pyx_r); @@ -6757,7 +6746,7 @@ static PyObject *__pyx_f_17clickhouse_driver_14bufferedwriter_20BufferedSocketWr PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL}; __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 127, __pyx_L1_error) + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 126, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } @@ -6779,24 +6768,24 @@ static PyObject *__pyx_f_17clickhouse_driver_14bufferedwriter_20BufferedSocketWr #endif } - /* "clickhouse_driver/bufferedwriter.pyx":128 + /* "clickhouse_driver/bufferedwriter.pyx":127 * * cpdef write_into_stream(self): * self.sock.sendall( # <<<<<<<<<<<<<< * PyBytes_FromStringAndSize(self.buffer, self.position) * ) */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->sock, __pyx_n_s_sendall); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 128, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->sock, __pyx_n_s_sendall); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 127, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - /* "clickhouse_driver/bufferedwriter.pyx":129 + /* "clickhouse_driver/bufferedwriter.pyx":128 * cpdef write_into_stream(self): * self.sock.sendall( * PyBytes_FromStringAndSize(self.buffer, self.position) # <<<<<<<<<<<<<< * ) * self.position = 0 */ - __pyx_t_3 = PyBytes_FromStringAndSize(__pyx_v_self->__pyx_base.buffer, __pyx_v_self->__pyx_base.position); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 129, __pyx_L1_error) + __pyx_t_3 = PyBytes_FromStringAndSize(__pyx_v_self->__pyx_base.buffer, __pyx_v_self->__pyx_base.position); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 128, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = NULL; __pyx_t_5 = 0; @@ -6817,13 +6806,13 @@ static PyObject *__pyx_f_17clickhouse_driver_14bufferedwriter_20BufferedSocketWr __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 128, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 127, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "clickhouse_driver/bufferedwriter.pyx":131 + /* "clickhouse_driver/bufferedwriter.pyx":130 * PyBytes_FromStringAndSize(self.buffer, self.position) * ) * self.position = 0 # <<<<<<<<<<<<<< @@ -6832,7 +6821,7 @@ static PyObject *__pyx_f_17clickhouse_driver_14bufferedwriter_20BufferedSocketWr */ __pyx_v_self->__pyx_base.position = 0; - /* "clickhouse_driver/bufferedwriter.pyx":127 + /* "clickhouse_driver/bufferedwriter.pyx":126 * super(BufferedSocketWriter, self).__init__(bufsize) * * cpdef write_into_stream(self): # <<<<<<<<<<<<<< @@ -6906,7 +6895,7 @@ static PyObject *__pyx_pf_17clickhouse_driver_14bufferedwriter_20BufferedSocketW int __pyx_clineno = 0; __Pyx_RefNannySetupContext("write_into_stream", 1); __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __pyx_f_17clickhouse_driver_14bufferedwriter_20BufferedSocketWriter_write_into_stream(__pyx_v_self, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 127, __pyx_L1_error) + __pyx_t_1 = __pyx_f_17clickhouse_driver_14bufferedwriter_20BufferedSocketWriter_write_into_stream(__pyx_v_self, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 126, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; @@ -7341,7 +7330,7 @@ static PyObject *__pyx_pf_17clickhouse_driver_14bufferedwriter_20BufferedSocketW return __pyx_r; } -/* "clickhouse_driver/bufferedwriter.pyx":137 +/* "clickhouse_driver/bufferedwriter.pyx":136 * cdef object compressor * * def __init__(self, compressor, bufsize): # <<<<<<<<<<<<<< @@ -7388,7 +7377,7 @@ static int __pyx_pw_17clickhouse_driver_14bufferedwriter_24CompressedBufferedWri (void)__Pyx_Arg_NewRef_VARARGS(values[0]); kw_args--; } - else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 137, __pyx_L3_error) + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 136, __pyx_L3_error) else goto __pyx_L5_argtuple_error; CYTHON_FALLTHROUGH; case 1: @@ -7396,14 +7385,14 @@ static int __pyx_pw_17clickhouse_driver_14bufferedwriter_24CompressedBufferedWri (void)__Pyx_Arg_NewRef_VARARGS(values[1]); kw_args--; } - else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 137, __pyx_L3_error) + else if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 136, __pyx_L3_error) else { - __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, 1); __PYX_ERR(0, 137, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, 1); __PYX_ERR(0, 136, __pyx_L3_error) } } if (unlikely(kw_args > 0)) { const Py_ssize_t kwd_pos_args = __pyx_nargs; - if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__init__") < 0)) __PYX_ERR(0, 137, __pyx_L3_error) + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_kwvalues, __pyx_pyargnames, 0, values + 0, kwd_pos_args, "__init__") < 0)) __PYX_ERR(0, 136, __pyx_L3_error) } } else if (unlikely(__pyx_nargs != 2)) { goto __pyx_L5_argtuple_error; @@ -7416,7 +7405,7 @@ static int __pyx_pw_17clickhouse_driver_14bufferedwriter_24CompressedBufferedWri } goto __pyx_L6_skip; __pyx_L5_argtuple_error:; - __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 137, __pyx_L3_error) + __Pyx_RaiseArgtupleInvalid("__init__", 1, 2, 2, __pyx_nargs); __PYX_ERR(0, 136, __pyx_L3_error) __pyx_L6_skip:; goto __pyx_L4_argument_unpacking_done; __pyx_L3_error:; @@ -7455,7 +7444,7 @@ static int __pyx_pf_17clickhouse_driver_14bufferedwriter_24CompressedBufferedWri int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__init__", 1); - /* "clickhouse_driver/bufferedwriter.pyx":138 + /* "clickhouse_driver/bufferedwriter.pyx":137 * * def __init__(self, compressor, bufsize): * self.compressor = compressor # <<<<<<<<<<<<<< @@ -7468,25 +7457,25 @@ static int __pyx_pf_17clickhouse_driver_14bufferedwriter_24CompressedBufferedWri __Pyx_DECREF(__pyx_v_self->compressor); __pyx_v_self->compressor = __pyx_v_compressor; - /* "clickhouse_driver/bufferedwriter.pyx":139 + /* "clickhouse_driver/bufferedwriter.pyx":138 * def __init__(self, compressor, bufsize): * self.compressor = compressor * super(CompressedBufferedWriter, self).__init__(bufsize) # <<<<<<<<<<<<<< * * cpdef write_into_stream(self): */ - __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 139, __pyx_L1_error) + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 138, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF((PyObject *)__pyx_ptype_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter); __Pyx_GIVEREF((PyObject *)__pyx_ptype_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_ptype_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter))) __PYX_ERR(0, 139, __pyx_L1_error); + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_ptype_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter))) __PYX_ERR(0, 138, __pyx_L1_error); __Pyx_INCREF((PyObject *)__pyx_v_self); __Pyx_GIVEREF((PyObject *)__pyx_v_self); - if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_self))) __PYX_ERR(0, 139, __pyx_L1_error); - __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_super, __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 139, __pyx_L1_error) + if (__Pyx_PyTuple_SET_ITEM(__pyx_t_2, 1, ((PyObject *)__pyx_v_self))) __PYX_ERR(0, 138, __pyx_L1_error); + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_super, __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 138, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_init); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 139, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_3, __pyx_n_s_init); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 138, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = NULL; @@ -7507,13 +7496,13 @@ static int __pyx_pf_17clickhouse_driver_14bufferedwriter_24CompressedBufferedWri PyObject *__pyx_callargs[2] = {__pyx_t_3, __pyx_v_bufsize}; __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_4, 1+__pyx_t_4); __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 139, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 138, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "clickhouse_driver/bufferedwriter.pyx":137 + /* "clickhouse_driver/bufferedwriter.pyx":136 * cdef object compressor * * def __init__(self, compressor, bufsize): # <<<<<<<<<<<<<< @@ -7535,7 +7524,7 @@ static int __pyx_pf_17clickhouse_driver_14bufferedwriter_24CompressedBufferedWri return __pyx_r; } -/* "clickhouse_driver/bufferedwriter.pyx":141 +/* "clickhouse_driver/bufferedwriter.pyx":140 * super(CompressedBufferedWriter, self).__init__(bufsize) * * cpdef write_into_stream(self): # <<<<<<<<<<<<<< @@ -7571,7 +7560,7 @@ static PyObject *__pyx_f_17clickhouse_driver_14bufferedwriter_24CompressedBuffer if (unlikely(!__Pyx_object_dict_version_matches(((PyObject *)__pyx_v_self), __pyx_tp_dict_version, __pyx_obj_dict_version))) { PY_UINT64_T __pyx_typedict_guard = __Pyx_get_tp_dict_version(((PyObject *)__pyx_v_self)); #endif - __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_write_into_stream); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 141, __pyx_L1_error) + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_write_into_stream); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 140, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); if (!__Pyx_IsSameCFunction(__pyx_t_1, (void*) __pyx_pw_17clickhouse_driver_14bufferedwriter_24CompressedBufferedWriter_3write_into_stream)) { __Pyx_XDECREF(__pyx_r); @@ -7594,7 +7583,7 @@ static PyObject *__pyx_f_17clickhouse_driver_14bufferedwriter_24CompressedBuffer PyObject *__pyx_callargs[2] = {__pyx_t_4, NULL}; __pyx_t_2 = __Pyx_PyObject_FastCall(__pyx_t_3, __pyx_callargs+1-__pyx_t_5, 0+__pyx_t_5); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; - if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 141, __pyx_L1_error) + if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 140, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; } @@ -7616,24 +7605,24 @@ static PyObject *__pyx_f_17clickhouse_driver_14bufferedwriter_24CompressedBuffer #endif } - /* "clickhouse_driver/bufferedwriter.pyx":142 + /* "clickhouse_driver/bufferedwriter.pyx":141 * * cpdef write_into_stream(self): * self.compressor.write( # <<<<<<<<<<<<<< * PyBytes_FromStringAndSize(self.buffer, self.position) * ) */ - __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->compressor, __pyx_n_s_write); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 142, __pyx_L1_error) + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->compressor, __pyx_n_s_write); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 141, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - /* "clickhouse_driver/bufferedwriter.pyx":143 + /* "clickhouse_driver/bufferedwriter.pyx":142 * cpdef write_into_stream(self): * self.compressor.write( * PyBytes_FromStringAndSize(self.buffer, self.position) # <<<<<<<<<<<<<< * ) * self.position = 0 */ - __pyx_t_3 = PyBytes_FromStringAndSize(__pyx_v_self->__pyx_base.buffer, __pyx_v_self->__pyx_base.position); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 143, __pyx_L1_error) + __pyx_t_3 = PyBytes_FromStringAndSize(__pyx_v_self->__pyx_base.buffer, __pyx_v_self->__pyx_base.position); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 142, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = NULL; __pyx_t_5 = 0; @@ -7654,13 +7643,13 @@ static PyObject *__pyx_f_17clickhouse_driver_14bufferedwriter_24CompressedBuffer __pyx_t_1 = __Pyx_PyObject_FastCall(__pyx_t_2, __pyx_callargs+1-__pyx_t_5, 1+__pyx_t_5); __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; - if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 142, __pyx_L1_error) + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 141, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "clickhouse_driver/bufferedwriter.pyx":145 + /* "clickhouse_driver/bufferedwriter.pyx":144 * PyBytes_FromStringAndSize(self.buffer, self.position) * ) * self.position = 0 # <<<<<<<<<<<<<< @@ -7669,7 +7658,7 @@ static PyObject *__pyx_f_17clickhouse_driver_14bufferedwriter_24CompressedBuffer */ __pyx_v_self->__pyx_base.position = 0; - /* "clickhouse_driver/bufferedwriter.pyx":141 + /* "clickhouse_driver/bufferedwriter.pyx":140 * super(CompressedBufferedWriter, self).__init__(bufsize) * * cpdef write_into_stream(self): # <<<<<<<<<<<<<< @@ -7743,7 +7732,7 @@ static PyObject *__pyx_pf_17clickhouse_driver_14bufferedwriter_24CompressedBuffe int __pyx_clineno = 0; __Pyx_RefNannySetupContext("write_into_stream", 1); __Pyx_XDECREF(__pyx_r); - __pyx_t_1 = __pyx_f_17clickhouse_driver_14bufferedwriter_24CompressedBufferedWriter_write_into_stream(__pyx_v_self, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 141, __pyx_L1_error) + __pyx_t_1 = __pyx_f_17clickhouse_driver_14bufferedwriter_24CompressedBufferedWriter_write_into_stream(__pyx_v_self, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 140, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; @@ -7760,7 +7749,7 @@ static PyObject *__pyx_pf_17clickhouse_driver_14bufferedwriter_24CompressedBuffe return __pyx_r; } -/* "clickhouse_driver/bufferedwriter.pyx":147 +/* "clickhouse_driver/bufferedwriter.pyx":146 * self.position = 0 * * def flush(self): # <<<<<<<<<<<<<< @@ -7817,16 +7806,16 @@ static PyObject *__pyx_pf_17clickhouse_driver_14bufferedwriter_24CompressedBuffe int __pyx_clineno = 0; __Pyx_RefNannySetupContext("flush", 1); - /* "clickhouse_driver/bufferedwriter.pyx":148 + /* "clickhouse_driver/bufferedwriter.pyx":147 * * def flush(self): * self.write_into_stream() # <<<<<<<<<<<<<< */ - __pyx_t_1 = ((struct __pyx_vtabstruct_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base.write_into_stream(((struct __pyx_obj_17clickhouse_driver_14bufferedwriter_BufferedWriter *)__pyx_v_self), 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 148, __pyx_L1_error) + __pyx_t_1 = ((struct __pyx_vtabstruct_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base.write_into_stream(((struct __pyx_obj_17clickhouse_driver_14bufferedwriter_BufferedWriter *)__pyx_v_self), 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 147, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; - /* "clickhouse_driver/bufferedwriter.pyx":147 + /* "clickhouse_driver/bufferedwriter.pyx":146 * self.position = 0 * * def flush(self): # <<<<<<<<<<<<<< @@ -10377,14 +10366,14 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { __Pyx_GIVEREF(__pyx_tuple__21); __pyx_codeobj__22 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__21, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 16, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__22)) __PYX_ERR(2, 16, __pyx_L1_error) - /* "clickhouse_driver/bufferedwriter.pyx":127 + /* "clickhouse_driver/bufferedwriter.pyx":126 * super(BufferedSocketWriter, self).__init__(bufsize) * * cpdef write_into_stream(self): # <<<<<<<<<<<<<< * self.sock.sendall( * PyBytes_FromStringAndSize(self.buffer, self.position) */ - __pyx_codeobj__23 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__7, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_clickhouse_driver_bufferedwriter, __pyx_n_s_write_into_stream, 127, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__23)) __PYX_ERR(0, 127, __pyx_L1_error) + __pyx_codeobj__23 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__7, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_clickhouse_driver_bufferedwriter, __pyx_n_s_write_into_stream, 126, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__23)) __PYX_ERR(0, 126, __pyx_L1_error) /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< @@ -10401,22 +10390,22 @@ static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { */ __pyx_codeobj__25 = (PyObject*)__Pyx_PyCode_New(2, 0, 0, 2, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__21, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_setstate_cython, 16, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__25)) __PYX_ERR(2, 16, __pyx_L1_error) - /* "clickhouse_driver/bufferedwriter.pyx":141 + /* "clickhouse_driver/bufferedwriter.pyx":140 * super(CompressedBufferedWriter, self).__init__(bufsize) * * cpdef write_into_stream(self): # <<<<<<<<<<<<<< * self.compressor.write( * PyBytes_FromStringAndSize(self.buffer, self.position) */ - __pyx_codeobj__26 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__7, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_clickhouse_driver_bufferedwriter, __pyx_n_s_write_into_stream, 141, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__26)) __PYX_ERR(0, 141, __pyx_L1_error) + __pyx_codeobj__26 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__7, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_clickhouse_driver_bufferedwriter, __pyx_n_s_write_into_stream, 140, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__26)) __PYX_ERR(0, 140, __pyx_L1_error) - /* "clickhouse_driver/bufferedwriter.pyx":147 + /* "clickhouse_driver/bufferedwriter.pyx":146 * self.position = 0 * * def flush(self): # <<<<<<<<<<<<<< * self.write_into_stream() */ - __pyx_codeobj__27 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__7, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_clickhouse_driver_bufferedwriter, __pyx_n_s_flush, 147, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__27)) __PYX_ERR(0, 147, __pyx_L1_error) + __pyx_codeobj__27 = (PyObject*)__Pyx_PyCode_New(1, 0, 0, 1, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__7, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_clickhouse_driver_bufferedwriter, __pyx_n_s_flush, 146, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__27)) __PYX_ERR(0, 146, __pyx_L1_error) /* "(tree fragment)":1 * def __reduce_cython__(self): # <<<<<<<<<<<<<< @@ -10548,12 +10537,12 @@ static int __Pyx_modinit_type_init_code(void) { __pyx_vtable_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter.__pyx_base = *__pyx_vtabptr_17clickhouse_driver_14bufferedwriter_BufferedWriter; __pyx_vtable_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter.__pyx_base.write_into_stream = (PyObject *(*)(struct __pyx_obj_17clickhouse_driver_14bufferedwriter_BufferedWriter *, int __pyx_skip_dispatch))__pyx_f_17clickhouse_driver_14bufferedwriter_20BufferedSocketWriter_write_into_stream; #if CYTHON_USE_TYPE_SPECS - __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_ptype_17clickhouse_driver_14bufferedwriter_BufferedWriter); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 120, __pyx_L1_error) + __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_ptype_17clickhouse_driver_14bufferedwriter_BufferedWriter); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 119, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_ptype_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter_spec, __pyx_t_1); __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; - if (unlikely(!__pyx_ptype_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter)) __PYX_ERR(0, 120, __pyx_L1_error) - if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter_spec, __pyx_ptype_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter) < 0) __PYX_ERR(0, 120, __pyx_L1_error) + if (unlikely(!__pyx_ptype_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter)) __PYX_ERR(0, 119, __pyx_L1_error) + if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter_spec, __pyx_ptype_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter) < 0) __PYX_ERR(0, 119, __pyx_L1_error) #else __pyx_ptype_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter = &__pyx_type_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter; #endif @@ -10561,7 +10550,7 @@ static int __Pyx_modinit_type_init_code(void) { __pyx_ptype_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter->tp_base = __pyx_ptype_17clickhouse_driver_14bufferedwriter_BufferedWriter; #endif #if !CYTHON_USE_TYPE_SPECS - if (__Pyx_PyType_Ready(__pyx_ptype_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter) < 0) __PYX_ERR(0, 120, __pyx_L1_error) + if (__Pyx_PyType_Ready(__pyx_ptype_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter) < 0) __PYX_ERR(0, 119, __pyx_L1_error) #endif #if PY_MAJOR_VERSION < 3 __pyx_ptype_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter->tp_print = 0; @@ -10571,24 +10560,24 @@ static int __Pyx_modinit_type_init_code(void) { __pyx_ptype_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter->tp_getattro = __Pyx_PyObject_GenericGetAttr; } #endif - if (__Pyx_SetVtable(__pyx_ptype_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter, __pyx_vtabptr_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter) < 0) __PYX_ERR(0, 120, __pyx_L1_error) + if (__Pyx_SetVtable(__pyx_ptype_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter, __pyx_vtabptr_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter) < 0) __PYX_ERR(0, 119, __pyx_L1_error) #if !CYTHON_COMPILING_IN_LIMITED_API - if (__Pyx_MergeVtables(__pyx_ptype_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter) < 0) __PYX_ERR(0, 120, __pyx_L1_error) + if (__Pyx_MergeVtables(__pyx_ptype_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter) < 0) __PYX_ERR(0, 119, __pyx_L1_error) #endif - if (PyObject_SetAttr(__pyx_m, __pyx_n_s_BufferedSocketWriter, (PyObject *) __pyx_ptype_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter) < 0) __PYX_ERR(0, 120, __pyx_L1_error) + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_BufferedSocketWriter, (PyObject *) __pyx_ptype_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter) < 0) __PYX_ERR(0, 119, __pyx_L1_error) #if !CYTHON_COMPILING_IN_LIMITED_API - if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter) < 0) __PYX_ERR(0, 120, __pyx_L1_error) + if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter) < 0) __PYX_ERR(0, 119, __pyx_L1_error) #endif __pyx_vtabptr_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter = &__pyx_vtable_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter; __pyx_vtable_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter.__pyx_base = *__pyx_vtabptr_17clickhouse_driver_14bufferedwriter_BufferedWriter; __pyx_vtable_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter.__pyx_base.write_into_stream = (PyObject *(*)(struct __pyx_obj_17clickhouse_driver_14bufferedwriter_BufferedWriter *, int __pyx_skip_dispatch))__pyx_f_17clickhouse_driver_14bufferedwriter_24CompressedBufferedWriter_write_into_stream; #if CYTHON_USE_TYPE_SPECS - __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_ptype_17clickhouse_driver_14bufferedwriter_BufferedWriter); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 134, __pyx_L1_error) + __pyx_t_1 = PyTuple_Pack(1, (PyObject *)__pyx_ptype_17clickhouse_driver_14bufferedwriter_BufferedWriter); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 133, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); __pyx_ptype_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter = (PyTypeObject *) __Pyx_PyType_FromModuleAndSpec(__pyx_m, &__pyx_type_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter_spec, __pyx_t_1); __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; - if (unlikely(!__pyx_ptype_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter)) __PYX_ERR(0, 134, __pyx_L1_error) - if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter_spec, __pyx_ptype_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter) < 0) __PYX_ERR(0, 134, __pyx_L1_error) + if (unlikely(!__pyx_ptype_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter)) __PYX_ERR(0, 133, __pyx_L1_error) + if (__Pyx_fix_up_extension_type_from_spec(&__pyx_type_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter_spec, __pyx_ptype_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter) < 0) __PYX_ERR(0, 133, __pyx_L1_error) #else __pyx_ptype_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter = &__pyx_type_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter; #endif @@ -10596,7 +10585,7 @@ static int __Pyx_modinit_type_init_code(void) { __pyx_ptype_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter->tp_base = __pyx_ptype_17clickhouse_driver_14bufferedwriter_BufferedWriter; #endif #if !CYTHON_USE_TYPE_SPECS - if (__Pyx_PyType_Ready(__pyx_ptype_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter) < 0) __PYX_ERR(0, 134, __pyx_L1_error) + if (__Pyx_PyType_Ready(__pyx_ptype_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter) < 0) __PYX_ERR(0, 133, __pyx_L1_error) #endif #if PY_MAJOR_VERSION < 3 __pyx_ptype_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter->tp_print = 0; @@ -10606,13 +10595,13 @@ static int __Pyx_modinit_type_init_code(void) { __pyx_ptype_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter->tp_getattro = __Pyx_PyObject_GenericGetAttr; } #endif - if (__Pyx_SetVtable(__pyx_ptype_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter, __pyx_vtabptr_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter) < 0) __PYX_ERR(0, 134, __pyx_L1_error) + if (__Pyx_SetVtable(__pyx_ptype_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter, __pyx_vtabptr_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter) < 0) __PYX_ERR(0, 133, __pyx_L1_error) #if !CYTHON_COMPILING_IN_LIMITED_API - if (__Pyx_MergeVtables(__pyx_ptype_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter) < 0) __PYX_ERR(0, 134, __pyx_L1_error) + if (__Pyx_MergeVtables(__pyx_ptype_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter) < 0) __PYX_ERR(0, 133, __pyx_L1_error) #endif - if (PyObject_SetAttr(__pyx_m, __pyx_n_s_CompressedBufferedWriter, (PyObject *) __pyx_ptype_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter) < 0) __PYX_ERR(0, 134, __pyx_L1_error) + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_CompressedBufferedWriter, (PyObject *) __pyx_ptype_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter) < 0) __PYX_ERR(0, 133, __pyx_L1_error) #if !CYTHON_COMPILING_IN_LIMITED_API - if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter) < 0) __PYX_ERR(0, 134, __pyx_L1_error) + if (__Pyx_setup_reduce((PyObject *) __pyx_ptype_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter) < 0) __PYX_ERR(0, 133, __pyx_L1_error) #endif __Pyx_RefNannyFinishContext(); return 0; @@ -10632,23 +10621,23 @@ static int __Pyx_modinit_type_import_code(void) { /*--- Type import code ---*/ __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 9, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_ptype_7cpython_4type_type = __Pyx_ImportType_3_0_6(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", + __pyx_ptype_7cpython_4type_type = __Pyx_ImportType_3_0_9(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 - sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_6(PyTypeObject), + sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_9(PyTypeObject), #elif CYTHON_COMPILING_IN_LIMITED_API - sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_6(PyTypeObject), + sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_9(PyTypeObject), #else - sizeof(PyHeapTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_6(PyHeapTypeObject), + sizeof(PyHeapTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_9(PyHeapTypeObject), #endif - __Pyx_ImportType_CheckSize_Warn_3_0_6); if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(3, 9, __pyx_L1_error) + __Pyx_ImportType_CheckSize_Warn_3_0_9); if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(3, 9, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(4, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_ptype_7cpython_4bool_bool = __Pyx_ImportType_3_0_6(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "bool", sizeof(PyBoolObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_6(PyBoolObject),__Pyx_ImportType_CheckSize_Warn_3_0_6); if (!__pyx_ptype_7cpython_4bool_bool) __PYX_ERR(4, 8, __pyx_L1_error) + __pyx_ptype_7cpython_4bool_bool = __Pyx_ImportType_3_0_9(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "bool", sizeof(PyBoolObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_9(PyBoolObject),__Pyx_ImportType_CheckSize_Warn_3_0_9); if (!__pyx_ptype_7cpython_4bool_bool) __PYX_ERR(4, 8, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_ptype_7cpython_7complex_complex = __Pyx_ImportType_3_0_6(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "complex", sizeof(PyComplexObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_6(PyComplexObject),__Pyx_ImportType_CheckSize_Warn_3_0_6); if (!__pyx_ptype_7cpython_7complex_complex) __PYX_ERR(5, 15, __pyx_L1_error) + __pyx_ptype_7cpython_7complex_complex = __Pyx_ImportType_3_0_9(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "complex", sizeof(PyComplexObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_9(PyComplexObject),__Pyx_ImportType_CheckSize_Warn_3_0_9); if (!__pyx_ptype_7cpython_7complex_complex) __PYX_ERR(5, 15, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_RefNannyFinishContext(); return 0; @@ -10863,7 +10852,7 @@ static CYTHON_SMALL_CODE int __pyx_pymod_exec_bufferedwriter(PyObject *__pyx_pyi __pyx_t_1 = PyModule_Create(&__pyx_moduledef); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) { int add_module_result = PyState_AddModule(__pyx_t_1, &__pyx_moduledef); - __pyx_t_1 = 0; /* transfer ownership from __pyx_t_1 to bufferedwriter pseudovariable */ + __pyx_t_1 = 0; /* transfer ownership from __pyx_t_1 to "bufferedwriter" pseudovariable */ if (unlikely((add_module_result < 0))) __PYX_ERR(0, 1, __pyx_L1_error) pystate_addmodule_run = 1; } @@ -11098,16 +11087,16 @@ if (!__Pyx_RefNanny) { __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; PyType_Modified(__pyx_ptype_17clickhouse_driver_14bufferedwriter_BufferedWriter); - /* "clickhouse_driver/bufferedwriter.pyx":127 + /* "clickhouse_driver/bufferedwriter.pyx":126 * super(BufferedSocketWriter, self).__init__(bufsize) * * cpdef write_into_stream(self): # <<<<<<<<<<<<<< * self.sock.sendall( * PyBytes_FromStringAndSize(self.buffer, self.position) */ - __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_17clickhouse_driver_14bufferedwriter_20BufferedSocketWriter_3write_into_stream, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_BufferedSocketWriter_write_into, NULL, __pyx_n_s_clickhouse_driver_bufferedwriter_2, __pyx_d, ((PyObject *)__pyx_codeobj__23)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 127, __pyx_L1_error) + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_17clickhouse_driver_14bufferedwriter_20BufferedSocketWriter_3write_into_stream, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_BufferedSocketWriter_write_into, NULL, __pyx_n_s_clickhouse_driver_bufferedwriter_2, __pyx_d, ((PyObject *)__pyx_codeobj__23)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 126, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter, __pyx_n_s_write_into_stream, __pyx_t_2) < 0) __PYX_ERR(0, 127, __pyx_L1_error) + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter, __pyx_n_s_write_into_stream, __pyx_t_2) < 0) __PYX_ERR(0, 126, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; PyType_Modified(__pyx_ptype_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter); @@ -11134,28 +11123,28 @@ if (!__Pyx_RefNanny) { __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; PyType_Modified(__pyx_ptype_17clickhouse_driver_14bufferedwriter_BufferedSocketWriter); - /* "clickhouse_driver/bufferedwriter.pyx":141 + /* "clickhouse_driver/bufferedwriter.pyx":140 * super(CompressedBufferedWriter, self).__init__(bufsize) * * cpdef write_into_stream(self): # <<<<<<<<<<<<<< * self.compressor.write( * PyBytes_FromStringAndSize(self.buffer, self.position) */ - __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_17clickhouse_driver_14bufferedwriter_24CompressedBufferedWriter_3write_into_stream, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CompressedBufferedWriter_write_i, NULL, __pyx_n_s_clickhouse_driver_bufferedwriter_2, __pyx_d, ((PyObject *)__pyx_codeobj__26)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 141, __pyx_L1_error) + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_17clickhouse_driver_14bufferedwriter_24CompressedBufferedWriter_3write_into_stream, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CompressedBufferedWriter_write_i, NULL, __pyx_n_s_clickhouse_driver_bufferedwriter_2, __pyx_d, ((PyObject *)__pyx_codeobj__26)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 140, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter, __pyx_n_s_write_into_stream, __pyx_t_2) < 0) __PYX_ERR(0, 141, __pyx_L1_error) + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter, __pyx_n_s_write_into_stream, __pyx_t_2) < 0) __PYX_ERR(0, 140, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; PyType_Modified(__pyx_ptype_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter); - /* "clickhouse_driver/bufferedwriter.pyx":147 + /* "clickhouse_driver/bufferedwriter.pyx":146 * self.position = 0 * * def flush(self): # <<<<<<<<<<<<<< * self.write_into_stream() */ - __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_17clickhouse_driver_14bufferedwriter_24CompressedBufferedWriter_5flush, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CompressedBufferedWriter_flush, NULL, __pyx_n_s_clickhouse_driver_bufferedwriter_2, __pyx_d, ((PyObject *)__pyx_codeobj__27)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 147, __pyx_L1_error) + __pyx_t_2 = __Pyx_CyFunction_New(&__pyx_mdef_17clickhouse_driver_14bufferedwriter_24CompressedBufferedWriter_5flush, __Pyx_CYFUNCTION_CCLASS, __pyx_n_s_CompressedBufferedWriter_flush, NULL, __pyx_n_s_clickhouse_driver_bufferedwriter_2, __pyx_d, ((PyObject *)__pyx_codeobj__27)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 146, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_2); - if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter, __pyx_n_s_flush, __pyx_t_2) < 0) __PYX_ERR(0, 147, __pyx_L1_error) + if (__Pyx_SetItemOnTypeDict((PyObject *)__pyx_ptype_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter, __pyx_n_s_flush, __pyx_t_2) < 0) __PYX_ERR(0, 146, __pyx_L1_error) __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; PyType_Modified(__pyx_ptype_17clickhouse_driver_14bufferedwriter_CompressedBufferedWriter); @@ -11651,11 +11640,11 @@ static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyO { int eq = __Pyx_PyUnicode_Equals(s, PyTuple_GET_ITEM(kwnames, i), Py_EQ); if (unlikely(eq != 0)) { - if (unlikely(eq < 0)) return NULL; // error + if (unlikely(eq < 0)) return NULL; return kwvalues[i]; } } - return NULL; // not found (no exception set) + return NULL; } #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 CYTHON_UNUSED static PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues) { @@ -11742,7 +11731,7 @@ static int __Pyx_ParseOptionalKeywords( if (*name) { values[name-argnames] = value; #if CYTHON_AVOID_BORROWED_REFS - Py_INCREF(value); // transfer ownership of value to values + Py_INCREF(value); Py_DECREF(key); #endif key = NULL; @@ -11761,7 +11750,7 @@ static int __Pyx_ParseOptionalKeywords( && _PyString_Eq(**name, key)) { values[name-argnames] = value; #if CYTHON_AVOID_BORROWED_REFS - value = NULL; // ownership transferred to values + value = NULL; #endif break; } @@ -11793,7 +11782,7 @@ static int __Pyx_ParseOptionalKeywords( if (cmp == 0) { values[name-argnames] = value; #if CYTHON_AVOID_BORROWED_REFS - value = NULL; // ownership transferred to values + value = NULL; #endif break; } @@ -13580,10 +13569,10 @@ static int __Pyx_setup_reduce(PyObject* type_obj) { #endif /* TypeImport */ -#ifndef __PYX_HAVE_RT_ImportType_3_0_6 -#define __PYX_HAVE_RT_ImportType_3_0_6 -static PyTypeObject *__Pyx_ImportType_3_0_6(PyObject *module, const char *module_name, const char *class_name, - size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_6 check_size) +#ifndef __PYX_HAVE_RT_ImportType_3_0_9 +#define __PYX_HAVE_RT_ImportType_3_0_9 +static PyTypeObject *__Pyx_ImportType_3_0_9(PyObject *module, const char *module_name, const char *class_name, + size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_9 check_size) { PyObject *result = 0; char warning[200]; @@ -13637,7 +13626,7 @@ static PyTypeObject *__Pyx_ImportType_3_0_6(PyObject *module, const char *module module_name, class_name, size, basicsize+itemsize); goto bad; } - if (check_size == __Pyx_ImportType_CheckSize_Error_3_0_6 && + if (check_size == __Pyx_ImportType_CheckSize_Error_3_0_9 && ((size_t)basicsize > size || (size_t)(basicsize + itemsize) < size)) { PyErr_Format(PyExc_ValueError, "%.200s.%.200s size changed, may indicate binary incompatibility. " @@ -13645,7 +13634,7 @@ static PyTypeObject *__Pyx_ImportType_3_0_6(PyObject *module, const char *module module_name, class_name, size, basicsize, basicsize+itemsize); goto bad; } - else if (check_size == __Pyx_ImportType_CheckSize_Warn_3_0_6 && (size_t)basicsize > size) { + else if (check_size == __Pyx_ImportType_CheckSize_Warn_3_0_9 && (size_t)basicsize > size) { PyOS_snprintf(warning, sizeof(warning), "%s.%s size changed, may indicate binary incompatibility. " "Expected %zd from C header, got %zd from PyObject", @@ -14645,7 +14634,7 @@ static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, default: return NULL; } - return ((_PyCFunctionFastWithKeywords)(void(*)(void))def->ml_meth)(self, args, nargs, kwnames); + return ((__Pyx_PyCFunctionFastWithKeywords)(void(*)(void))def->ml_meth)(self, args, nargs, kwnames); } static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { @@ -15104,7 +15093,7 @@ static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( #else py_code = PyCode_NewEmpty(filename, funcname, py_line); #endif - Py_XDECREF(py_funcname); // XDECREF since it's only set on Py3 if cline + Py_XDECREF(py_funcname); return py_code; bad: Py_XDECREF(py_funcname); diff --git a/clickhouse_driver/client.py b/clickhouse_driver/client.py index 14128d9b..6ff9d178 100644 --- a/clickhouse_driver/client.py +++ b/clickhouse_driver/client.py @@ -11,12 +11,12 @@ from .connection import Connection from .log import log_block from .protocol import ServerPacketTypes -from .result import ( - IterQueryResult, ProgressQueryResult, QueryResult, QueryInfo -) +from .result import IterQueryResult, ProgressQueryResult, QueryResult, QueryInfo from .util.escape import escape_params from .util.helpers import column_chunks, chunks, asbool +NUMPY_EXTRAS_MSG = "NumPy extras must be installed: pandas" + class Client(object): """ @@ -71,77 +71,72 @@ class Client(object): """ available_client_settings = ( - 'insert_block_size', # TODO: rename to max_insert_block_size - 'strings_as_bytes', - 'strings_encoding', - 'use_numpy', - 'opentelemetry_traceparent', - 'opentelemetry_tracestate', - 'quota_key', - 'input_format_null_as_default', - 'namedtuple_as_json', - 'server_side_params' + "insert_block_size", # TODO: rename to max_insert_block_size + "strings_as_bytes", + "strings_encoding", + "use_numpy", + "opentelemetry_traceparent", + "opentelemetry_tracestate", + "quota_key", + "input_format_null_as_default", + "namedtuple_as_json", + "server_side_params", ) def __init__(self, *args, **kwargs): - self.settings = (kwargs.pop('settings', None) or {}).copy() + self.settings = (kwargs.pop("settings", None) or {}).copy() self.client_settings = { - 'insert_block_size': int(self.settings.pop( - 'insert_block_size', defines.DEFAULT_INSERT_BLOCK_SIZE, - )), - 'strings_as_bytes': self.settings.pop( - 'strings_as_bytes', False - ), - 'strings_encoding': self.settings.pop( - 'strings_encoding', defines.STRINGS_ENCODING - ), - 'use_numpy': self.settings.pop( - 'use_numpy', False - ), - 'opentelemetry_traceparent': self.settings.pop( - 'opentelemetry_traceparent', None + "insert_block_size": int( + self.settings.pop( + "insert_block_size", + defines.DEFAULT_INSERT_BLOCK_SIZE, + ) ), - 'opentelemetry_tracestate': self.settings.pop( - 'opentelemetry_tracestate', '' + "strings_as_bytes": self.settings.pop("strings_as_bytes", False), + "strings_encoding": self.settings.pop( + "strings_encoding", defines.STRINGS_ENCODING ), - 'quota_key': self.settings.pop( - 'quota_key', '' + "use_numpy": self.settings.pop("use_numpy", False), + "opentelemetry_traceparent": self.settings.pop( + "opentelemetry_traceparent", None ), - 'input_format_null_as_default': self.settings.pop( - 'input_format_null_as_default', False + "opentelemetry_tracestate": self.settings.pop( + "opentelemetry_tracestate", "" ), - 'namedtuple_as_json': self.settings.pop( - 'namedtuple_as_json', True + "quota_key": self.settings.pop("quota_key", ""), + "input_format_null_as_default": self.settings.pop( + "input_format_null_as_default", False ), - 'server_side_params': self.settings.pop( - 'server_side_params', False - ) + "namedtuple_as_json": self.settings.pop("namedtuple_as_json", True), + "server_side_params": self.settings.pop("server_side_params", False), } - if self.client_settings['use_numpy']: + if self.client_settings["use_numpy"]: try: from .numpy.result import ( - NumpyIterQueryResult, NumpyProgressQueryResult, - NumpyQueryResult + NumpyIterQueryResult, + NumpyProgressQueryResult, + NumpyQueryResult, ) + self.query_result_cls = NumpyQueryResult self.iter_query_result_cls = NumpyIterQueryResult self.progress_query_result_cls = NumpyProgressQueryResult except ImportError: - raise RuntimeError('Extras for NumPy must be installed') + raise RuntimeError(NUMPY_EXTRAS_MSG) else: self.query_result_cls = QueryResult self.iter_query_result_cls = IterQueryResult self.progress_query_result_cls = ProgressQueryResult - round_robin = kwargs.pop('round_robin', False) + round_robin = kwargs.pop("round_robin", False) self.connections = deque([Connection(*args, **kwargs)]) - if round_robin and 'alt_hosts' in kwargs: - alt_hosts = kwargs.pop('alt_hosts') - for host in alt_hosts.split(','): - url = urlparse('clickhouse://' + host) + if round_robin and "alt_hosts" in kwargs: + alt_hosts = kwargs.pop("alt_hosts") + for host in alt_hosts.split(","): + url = urlparse("clickhouse://" + host) connection_kwargs = kwargs.copy() num_args = len(args) @@ -150,13 +145,13 @@ def __init__(self, *args, **kwargs): connection_args = (url.hostname, url.port) + args[2:] elif num_args >= 1: # host as positional and port as keyword argument - connection_args = (url.hostname, ) + args[1:] - connection_kwargs['port'] = url.port + connection_args = (url.hostname,) + args[1:] + connection_kwargs["port"] = url.port else: # host and port as keyword arguments connection_args = tuple() - connection_kwargs['host'] = url.hostname - connection_kwargs['port'] = url.port + connection_kwargs["host"] = url.hostname + connection_kwargs["port"] = url.port connection = Connection(*connection_args, **connection_kwargs) self.connections.append(connection) @@ -172,7 +167,7 @@ def __exit__(self, exc_type, exc_val, exc_tb): self.disconnect() def get_connection(self): - if hasattr(self, 'connection'): + if hasattr(self, "connection"): self.connections.append(self.connection) connection = self.connections.popleft() @@ -196,8 +191,7 @@ def disconnect_connection(self): def reset_last_query(self): self.last_query = None - def receive_result(self, with_column_types=False, progress=False, - columnar=False): + def receive_result(self, with_column_types=False, progress=False, columnar=False): gen = self.packet_generator() @@ -215,9 +209,7 @@ def receive_result(self, with_column_types=False, progress=False, def iter_receive_result(self, with_column_types=False): gen = self.packet_generator() - result = self.iter_query_result_cls( - gen, with_column_types=with_column_types - ) + result = self.iter_query_result_cls(gen, with_column_types=with_column_types) for rows in result: for row in rows: @@ -285,13 +277,13 @@ def make_query_settings(self, settings): self.connection.context.settings = query_settings def track_current_database(self, query): - query = query.strip('; ') - if query.lower().startswith('use '): + query = query.strip("; ") + if query.lower().startswith("use "): self.connection.database = query[4:].strip() def establish_connection(self, settings): num_connections = len(self.connections) - if hasattr(self, 'connection'): + if hasattr(self, "connection"): num_connections += 1 for i in range(num_connections): @@ -321,9 +313,17 @@ def disconnect_on_error(self, query, settings): self.disconnect() raise - def execute(self, query, params=None, with_column_types=False, - external_tables=None, query_id=None, settings=None, - types_check=False, columnar=False): + def execute( + self, + query, + params=None, + with_column_types=False, + external_tables=None, + query_id=None, + settings=None, + types_check=False, + columnar=False, + ): """ Executes query. @@ -374,24 +374,37 @@ def execute(self, query, params=None, with_column_types=False, if is_insert: rv = self.process_insert_query( - query, params, external_tables=external_tables, - query_id=query_id, types_check=types_check, - columnar=columnar + query, + params, + external_tables=external_tables, + query_id=query_id, + types_check=types_check, + columnar=columnar, ) else: rv = self.process_ordinary_query( - query, params=params, with_column_types=with_column_types, + query, + params=params, + with_column_types=with_column_types, external_tables=external_tables, - query_id=query_id, types_check=types_check, - columnar=columnar + query_id=query_id, + types_check=types_check, + columnar=columnar, ) self.last_query.store_elapsed(time() - start_time) return rv def execute_with_progress( - self, query, params=None, with_column_types=False, - external_tables=None, query_id=None, settings=None, - types_check=False, columnar=False): + self, + query, + params=None, + with_column_types=False, + external_tables=None, + query_id=None, + settings=None, + types_check=False, + columnar=False, + ): """ Executes SELECT query with progress information. See, :ref:`execute-with-progress`. @@ -420,15 +433,26 @@ def execute_with_progress( with self.disconnect_on_error(query, settings): return self.process_ordinary_query_with_progress( - query, params=params, with_column_types=with_column_types, - external_tables=external_tables, query_id=query_id, - types_check=types_check, columnar=columnar + query, + params=params, + with_column_types=with_column_types, + external_tables=external_tables, + query_id=query_id, + types_check=types_check, + columnar=columnar, ) def execute_iter( - self, query, params=None, with_column_types=False, - external_tables=None, query_id=None, settings=None, - types_check=False, chunk_size=1): + self, + query, + params=None, + with_column_types=False, + external_tables=None, + query_id=None, + settings=None, + types_check=False, + chunk_size=1, + ): """ *New in version 0.0.14.* @@ -455,15 +479,24 @@ def execute_iter( """ with self.disconnect_on_error(query, settings): rv = self.iter_process_ordinary_query( - query, params=params, with_column_types=with_column_types, + query, + params=params, + with_column_types=with_column_types, external_tables=external_tables, - query_id=query_id, types_check=types_check + query_id=query_id, + types_check=types_check, ) return chunks(rv, chunk_size) if chunk_size > 1 else rv def query_dataframe( - self, query, params=None, external_tables=None, query_id=None, - settings=None, replace_nonwords=True): + self, + query, + params=None, + external_tables=None, + query_id=None, + settings=None, + replace_nonwords=True, + ): """ *New in version 0.2.0.* @@ -486,25 +519,27 @@ def query_dataframe( try: import pandas as pd except ImportError: - raise RuntimeError('Extras for NumPy must be installed') + raise RuntimeError(NUMPY_EXTRAS_MSG) data, columns = self.execute( - query, columnar=True, with_column_types=True, params=params, - external_tables=external_tables, query_id=query_id, - settings=settings + query, + columnar=True, + with_column_types=True, + params=params, + external_tables=external_tables, + query_id=query_id, + settings=settings, ) columns = [name for name, type_ in columns] if replace_nonwords: - columns = [re.sub(r'\W', '_', x) for x in columns] + columns = [re.sub(r"\W", "_", x) for x in columns] - return pd.DataFrame( - {col: d for d, col in zip(data, columns)}, columns=columns - ) + return pd.DataFrame({col: d for d, col in zip(data, columns)}, columns=columns) def insert_dataframe( - self, query, dataframe, external_tables=None, query_id=None, - settings=None): + self, query, dataframe, external_tables=None, query_id=None, settings=None + ): """ *New in version 0.2.0.* @@ -524,7 +559,7 @@ def insert_dataframe( try: import pandas as pd # noqa: F401 except ImportError: - raise RuntimeError('Extras for NumPy must be installed') + raise RuntimeError(NUMPY_EXTRAS_MSG) start_time = time() @@ -536,13 +571,21 @@ def insert_dataframe( rv = None if sample_block: columns = [x[0] for x in sample_block.columns_with_types] - # raise if any columns are missing from the dataframe diff = set(columns) - set(dataframe.columns) if len(diff): - msg = "DataFrame missing required columns: {}" - raise ValueError(msg.format(list(diff))) + raise ValueError( + f"DataFrame has missing required columns: {list(diff)}" + ) + + # TODO: to find a more pandas-idiomatic way of data "tuplefication" + data = [] + for column in columns: + column_values = dataframe[column].values + for idx, col_vals in enumerate(column_values): + if isinstance(col_vals, dict): + column_values[idx] = tuple(col_vals.values()) + data.append(column_values) - data = [dataframe[column].values for column in columns] rv = self.send_data(sample_block, data, columnar=True) self.receive_end_of_query() @@ -550,62 +593,78 @@ def insert_dataframe( return rv def process_ordinary_query_with_progress( - self, query, params=None, with_column_types=False, - external_tables=None, query_id=None, - types_check=False, columnar=False): + self, + query, + params=None, + with_column_types=False, + external_tables=None, + query_id=None, + types_check=False, + columnar=False, + ): if params is not None: - query = self.substitute_params( - query, params, self.connection.context - ) + query = self.substitute_params(query, params, self.connection.context) self.connection.send_query(query, query_id=query_id, params=params) - self.connection.send_external_tables(external_tables, - types_check=types_check) - return self.receive_result(with_column_types=with_column_types, - progress=True, columnar=columnar) + self.connection.send_external_tables(external_tables, types_check=types_check) + return self.receive_result( + with_column_types=with_column_types, progress=True, columnar=columnar + ) def process_ordinary_query( - self, query, params=None, with_column_types=False, - external_tables=None, query_id=None, - types_check=False, columnar=False): + self, + query, + params=None, + with_column_types=False, + external_tables=None, + query_id=None, + types_check=False, + columnar=False, + ): if params is not None: - query = self.substitute_params( - query, params, self.connection.context - ) + query = self.substitute_params(query, params, self.connection.context) self.connection.send_query(query, query_id=query_id, params=params) - self.connection.send_external_tables(external_tables, - types_check=types_check) - return self.receive_result(with_column_types=with_column_types, - columnar=columnar) + self.connection.send_external_tables(external_tables, types_check=types_check) + return self.receive_result( + with_column_types=with_column_types, columnar=columnar + ) def iter_process_ordinary_query( - self, query, params=None, with_column_types=False, - external_tables=None, query_id=None, - types_check=False): + self, + query, + params=None, + with_column_types=False, + external_tables=None, + query_id=None, + types_check=False, + ): if params is not None: - query = self.substitute_params( - query, params, self.connection.context - ) + query = self.substitute_params(query, params, self.connection.context) self.connection.send_query(query, query_id=query_id, params=params) - self.connection.send_external_tables(external_tables, - types_check=types_check) + self.connection.send_external_tables(external_tables, types_check=types_check) return self.iter_receive_result(with_column_types=with_column_types) - def process_insert_query(self, query_without_data, data, - external_tables=None, query_id=None, - types_check=False, columnar=False): + def process_insert_query( + self, + query_without_data, + data, + external_tables=None, + query_id=None, + types_check=False, + columnar=False, + ): self.connection.send_query(query_without_data, query_id=query_id) - self.connection.send_external_tables(external_tables, - types_check=types_check) + self.connection.send_external_tables(external_tables, types_check=types_check) sample_block = self.receive_sample_block() if sample_block: - rv = self.send_data(sample_block, data, - types_check=types_check, columnar=columnar) + rv = self.send_data( + sample_block, data, types_check=types_check, columnar=columnar + ) self.receive_end_of_insert_query() return rv @@ -627,7 +686,7 @@ def receive_sample_block(self): else: message = self.connection.unexpected_packet_message( - 'Data, Exception, Log or TableColumns', packet.type + "Data, Exception, Log or TableColumns", packet.type ) raise errors.UnexpectedPacketFromServerError(message) @@ -637,7 +696,7 @@ def send_data(self, sample_block, data, types_check=False, columnar=False): client_settings = self.connection.context.client_settings block_cls = ColumnOrientedBlock if columnar else RowOrientedBlock - if client_settings['use_numpy']: + if client_settings["use_numpy"]: try: from .numpy.helpers import column_chunks as numpy_column_chunks @@ -645,21 +704,19 @@ def send_data(self, sample_block, data, types_check=False, columnar=False): slicer = numpy_column_chunks else: raise ValueError( - 'NumPy inserts is only allowed with columnar=True' + "NumPy inserts are only allowed when columnar=True" ) - except ImportError: - raise RuntimeError('Extras for NumPy must be installed') - + raise RuntimeError(NUMPY_EXTRAS_MSG) else: slicer = column_chunks if columnar else chunks - for chunk in slicer(data, client_settings['insert_block_size']): - block = block_cls(sample_block.columns_with_types, chunk, - types_check=types_check) + for chunk in slicer(data, client_settings["insert_block_size"]): + block = block_cls( + sample_block.columns_with_types, chunk, types_check=types_check + ) self.connection.send_data(block) inserted_rows += block.num_rows - # Starting from the specific revision there are profile events # sent by server in response to each inserted block self.receive_profile_events() @@ -695,8 +752,9 @@ def receive_end_of_query(self): else: message = self.connection.unexpected_packet_message( - 'Exception, EndOfStream, Progress, TableColumns, ' - 'ProfileEvents or Log', packet.type + "Exception, EndOfStream, Progress, TableColumns, " + "ProfileEvents or Log", + packet.type, ) raise errors.UnexpectedPacketFromServerError(message) @@ -718,16 +776,13 @@ def receive_end_of_insert_query(self): else: message = self.connection.unexpected_packet_message( - 'EndOfStream, Log, Progress or Exception', packet.type + "EndOfStream, Log, Progress or Exception", packet.type ) raise errors.UnexpectedPacketFromServerError(message) def receive_profile_events(self): revision = self.connection.server_info.used_revision - if ( - revision < - defines.DBMS_MIN_PROTOCOL_VERSION_WITH_PROFILE_EVENTS_IN_INSERT - ): + if revision < defines.DBMS_MIN_PROTOCOL_VERSION_WITH_PROFILE_EVENTS_IN_INSERT: return None while True: @@ -748,7 +803,7 @@ def receive_profile_events(self): else: message = self.connection.unexpected_packet_message( - 'ProfileEvents, Progress, Log or Exception', packet.type + "ProfileEvents, Progress, Log or Exception", packet.type ) raise errors.UnexpectedPacketFromServerError(message) @@ -776,11 +831,11 @@ def substitute_params(self, query, params, context): print(substituted_query) """ # In case of server side templating we don't substitute here. - if self.connection.context.client_settings['server_side_params']: + if self.connection.context.client_settings["server_side_params"]: return query if not isinstance(params, dict): - raise ValueError('Parameters are expected in dict form') + raise ValueError("Parameters are expected in dict form") escaped = escape_params(params, context) return query % escaped @@ -810,27 +865,23 @@ def from_url(cls, url): host = url.hostname if url.port is not None: - kwargs['port'] = url.port + kwargs["port"] = url.port - path = url.path.replace('/', '', 1) + path = url.path.replace("/", "", 1) if path: - kwargs['database'] = path + kwargs["database"] = path if url.username is not None: - kwargs['user'] = unquote(url.username) + kwargs["user"] = unquote(url.username) if url.password is not None: - kwargs['password'] = unquote(url.password) + kwargs["password"] = unquote(url.password) - if url.scheme == 'clickhouses': - kwargs['secure'] = True + if url.scheme == "clickhouses": + kwargs["secure"] = True - compression_algs = {'lz4', 'lz4hc', 'zstd'} - timeouts = { - 'connect_timeout', - 'send_receive_timeout', - 'sync_request_timeout' - } + compression_algs = {"lz4", "lz4hc", "zstd"} + timeouts = {"connect_timeout", "send_receive_timeout", "sync_request_timeout"} for name, value in parse_qs(url.query).items(): if not value or not len(value): @@ -838,59 +889,62 @@ def from_url(cls, url): value = value[0] - if name == 'compression': + if name == "compression": value = value.lower() if value in compression_algs: kwargs[name] = value else: kwargs[name] = asbool(value) - elif name == 'secure': + elif name == "secure": kwargs[name] = asbool(value) - elif name == 'use_numpy': + elif name == "use_numpy": settings[name] = asbool(value) - elif name == 'round_robin': + elif name == "round_robin": kwargs[name] = asbool(value) - elif name == 'client_name': + elif name == "client_name": kwargs[name] = value elif name in timeouts: kwargs[name] = float(value) - elif name == 'compress_block_size': + elif name == "compress_block_size": kwargs[name] = int(value) - elif name == 'settings_is_important': + elif name == "settings_is_important": kwargs[name] = asbool(value) - elif name == 'tcp_keepalive': + elif name == "tcp_keepalive": try: kwargs[name] = asbool(value) except ValueError: - parts = value.split(',') - kwargs[name] = ( - float(parts[0]), float(parts[1]), int(parts[2]) - ) - elif name == 'client_revision': + parts = value.split(",") + kwargs[name] = (float(parts[0]), float(parts[1]), int(parts[2])) + elif name == "client_revision": kwargs[name] = int(value) # ssl - elif name == 'verify': + elif name == "verify": kwargs[name] = asbool(value) - elif name == 'ssl_version': + elif name == "ssl_version": kwargs[name] = getattr(ssl, value) - elif name in ['ca_certs', 'ciphers', 'keyfile', 'certfile', - 'server_hostname']: + elif name in [ + "ca_certs", + "ciphers", + "keyfile", + "certfile", + "server_hostname", + ]: kwargs[name] = value - elif name == 'alt_hosts': - kwargs['alt_hosts'] = value + elif name == "alt_hosts": + kwargs["alt_hosts"] = value else: settings[name] = value if settings: - kwargs['settings'] = settings + kwargs["settings"] = settings return cls(host, **kwargs) diff --git a/clickhouse_driver/columns/largeint.c b/clickhouse_driver/columns/largeint.c index 47602274..42b77b9b 100644 --- a/clickhouse_driver/columns/largeint.c +++ b/clickhouse_driver/columns/largeint.c @@ -1,4 +1,4 @@ -/* Generated by Cython 3.0.6 */ +/* Generated by Cython 3.0.9 */ /* BEGIN: Cython Metadata { @@ -54,10 +54,10 @@ END: Cython Metadata */ #else #define __PYX_EXTRA_ABI_MODULE_NAME "" #endif -#define CYTHON_ABI "3_0_6" __PYX_EXTRA_ABI_MODULE_NAME +#define CYTHON_ABI "3_0_9" __PYX_EXTRA_ABI_MODULE_NAME #define __PYX_ABI_MODULE_NAME "_cython_" CYTHON_ABI #define __PYX_TYPE_MODULE_PREFIX __PYX_ABI_MODULE_NAME "." -#define CYTHON_HEX_VERSION 0x030006F0 +#define CYTHON_HEX_VERSION 0x030009F0 #define CYTHON_FUTURE_DIVISION 1 #include #ifndef offsetof @@ -599,14 +599,14 @@ END: Cython Metadata */ PyObject *exception_table = NULL; PyObject *types_module=NULL, *code_type=NULL, *result=NULL; #if __PYX_LIMITED_VERSION_HEX < 0x030B0000 - PyObject *version_info; // borrowed + PyObject *version_info; PyObject *py_minor_version = NULL; #endif long minor_version = 0; PyObject *type, *value, *traceback; PyErr_Fetch(&type, &value, &traceback); #if __PYX_LIMITED_VERSION_HEX >= 0x030B0000 - minor_version = 11; // we don't yet need to distinguish between versions > 11 + minor_version = 11; #else if (!(version_info = PySys_GetObject("version_info"))) goto end; if (!(py_minor_version = PySequence_GetItem(version_info, 1))) goto end; @@ -664,7 +664,7 @@ END: Cython Metadata */ PyObject *fv, PyObject *cell, PyObject* fn, PyObject *name, int fline, PyObject *lnos) { PyCodeObject *result; - PyObject *empty_bytes = PyBytes_FromStringAndSize("", 0); // we don't have access to __pyx_empty_bytes here + PyObject *empty_bytes = PyBytes_FromStringAndSize("", 0); if (!empty_bytes) return NULL; result = #if PY_VERSION_HEX >= 0x030C0000 @@ -750,8 +750,13 @@ END: Cython Metadata */ typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames); #else - #define __Pyx_PyCFunctionFast _PyCFunctionFast - #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords + #if PY_VERSION_HEX >= 0x030d00A4 + # define __Pyx_PyCFunctionFast PyCFunctionFast + # define __Pyx_PyCFunctionFastWithKeywords PyCFunctionFastWithKeywords + #else + # define __Pyx_PyCFunctionFast _PyCFunctionFast + # define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords + #endif #endif #if CYTHON_METH_FASTCALL #define __Pyx_METH_FASTCALL METH_FASTCALL @@ -1103,7 +1108,7 @@ static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStrWithError(PyObject *dict, #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_Size(o) #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_Size(o) #endif -#if PY_VERSION_HEX >= 0x030d00A1 +#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 #define __Pyx_PyImport_AddModuleRef(name) PyImport_AddModuleRef(name) #else static CYTHON_INLINE PyObject *__Pyx_PyImport_AddModuleRef(const char *name) { @@ -1190,7 +1195,7 @@ static CYTHON_INLINE float __PYX_NAN() { #endif #define __PYX_MARK_ERR_POS(f_index, lineno) \ - { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } + { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } #define __PYX_ERR(f_index, lineno, Ln_error) \ { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } @@ -1297,24 +1302,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); #define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) #define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) #define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) -#if CYTHON_COMPILING_IN_LIMITED_API -static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const wchar_t *u) -{ - const wchar_t *u_end = u; - while (*u_end++) ; - return (size_t)(u_end - u - 1); -} -#else -static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) -{ - const Py_UNICODE *u_end = u; - while (*u_end++) ; - return (size_t)(u_end - u - 1); -} -#endif #define __Pyx_PyUnicode_FromOrdinal(o) PyUnicode_FromOrdinal((int)o) -#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) -#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode #define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode #define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) #define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) @@ -1364,7 +1352,7 @@ static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); #endif typedef Py_ssize_t __Pyx_compact_pylong; typedef size_t __Pyx_compact_upylong; - #else // Py < 3.12 + #else #define __Pyx_PyLong_IsNeg(x) (Py_SIZE(x) < 0) #define __Pyx_PyLong_IsNonNeg(x) (Py_SIZE(x) >= 0) #define __Pyx_PyLong_IsZero(x) (Py_SIZE(x) == 0) @@ -1484,10 +1472,10 @@ static const char *__pyx_filename; static const char *__pyx_f[] = { "clickhouse_driver/columns/largeint.pyx", - "venv/lib/python3.10/site-packages/Cython/Includes/cpython/contextvars.pxd", - "venv/lib/python3.10/site-packages/Cython/Includes/cpython/type.pxd", - "venv/lib/python3.10/site-packages/Cython/Includes/cpython/bool.pxd", - "venv/lib/python3.10/site-packages/Cython/Includes/cpython/complex.pxd", + "chenv/lib/python3.10/site-packages/Cython/Includes/cpython/contextvars.pxd", + "chenv/lib/python3.10/site-packages/Cython/Includes/cpython/type.pxd", + "chenv/lib/python3.10/site-packages/Cython/Includes/cpython/bool.pxd", + "chenv/lib/python3.10/site-packages/Cython/Includes/cpython/complex.pxd", }; /* #### Code section: utility_code_proto_before_types ### */ /* ForceInitThreads.proto */ @@ -1699,8 +1687,8 @@ static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int #define __Pyx_Arg_NewRef_VARARGS(arg) __Pyx_NewRef(arg) #define __Pyx_Arg_XDECREF_VARARGS(arg) Py_XDECREF(arg) #else - #define __Pyx_Arg_NewRef_VARARGS(arg) arg // no-op - #define __Pyx_Arg_XDECREF_VARARGS(arg) // no-op - arg is borrowed + #define __Pyx_Arg_NewRef_VARARGS(arg) arg + #define __Pyx_Arg_XDECREF_VARARGS(arg) #endif #define __Pyx_NumKwargs_VARARGS(kwds) PyDict_Size(kwds) #define __Pyx_KwValues_VARARGS(args, nargs) NULL @@ -1716,8 +1704,9 @@ static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int #else #define __Pyx_KwargsAsDict_FASTCALL(kw, kwvalues) _PyStack_AsDict(kwvalues, kw) #endif - #define __Pyx_Arg_NewRef_FASTCALL(arg) arg // no-op, __Pyx_Arg_FASTCALL is direct and this needs - #define __Pyx_Arg_XDECREF_FASTCALL(arg) // no-op - arg was returned from array + #define __Pyx_Arg_NewRef_FASTCALL(arg) arg /* no-op, __Pyx_Arg_FASTCALL is direct and this needs + to have the same reference counting */ + #define __Pyx_Arg_XDECREF_FASTCALL(arg) #else #define __Pyx_Arg_FASTCALL __Pyx_Arg_VARARGS #define __Pyx_NumKwargs_FASTCALL __Pyx_NumKwargs_VARARGS @@ -1779,22 +1768,22 @@ static PyObject* __Pyx_PyInt_SubtractObjC(PyObject *op1, PyObject *op2, long int #endif /* TypeImport.proto */ -#ifndef __PYX_HAVE_RT_ImportType_proto_3_0_6 -#define __PYX_HAVE_RT_ImportType_proto_3_0_6 +#ifndef __PYX_HAVE_RT_ImportType_proto_3_0_9 +#define __PYX_HAVE_RT_ImportType_proto_3_0_9 #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L #include #endif #if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || __cplusplus >= 201103L -#define __PYX_GET_STRUCT_ALIGNMENT_3_0_6(s) alignof(s) +#define __PYX_GET_STRUCT_ALIGNMENT_3_0_9(s) alignof(s) #else -#define __PYX_GET_STRUCT_ALIGNMENT_3_0_6(s) sizeof(void*) +#define __PYX_GET_STRUCT_ALIGNMENT_3_0_9(s) sizeof(void*) #endif -enum __Pyx_ImportType_CheckSize_3_0_6 { - __Pyx_ImportType_CheckSize_Error_3_0_6 = 0, - __Pyx_ImportType_CheckSize_Warn_3_0_6 = 1, - __Pyx_ImportType_CheckSize_Ignore_3_0_6 = 2 +enum __Pyx_ImportType_CheckSize_3_0_9 { + __Pyx_ImportType_CheckSize_Error_3_0_9 = 0, + __Pyx_ImportType_CheckSize_Warn_3_0_9 = 1, + __Pyx_ImportType_CheckSize_Ignore_3_0_9 = 2 }; -static PyTypeObject *__Pyx_ImportType_3_0_6(PyObject* module, const char *module_name, const char *class_name, size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_6 check_size); +static PyTypeObject *__Pyx_ImportType_3_0_9(PyObject* module, const char *module_name, const char *class_name, size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_9 check_size); #endif /* Import.proto */ @@ -1948,7 +1937,7 @@ typedef struct { #endif void *defaults; int defaults_pyobjects; - size_t defaults_size; // used by FusedFunction for copying defaults + size_t defaults_size; int flags; PyObject *defaults_tuple; PyObject *defaults_kwdict; @@ -6321,23 +6310,23 @@ static int __Pyx_modinit_type_import_code(void) { /*--- Type import code ---*/ __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 9, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_ptype_7cpython_4type_type = __Pyx_ImportType_3_0_6(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", + __pyx_ptype_7cpython_4type_type = __Pyx_ImportType_3_0_9(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 - sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_6(PyTypeObject), + sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_9(PyTypeObject), #elif CYTHON_COMPILING_IN_LIMITED_API - sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_6(PyTypeObject), + sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_9(PyTypeObject), #else - sizeof(PyHeapTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_6(PyHeapTypeObject), + sizeof(PyHeapTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_9(PyHeapTypeObject), #endif - __Pyx_ImportType_CheckSize_Warn_3_0_6); if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(2, 9, __pyx_L1_error) + __Pyx_ImportType_CheckSize_Warn_3_0_9); if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(2, 9, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_ptype_7cpython_4bool_bool = __Pyx_ImportType_3_0_6(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "bool", sizeof(PyBoolObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_6(PyBoolObject),__Pyx_ImportType_CheckSize_Warn_3_0_6); if (!__pyx_ptype_7cpython_4bool_bool) __PYX_ERR(3, 8, __pyx_L1_error) + __pyx_ptype_7cpython_4bool_bool = __Pyx_ImportType_3_0_9(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "bool", sizeof(PyBoolObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_9(PyBoolObject),__Pyx_ImportType_CheckSize_Warn_3_0_9); if (!__pyx_ptype_7cpython_4bool_bool) __PYX_ERR(3, 8, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(4, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_ptype_7cpython_7complex_complex = __Pyx_ImportType_3_0_6(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "complex", sizeof(PyComplexObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_6(PyComplexObject),__Pyx_ImportType_CheckSize_Warn_3_0_6); if (!__pyx_ptype_7cpython_7complex_complex) __PYX_ERR(4, 15, __pyx_L1_error) + __pyx_ptype_7cpython_7complex_complex = __Pyx_ImportType_3_0_9(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "complex", sizeof(PyComplexObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_9(PyComplexObject),__Pyx_ImportType_CheckSize_Warn_3_0_9); if (!__pyx_ptype_7cpython_7complex_complex) __PYX_ERR(4, 15, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_RefNannyFinishContext(); return 0; @@ -6552,7 +6541,7 @@ static CYTHON_SMALL_CODE int __pyx_pymod_exec_largeint(PyObject *__pyx_pyinit_mo __pyx_t_1 = PyModule_Create(&__pyx_moduledef); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) { int add_module_result = PyState_AddModule(__pyx_t_1, &__pyx_moduledef); - __pyx_t_1 = 0; /* transfer ownership from __pyx_t_1 to largeint pseudovariable */ + __pyx_t_1 = 0; /* transfer ownership from __pyx_t_1 to "largeint" pseudovariable */ if (unlikely((add_module_result < 0))) __PYX_ERR(0, 1, __pyx_L1_error) pystate_addmodule_run = 1; } @@ -7230,11 +7219,11 @@ static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyO { int eq = __Pyx_PyUnicode_Equals(s, PyTuple_GET_ITEM(kwnames, i), Py_EQ); if (unlikely(eq != 0)) { - if (unlikely(eq < 0)) return NULL; // error + if (unlikely(eq < 0)) return NULL; return kwvalues[i]; } } - return NULL; // not found (no exception set) + return NULL; } #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 CYTHON_UNUSED static PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues) { @@ -7347,7 +7336,7 @@ static int __Pyx_ParseOptionalKeywords( if (*name) { values[name-argnames] = value; #if CYTHON_AVOID_BORROWED_REFS - Py_INCREF(value); // transfer ownership of value to values + Py_INCREF(value); Py_DECREF(key); #endif key = NULL; @@ -7366,7 +7355,7 @@ static int __Pyx_ParseOptionalKeywords( && _PyString_Eq(**name, key)) { values[name-argnames] = value; #if CYTHON_AVOID_BORROWED_REFS - value = NULL; // ownership transferred to values + value = NULL; #endif break; } @@ -7398,7 +7387,7 @@ static int __Pyx_ParseOptionalKeywords( if (cmp == 0) { values[name-argnames] = value; #if CYTHON_AVOID_BORROWED_REFS - value = NULL; // ownership transferred to values + value = NULL; #endif break; } @@ -7681,10 +7670,10 @@ static PyObject* __Pyx_PyInt_SubtractObjC(PyObject *op1, PyObject *op2, long int #endif /* TypeImport */ -#ifndef __PYX_HAVE_RT_ImportType_3_0_6 -#define __PYX_HAVE_RT_ImportType_3_0_6 -static PyTypeObject *__Pyx_ImportType_3_0_6(PyObject *module, const char *module_name, const char *class_name, - size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_6 check_size) +#ifndef __PYX_HAVE_RT_ImportType_3_0_9 +#define __PYX_HAVE_RT_ImportType_3_0_9 +static PyTypeObject *__Pyx_ImportType_3_0_9(PyObject *module, const char *module_name, const char *class_name, + size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_9 check_size) { PyObject *result = 0; char warning[200]; @@ -7738,7 +7727,7 @@ static PyTypeObject *__Pyx_ImportType_3_0_6(PyObject *module, const char *module module_name, class_name, size, basicsize+itemsize); goto bad; } - if (check_size == __Pyx_ImportType_CheckSize_Error_3_0_6 && + if (check_size == __Pyx_ImportType_CheckSize_Error_3_0_9 && ((size_t)basicsize > size || (size_t)(basicsize + itemsize) < size)) { PyErr_Format(PyExc_ValueError, "%.200s.%.200s size changed, may indicate binary incompatibility. " @@ -7746,7 +7735,7 @@ static PyTypeObject *__Pyx_ImportType_3_0_6(PyObject *module, const char *module module_name, class_name, size, basicsize, basicsize+itemsize); goto bad; } - else if (check_size == __Pyx_ImportType_CheckSize_Warn_3_0_6 && (size_t)basicsize > size) { + else if (check_size == __Pyx_ImportType_CheckSize_Warn_3_0_9 && (size_t)basicsize > size) { PyOS_snprintf(warning, sizeof(warning), "%s.%s size changed, may indicate binary incompatibility. " "Expected %zd from C header, got %zd from PyObject", @@ -8989,7 +8978,7 @@ static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, default: return NULL; } - return ((_PyCFunctionFastWithKeywords)(void(*)(void))def->ml_meth)(self, args, nargs, kwnames); + return ((__Pyx_PyCFunctionFastWithKeywords)(void(*)(void))def->ml_meth)(self, args, nargs, kwnames); } static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { @@ -9448,7 +9437,7 @@ static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( #else py_code = PyCode_NewEmpty(filename, funcname, py_line); #endif - Py_XDECREF(py_funcname); // XDECREF since it's only set on Py3 if cline + Py_XDECREF(py_funcname); return py_code; bad: Py_XDECREF(py_funcname); diff --git a/clickhouse_driver/columns/service.py b/clickhouse_driver/columns/service.py index 5d8b78e4..3efb896f 100644 --- a/clickhouse_driver/columns/service.py +++ b/clickhouse_driver/columns/service.py @@ -10,9 +10,18 @@ from .enumcolumn import create_enum_column from .floatcolumn import Float32Column, Float64Column from .intcolumn import ( - Int8Column, Int16Column, Int32Column, Int64Column, - Int128Column, UInt128Column, Int256Column, UInt256Column, - UInt8Column, UInt16Column, UInt32Column, UInt64Column + Int8Column, + Int16Column, + Int32Column, + Int64Column, + Int128Column, + UInt128Column, + Int256Column, + UInt256Column, + UInt8Column, + UInt16Column, + UInt32Column, + UInt64Column, ) from .lowcardinalitycolumn import create_low_cardinality_column from .jsoncolumn import create_json_column @@ -20,50 +29,76 @@ from .nothingcolumn import NothingColumn from .nullcolumn import NullColumn from .nullablecolumn import create_nullable_column -from .simpleaggregatefunctioncolumn import ( - create_simple_aggregate_function_column -) +from .simpleaggregatefunctioncolumn import create_simple_aggregate_function_column from .stringcolumn import create_string_column from .tuplecolumn import create_tuple_column from .nestedcolumn import create_nested_column from .uuidcolumn import UUIDColumn from .intervalcolumn import ( - IntervalYearColumn, IntervalMonthColumn, IntervalWeekColumn, - IntervalDayColumn, IntervalHourColumn, IntervalMinuteColumn, - IntervalSecondColumn + IntervalYearColumn, + IntervalMonthColumn, + IntervalWeekColumn, + IntervalDayColumn, + IntervalHourColumn, + IntervalMinuteColumn, + IntervalSecondColumn, ) from .ipcolumn import IPv4Column, IPv6Column -column_by_type = {c.ch_type: c for c in [ - DateColumn, Date32Column, Float32Column, Float64Column, - Int8Column, Int16Column, Int32Column, Int64Column, - Int128Column, UInt128Column, Int256Column, UInt256Column, - UInt8Column, UInt16Column, UInt32Column, UInt64Column, - NothingColumn, NullColumn, UUIDColumn, - IntervalYearColumn, IntervalMonthColumn, IntervalWeekColumn, - IntervalDayColumn, IntervalHourColumn, IntervalMinuteColumn, - IntervalSecondColumn, IPv4Column, IPv6Column, BoolColumn -]} +column_by_type = { + c.ch_type: c + for c in [ + DateColumn, + Date32Column, + Float32Column, + Float64Column, + Int8Column, + Int16Column, + Int32Column, + Int64Column, + Int128Column, + UInt128Column, + Int256Column, + UInt256Column, + UInt8Column, + UInt16Column, + UInt32Column, + UInt64Column, + NothingColumn, + NullColumn, + UUIDColumn, + IntervalYearColumn, + IntervalMonthColumn, + IntervalWeekColumn, + IntervalDayColumn, + IntervalHourColumn, + IntervalMinuteColumn, + IntervalSecondColumn, + IPv4Column, + IPv6Column, + BoolColumn, + ] +} logger = logging.getLogger(__name__) aliases = [ # Begin Geo types - ('Point', 'Tuple(Float64, Float64)'), - ('Ring', 'Array(Point)'), - ('Polygon', 'Array(Ring)'), - ('MultiPolygon', 'Array(Polygon)') + ("Point", "Tuple(Float64, Float64)"), + ("Ring", "Array(Point)"), + ("Polygon", "Array(Ring)"), + ("MultiPolygon", "Array(Polygon)"), # End Geo types ] def get_column_by_spec(spec, column_options, use_numpy=None): - context = column_options['context'] + context = column_options["context"] if use_numpy is None: - use_numpy = context.client_settings['use_numpy'] if context else False + use_numpy = context.client_settings["use_numpy"] if context else False if use_numpy: from .numpy.service import get_numpy_column_by_spec @@ -72,103 +107,72 @@ def get_column_by_spec(spec, column_options, use_numpy=None): return get_numpy_column_by_spec(spec, column_options) except errors.UnknownTypeError: use_numpy = False - logger.warning('NumPy support is not implemented for %s. ' - 'Using generic column', spec) + logger.warning( + f"NumPy support is not implemented for {spec}. Using generic column" + ) def create_column_with_options(x): return get_column_by_spec(x, column_options, use_numpy=use_numpy) - if spec == 'String' or spec.startswith('FixedString'): + if spec == "String" or spec.startswith("FixedString"): return create_string_column(spec, column_options) - - elif spec.startswith('Enum'): + elif spec.startswith("Enum"): return create_enum_column(spec, column_options) - - elif spec.startswith('DateTime'): + elif spec.startswith("DateTime"): return create_datetime_column(spec, column_options) - - elif spec.startswith('Decimal'): + elif spec.startswith("Decimal"): return create_decimal_column(spec, column_options) - - elif spec.startswith('Array'): - return create_array_column( - spec, create_column_with_options, column_options - ) - - elif spec.startswith('Tuple'): - return create_tuple_column( - spec, create_column_with_options, column_options - ) - - elif spec.startswith('Nested'): - return create_nested_column( - spec, create_column_with_options, column_options - ) - - elif spec.startswith('Nullable'): + elif spec.startswith("Array"): + return create_array_column(spec, create_column_with_options, column_options) + elif spec.startswith("Tuple"): + return create_tuple_column(spec, create_column_with_options, column_options) + elif spec.startswith("Nested"): + return create_nested_column(spec, create_column_with_options, column_options) + elif spec.startswith("Nullable"): return create_nullable_column(spec, create_column_with_options) - - elif spec.startswith('LowCardinality'): + elif spec.startswith("LowCardinality"): return create_low_cardinality_column( spec, create_column_with_options, column_options ) - - elif spec.startswith('SimpleAggregateFunction'): - return create_simple_aggregate_function_column( - spec, create_column_with_options - ) - - elif spec.startswith('Map'): - return create_map_column( - spec, create_column_with_options, column_options - ) - + elif spec.startswith("SimpleAggregateFunction"): + return create_simple_aggregate_function_column(spec, create_column_with_options) + elif spec.startswith("Map"): + return create_map_column(spec, create_column_with_options, column_options) elif spec.startswith("Object('json')"): - return create_json_column( - spec, create_column_with_options, column_options - ) - + return create_json_column(spec, create_column_with_options, column_options) else: for alias, primitive in aliases: if spec.startswith(alias): - return create_column_with_options( - primitive + spec[len(alias):] - ) - + return create_column_with_options(primitive + spec[len(alias) :]) try: cls = column_by_type[spec] return cls(**column_options) - except KeyError: - raise errors.UnknownTypeError('Unknown type {}'.format(spec)) + raise errors.UnknownTypeError(f"Unknown type {spec}") -def read_column(context, column_spec, n_items, buf, use_numpy=None, - has_custom_serialization=False): +def read_column( + context, column_spec, n_items, buf, use_numpy=None, has_custom_serialization=False +): column_options = { - 'context': context, - 'has_custom_serialization': has_custom_serialization + "context": context, + "has_custom_serialization": has_custom_serialization, } col = get_column_by_spec(column_spec, column_options, use_numpy=use_numpy) col.read_state_prefix(buf) return col.read_data(n_items, buf) -def write_column(context, column_name, column_spec, items, buf, - types_check=False): - column_options = { - 'context': context, - 'types_check': types_check - } +def write_column(context, column_name, column_spec, items, buf, types_check=False): + column_options = {"context": context, "types_check": types_check} column = get_column_by_spec(column_spec, column_options) try: column.write_state_prefix(buf) column.write_data(items, buf) - except column_exceptions.ColumnTypeMismatchException as e: raise errors.TypeMismatchError( - 'Type mismatch in VALUES section. ' + "Type mismatch in VALUES section. " 'Expected {} got {}: {} for column "{}".'.format( column_spec, type(e.args[0]), e.args[0], column_name ) @@ -177,9 +181,7 @@ def write_column(context, column_name, column_spec, items, buf, except (column_exceptions.StructPackException, OverflowError) as e: error = e.args[0] raise errors.TypeMismatchError( - 'Type mismatch in VALUES section. ' - 'Repeat query with types_check=True for detailed info. ' - 'Column {}: {}'.format( - column_name, str(error) - ) + "Type mismatch in VALUES section. " + "Repeat query with types_check=True for detailed info. " + f"Column {column_name}: {error}" ) diff --git a/clickhouse_driver/connection.py b/clickhouse_driver/connection.py index 4702db19..d7731d10 100644 --- a/clickhouse_driver/connection.py +++ b/clickhouse_driver/connection.py @@ -45,8 +45,17 @@ def __init__(self): class ServerInfo(object): - def __init__(self, name, version_major, version_minor, version_patch, - revision, timezone, display_name, used_revision): + def __init__( + self, + name, + version_major, + version_minor, + version_patch, + revision, + timezone, + display_name, + used_revision, + ): self.name = name self.version_major = version_major self.version_minor = version_minor @@ -62,20 +71,22 @@ def version_tuple(self): return self.version_major, self.version_minor, self.version_patch def __repr__(self): - version = '%s.%s.%s' % ( - self.version_major, self.version_minor, self.version_patch + version = "%s.%s.%s" % ( + self.version_major, + self.version_minor, + self.version_patch, ) items = [ - ('name', self.name), - ('version', version), - ('revision', self.revision), - ('used revision', self.used_revision), - ('timezone', self.timezone), - ('display_name', self.display_name) + ("name", self.name), + ("version", version), + ("revision", self.revision), + ("used revision", self.used_revision), + ("timezone", self.timezone), + ("display_name", self.display_name), ] - params = ', '.join('{}={}'.format(key, value) for key, value in items) - return '' % (params) + params = ", ".join("{}={}".format(key, value) for key, value in items) + return "" % (params) class Connection(object): @@ -140,24 +151,31 @@ class Connection(object): """ def __init__( - self, host, port=None, - database=defines.DEFAULT_DATABASE, - user=defines.DEFAULT_USER, password=defines.DEFAULT_PASSWORD, - client_name=defines.CLIENT_NAME, - connect_timeout=defines.DBMS_DEFAULT_CONNECT_TIMEOUT_SEC, - send_receive_timeout=defines.DBMS_DEFAULT_TIMEOUT_SEC, - sync_request_timeout=defines.DBMS_DEFAULT_SYNC_REQUEST_TIMEOUT_SEC, - compress_block_size=defines.DEFAULT_COMPRESS_BLOCK_SIZE, - compression=False, - secure=False, - # Secure socket parameters. - verify=True, ssl_version=None, ca_certs=None, ciphers=None, - keyfile=None, certfile=None, - server_hostname=None, - alt_hosts=None, - settings_is_important=False, - tcp_keepalive=False, - client_revision=None + self, + host, + port=None, + database=defines.DEFAULT_DATABASE, + user=defines.DEFAULT_USER, + password=defines.DEFAULT_PASSWORD, + client_name=defines.CLIENT_NAME, + connect_timeout=defines.DBMS_DEFAULT_CONNECT_TIMEOUT_SEC, + send_receive_timeout=defines.DBMS_DEFAULT_TIMEOUT_SEC, + sync_request_timeout=defines.DBMS_DEFAULT_SYNC_REQUEST_TIMEOUT_SEC, + compress_block_size=defines.DEFAULT_COMPRESS_BLOCK_SIZE, + compression=False, + secure=False, + # Secure socket parameters. + verify=True, + ssl_version=None, + ca_certs=None, + ciphers=None, + keyfile=None, + certfile=None, + server_hostname=None, + alt_hosts=None, + settings_is_important=False, + tcp_keepalive=False, + client_revision=None, ): if secure: default_port = defines.DEFAULT_SECURE_PORT @@ -167,14 +185,14 @@ def __init__( self.hosts = deque([(host, port or default_port)]) if alt_hosts: - for host in alt_hosts.split(','): - url = urlparse('clickhouse://' + host) + for host in alt_hosts.split(","): + url = urlparse("clickhouse://" + host) self.hosts.append((url.hostname, url.port or default_port)) self.database = database self.user = user self.password = password - self.client_name = defines.DBMS_NAME + ' ' + client_name + self.client_name = defines.DBMS_NAME + " " + client_name self.connect_timeout = connect_timeout self.send_receive_timeout = send_receive_timeout self.sync_request_timeout = sync_request_timeout @@ -189,15 +207,15 @@ def __init__( ssl_options = {} if ssl_version is not None: - ssl_options['ssl_version'] = ssl_version + ssl_options["ssl_version"] = ssl_version if ca_certs is not None: - ssl_options['ca_certs'] = ca_certs + ssl_options["ca_certs"] = ca_certs if ciphers is not None: - ssl_options['ciphers'] = ciphers + ssl_options["ciphers"] = ciphers if keyfile is not None: - ssl_options['keyfile'] = keyfile + ssl_options["keyfile"] = keyfile if certfile is not None: - ssl_options['certfile'] = certfile + ssl_options["certfile"] = certfile self.ssl_options = ssl_options @@ -205,7 +223,7 @@ def __init__( # Use LZ4 compression by default. if compression is True: - compression = 'lz4' + compression = "lz4" if compression is False: self.compression = Compression.DISABLED @@ -237,15 +255,23 @@ def __init__( super(Connection, self).__init__() def __repr__(self): - dsn = '%s://%s:***@%s:%s/%s' % ( - 'clickhouses' if self.secure_socket else 'clickhouse', - self.user, self.host, self.port, self.database - ) if self.connected else '(not connected)' + dsn = ( + "%s://%s:***@%s:%s/%s" + % ( + "clickhouses" if self.secure_socket else "clickhouse", + self.user, + self.host, + self.port, + self.database, + ) + if self.connected + else "(not connected)" + ) - return '' % (dsn, self.compression) + return "" % (dsn, self.compression) def get_description(self): - return '{}:{}'.format(self.host, self.port) + return "{}:{}".format(self.host, self.port) def force_connect(self): self.check_query_execution() @@ -254,7 +280,7 @@ def force_connect(self): self.connect() elif not self.ping(): - logger.warning('Connection was closed, reconnecting.') + logger.warning("Connection was closed, reconnecting.") self.connect() def _create_socket(self, host, port): @@ -270,7 +296,7 @@ def _create_socket(self, host, port): cert_reqs = ssl.CERT_NONE ssl_options = self.ssl_options.copy() - ssl_options['cert_reqs'] = cert_reqs + ssl_options["cert_reqs"] = cert_reqs err = None for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM): @@ -283,7 +309,8 @@ def _create_socket(self, host, port): if self.secure_socket: ssl_context = self._create_ssl_context(ssl_options) sock = ssl_context.wrap_socket( - sock, server_hostname=self.server_hostname or host) + sock, server_hostname=self.server_hostname or host + ) sock.connect(sa) return sock @@ -301,24 +328,23 @@ def _create_socket(self, host, port): def _create_ssl_context(self, ssl_options): purpose = ssl.Purpose.SERVER_AUTH - version = ssl_options.get('ssl_version', ssl.PROTOCOL_TLS) + version = ssl_options.get("ssl_version", ssl.PROTOCOL_TLS) context = ssl.SSLContext(version) context.check_hostname = self.verify_cert - if 'ca_certs' in ssl_options: - context.load_verify_locations(ssl_options['ca_certs']) - elif ssl_options.get('cert_reqs') != ssl.CERT_NONE: - context.load_default_certs(purpose - ) - if 'ciphers' in ssl_options: - context.set_ciphers(ssl_options['ciphers']) + if "ca_certs" in ssl_options: + context.load_verify_locations(ssl_options["ca_certs"]) + elif ssl_options.get("cert_reqs") != ssl.CERT_NONE: + context.load_default_certs(purpose) + if "ciphers" in ssl_options: + context.set_ciphers(ssl_options["ciphers"]) - if 'cert_reqs' in ssl_options: - context.verify_mode = ssl_options['cert_reqs'] + if "cert_reqs" in ssl_options: + context.verify_mode = ssl_options["cert_reqs"] - if 'certfile' in ssl_options: - keyfile = ssl_options.get('keyfile') - context.load_cert_chain(ssl_options['certfile'], keyfile=keyfile) + if "certfile" in ssl_options: + keyfile = ssl_options.get("keyfile") + context.load_cert_chain(ssl_options["certfile"], keyfile=keyfile) return context @@ -355,7 +381,7 @@ def _set_keepalive(self): idle_time_sec, interval_sec, probes = self.tcp_keepalive - if platform == 'linux' or platform == 'win32': + if platform == "linux" or platform == "win32": # This should also work for Windows # starting with Windows 10, version 1709. self.socket.setsockopt( @@ -364,50 +390,40 @@ def _set_keepalive(self): self.socket.setsockopt( socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, interval_sec ) - self.socket.setsockopt( - socket.IPPROTO_TCP, socket.TCP_KEEPCNT, probes - ) + self.socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, probes) - elif platform == 'darwin': + elif platform == "darwin": TCP_KEEPALIVE = 0x10 # Only interval is available in mac os. - self.socket.setsockopt( - socket.IPPROTO_TCP, TCP_KEEPALIVE, interval_sec - ) + self.socket.setsockopt(socket.IPPROTO_TCP, TCP_KEEPALIVE, interval_sec) def _format_connection_error(self, e, host, port): - err = (e.strerror + ' ') if e.strerror else '' - return err + '({}:{})'.format(host, port) + err = (e.strerror + " ") if e.strerror else "" + return err + "({}:{})".format(host, port) def connect(self): if self.connected: self.disconnect() - logger.debug( - 'Connecting. Database: %s. User: %s', self.database, self.user - ) + logger.debug("Connecting. Database: %s. User: %s", self.database, self.user) err = None for i in range(len(self.hosts)): host, port = self.hosts[0] - logger.debug('Connecting to %s:%s', host, port) + logger.debug("Connecting to %s:%s", host, port) try: return self._init_connection(host, port) except socket.timeout as e: self.disconnect() - logger.warning( - 'Failed to connect to %s:%s', host, port, exc_info=True - ) + logger.warning("Failed to connect to %s:%s", host, port, exc_info=True) err_str = self._format_connection_error(e, host, port) err = errors.SocketTimeoutError(err_str) except socket.error as e: self.disconnect() - logger.warning( - 'Failed to connect to %s:%s', host, port, exc_info=True - ) + logger.warning("Failed to connect to %s:%s", host, port, exc_info=True) err_str = self._format_connection_error(e, host, port) err = errors.NetworkError(err_str) @@ -447,7 +463,7 @@ def disconnect(self): self.socket.shutdown(socket.SHUT_RDWR) except socket.error as e: - logger.warning('Error on socket shutdown: %s', e) + logger.warning("Error on socket shutdown: %s", e) self.socket.close() @@ -483,50 +499,55 @@ def receive_hello(self): used_revision = min(self.client_revision, server_revision) server_timezone = None - if used_revision >= \ - defines.DBMS_MIN_REVISION_WITH_SERVER_TIMEZONE: + if used_revision >= defines.DBMS_MIN_REVISION_WITH_SERVER_TIMEZONE: server_timezone = read_binary_str(self.fin) - server_display_name = '' - if used_revision >= \ - defines.DBMS_MIN_REVISION_WITH_SERVER_DISPLAY_NAME: + server_display_name = "" + if used_revision >= defines.DBMS_MIN_REVISION_WITH_SERVER_DISPLAY_NAME: server_display_name = read_binary_str(self.fin) server_version_patch = server_revision - if used_revision >= \ - defines.DBMS_MIN_REVISION_WITH_VERSION_PATCH: + if used_revision >= defines.DBMS_MIN_REVISION_WITH_VERSION_PATCH: server_version_patch = read_varint(self.fin) - if used_revision >= defines. \ - DBMS_MIN_PROTOCOL_VERSION_WITH_PASSWORD_COMPLEXITY_RULES: + if ( + used_revision + >= defines.DBMS_MIN_PROTOCOL_VERSION_WITH_PASSWORD_COMPLEXITY_RULES + ): rules_size = read_varint(self.fin) for _i in range(rules_size): read_binary_str(self.fin) # original_pattern read_binary_str(self.fin) # exception_message - if used_revision >= defines. \ - DBMS_MIN_REVISION_WITH_INTERSERVER_SECRET_V2: + if used_revision >= defines.DBMS_MIN_REVISION_WITH_INTERSERVER_SECRET_V2: read_binary_uint64(self.fin) # read_nonce self.server_info = ServerInfo( - server_name, server_version_major, server_version_minor, - server_version_patch, server_revision, - server_timezone, server_display_name, used_revision + server_name, + server_version_major, + server_version_minor, + server_version_patch, + server_revision, + server_timezone, + server_display_name, + used_revision, ) self.context.server_info = self.server_info logger.debug( - 'Connected to %s server version %s.%s.%s, revision: %s', - server_name, server_version_major, server_version_minor, - server_version_patch, server_revision + "Connected to %s server version %s.%s.%s, revision: %s", + server_name, + server_version_major, + server_version_minor, + server_version_patch, + server_revision, ) elif packet_type == ServerPacketTypes.EXCEPTION: raise self.receive_exception() else: - message = self.unexpected_packet_message('Hello or Exception', - packet_type) + message = self.unexpected_packet_message("Hello or Exception", packet_type) self.disconnect() raise errors.UnexpectedPacketFromServerError(message) @@ -534,9 +555,7 @@ def send_addendum(self): revision = self.server_info.used_revision if revision >= defines.DBMS_MIN_PROTOCOL_VERSION_WITH_QUOTA_KEY: - write_binary_str( - self.context.client_settings['quota_key'], self.fout - ) + write_binary_str(self.context.client_settings["quota_key"], self.fout) def ping(self): timeout = self.sync_request_timeout @@ -552,7 +571,7 @@ def ping(self): packet_type = read_varint(self.fin) if packet_type != ServerPacketTypes.PONG: - msg = self.unexpected_packet_message('Pong', packet_type) + msg = self.unexpected_packet_message("Pong", packet_type) raise errors.UnexpectedPacketFromServerError(msg) except errors.Error: @@ -561,9 +580,7 @@ def ping(self): except (socket.error, EOFError) as e: # It's just a warning now. # Current connection will be closed, new will be established. - logger.warning( - 'Error on %s ping: %s', self.get_description(), e - ) + logger.warning("Error on %s ping: %s", self.get_description(), e) return False return True @@ -600,9 +617,7 @@ def receive_packet(self): pass elif packet_type == ServerPacketTypes.TABLE_COLUMNS: - packet.multistring_message = self.receive_multistring_message( - packet_type - ) + packet.multistring_message = self.receive_multistring_message(packet_type) elif packet_type == ServerPacketTypes.PART_UUIDS: packet.block = self.receive_data() @@ -614,7 +629,7 @@ def receive_packet(self): packet.block = self.receive_data(may_be_compressed=False) else: - message = 'Unknown packet {} from server {}'.format( + message = "Unknown packet {} from server {}".format( packet_type, self.get_description() ) self.disconnect() @@ -635,8 +650,7 @@ def get_block_out_stream(self): from .streams.compressed import CompressedBlockOutputStream return CompressedBlockOutputStream( - self.compressor_cls, self.compress_block_size, - self.fout, self.context + self.compressor_cls, self.compress_block_size, self.fout, self.context ) else: return BlockOutputStream(self.fout, self.context) @@ -668,7 +682,7 @@ def receive_multistring_message(self, packet_type): num = ServerPacketTypes.strings_in_message(packet_type) return [read_binary_str(self.fin) for _i in range(num)] - def send_data(self, block, table_name=''): + def send_data(self, block, table_name=""): start = time() write_varint(ClientPacketTypes.DATA, self.fout) @@ -677,7 +691,7 @@ def send_data(self, block, table_name=''): write_binary_str(table_name, self.fout) self.block_out.write(block) - logger.debug('Block "%s" send time: %f', table_name, time() - start) + logger.debug(f'Block "{table_name}" send time: {time() - start}') def send_query(self, query, query_id=None, params=None): if not self.connected: @@ -685,28 +699,29 @@ def send_query(self, query, query_id=None, params=None): write_varint(ClientPacketTypes.QUERY, self.fout) - write_binary_str(query_id or '', self.fout) + write_binary_str(query_id or "", self.fout) revision = self.server_info.used_revision if revision >= defines.DBMS_MIN_REVISION_WITH_CLIENT_INFO: - client_info = ClientInfo(self.client_name, self.context, - client_revision=self.client_revision) + client_info = ClientInfo( + self.client_name, self.context, client_revision=self.client_revision + ) client_info.query_kind = ClientInfo.QueryKind.INITIAL_QUERY client_info.write(revision, self.fout) settings_as_strings = ( - revision >= defines - .DBMS_MIN_REVISION_WITH_SETTINGS_SERIALIZED_AS_STRINGS + revision >= defines.DBMS_MIN_REVISION_WITH_SETTINGS_SERIALIZED_AS_STRINGS ) settings_flags = 0 if self.settings_is_important: settings_flags |= SettingsFlags.IMPORTANT - write_settings(self.context.settings, self.fout, settings_as_strings, - settings_flags) + write_settings( + self.context.settings, self.fout, settings_as_strings, settings_flags + ) if revision >= defines.DBMS_MIN_REVISION_WITH_INTERSERVER_SECRET: - write_binary_str('', self.fout) + write_binary_str("", self.fout) write_varint(QueryProcessingStage.COMPLETE, self.fout) write_varint(self.compression, self.fout) @@ -714,16 +729,14 @@ def send_query(self, query, query_id=None, params=None): write_binary_str(query, self.fout) if revision >= defines.DBMS_MIN_PROTOCOL_VERSION_WITH_PARAMETERS: - if self.context.client_settings['server_side_params']: + if self.context.client_settings["server_side_params"]: # Always settings_as_strings = True - escaped = escape_params( - params or {}, self.context, for_server=True - ) + escaped = escape_params(params or {}, self.context, for_server=True) else: escaped = {} write_settings(escaped, self.fout, True, SettingsFlags.CUSTOM) - logger.debug('Query: %s', query) + logger.debug("Query: %s", query) self.fout.flush() @@ -734,25 +747,22 @@ def send_cancel(self): def send_external_tables(self, tables, types_check=False): for table in tables or []: - if not table['structure']: - raise ValueError( - 'Empty table "{}" structure'.format(table['name']) - ) + if not table["structure"]: + raise ValueError('Empty table "{}" structure'.format(table["name"])) - data = table['data'] + data = table["data"] block_cls = RowOrientedBlock - if self.context.client_settings['use_numpy']: + if self.context.client_settings["use_numpy"]: from .numpy.block import NumpyColumnOrientedBlock - columns = [x[0] for x in table['structure']] + columns = [x[0] for x in table["structure"]] data = [data[column].values for column in columns] block_cls = NumpyColumnOrientedBlock - block = block_cls(table['structure'], data, - types_check=types_check) - self.send_data(block, table_name=table['name']) + block = block_cls(table["structure"], data, types_check=types_check) + self.send_data(block, table_name=table["name"]) # Empty block, end of data transfer. self.send_data(RowOrientedBlock()) @@ -769,9 +779,8 @@ def timeout_setter(self, new_timeout): def unexpected_packet_message(self, expected, packet_type): packet_type = ServerPacketTypes.to_str(packet_type) - return ( - 'Unexpected packet from server {} (expected {}, got {})' - .format(self.get_description(), expected, packet_type) + return "Unexpected packet from server {} (expected {}, got {})".format( + self.get_description(), expected, packet_type ) def check_query_execution(self): diff --git a/clickhouse_driver/util/helpers.py b/clickhouse_driver/util/helpers.py index 8a12c641..dda9048c 100644 --- a/clickhouse_driver/util/helpers.py +++ b/clickhouse_driver/util/helpers.py @@ -1,16 +1,30 @@ from itertools import islice, tee +try: + import numpy as np + + CHECK_NUMPY_TYPES = True +except ImportError: + CHECK_NUMPY_TYPES = False + + +def _check_sequence_to_be_an_expected_iterable(seq): + expected = [list, tuple] + if CHECK_NUMPY_TYPES: + expected.append(np.ndarray) + return isinstance(seq, tuple(expected)) + def chunks(seq, n): # islice is MUCH slower than slice for lists and tuples. - if isinstance(seq, (list, tuple)): + if _check_sequence_to_be_an_expected_iterable(seq): i = 0 - item = seq[i:i+n] - while item: + item = seq[i : i + n] + # DeprecationWarning: The truth value of an empty array is ambiguous. -> numpy caused + while len(item): yield list(item) i += n - item = seq[i:i+n] - + item = seq[i : i + n] else: it = iter(seq) item = list(islice(it, n)) @@ -27,15 +41,13 @@ def pairwise(iterable): def column_chunks(columns, n): for column in columns: - if not isinstance(column, (list, tuple)): + if not _check_sequence_to_be_an_expected_iterable(column): raise TypeError( - 'Unsupported column type: {}. list or tuple is expected.' - .format(type(column)) + f"Unsupported column type: {type(column)}. Expected list, tuple or numpy.ndarray" ) # create chunk generator for every column g = [chunks(column, n) for column in columns] - while True: # get next chunk for every column item = [next(column, []) for column in g] @@ -48,10 +60,10 @@ def column_chunks(columns, n): def asbool(obj): if isinstance(obj, str): obj = obj.strip().lower() - if obj in ['true', 'yes', 'on', 'y', 't', '1']: + if obj in ["true", "yes", "on", "y", "t", "1"]: return True - elif obj in ['false', 'no', 'off', 'n', 'f', '0']: + elif obj in ["false", "no", "off", "n", "f", "0"]: return False else: - raise ValueError('String is not true/false: %r' % obj) + raise ValueError(f"String is not true/false: {obj!r}") return bool(obj) diff --git a/clickhouse_driver/varint.c b/clickhouse_driver/varint.c index 5358cda7..0711ef65 100644 --- a/clickhouse_driver/varint.c +++ b/clickhouse_driver/varint.c @@ -1,4 +1,4 @@ -/* Generated by Cython 3.0.6 */ +/* Generated by Cython 3.0.9 */ /* BEGIN: Cython Metadata { @@ -54,10 +54,10 @@ END: Cython Metadata */ #else #define __PYX_EXTRA_ABI_MODULE_NAME "" #endif -#define CYTHON_ABI "3_0_6" __PYX_EXTRA_ABI_MODULE_NAME +#define CYTHON_ABI "3_0_9" __PYX_EXTRA_ABI_MODULE_NAME #define __PYX_ABI_MODULE_NAME "_cython_" CYTHON_ABI #define __PYX_TYPE_MODULE_PREFIX __PYX_ABI_MODULE_NAME "." -#define CYTHON_HEX_VERSION 0x030006F0 +#define CYTHON_HEX_VERSION 0x030009F0 #define CYTHON_FUTURE_DIVISION 1 #include #ifndef offsetof @@ -599,14 +599,14 @@ END: Cython Metadata */ PyObject *exception_table = NULL; PyObject *types_module=NULL, *code_type=NULL, *result=NULL; #if __PYX_LIMITED_VERSION_HEX < 0x030B0000 - PyObject *version_info; // borrowed + PyObject *version_info; PyObject *py_minor_version = NULL; #endif long minor_version = 0; PyObject *type, *value, *traceback; PyErr_Fetch(&type, &value, &traceback); #if __PYX_LIMITED_VERSION_HEX >= 0x030B0000 - minor_version = 11; // we don't yet need to distinguish between versions > 11 + minor_version = 11; #else if (!(version_info = PySys_GetObject("version_info"))) goto end; if (!(py_minor_version = PySequence_GetItem(version_info, 1))) goto end; @@ -664,7 +664,7 @@ END: Cython Metadata */ PyObject *fv, PyObject *cell, PyObject* fn, PyObject *name, int fline, PyObject *lnos) { PyCodeObject *result; - PyObject *empty_bytes = PyBytes_FromStringAndSize("", 0); // we don't have access to __pyx_empty_bytes here + PyObject *empty_bytes = PyBytes_FromStringAndSize("", 0); if (!empty_bytes) return NULL; result = #if PY_VERSION_HEX >= 0x030C0000 @@ -750,8 +750,13 @@ END: Cython Metadata */ typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames); #else - #define __Pyx_PyCFunctionFast _PyCFunctionFast - #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords + #if PY_VERSION_HEX >= 0x030d00A4 + # define __Pyx_PyCFunctionFast PyCFunctionFast + # define __Pyx_PyCFunctionFastWithKeywords PyCFunctionFastWithKeywords + #else + # define __Pyx_PyCFunctionFast _PyCFunctionFast + # define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords + #endif #endif #if CYTHON_METH_FASTCALL #define __Pyx_METH_FASTCALL METH_FASTCALL @@ -1103,7 +1108,7 @@ static CYTHON_INLINE PyObject * __Pyx_PyDict_GetItemStrWithError(PyObject *dict, #define __Pyx_PyBytes_GET_SIZE(o) PyBytes_Size(o) #define __Pyx_PyByteArray_GET_SIZE(o) PyByteArray_Size(o) #endif -#if PY_VERSION_HEX >= 0x030d00A1 +#if __PYX_LIMITED_VERSION_HEX >= 0x030d00A1 #define __Pyx_PyImport_AddModuleRef(name) PyImport_AddModuleRef(name) #else static CYTHON_INLINE PyObject *__Pyx_PyImport_AddModuleRef(const char *name) { @@ -1190,7 +1195,7 @@ static CYTHON_INLINE float __PYX_NAN() { #endif #define __PYX_MARK_ERR_POS(f_index, lineno) \ - { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } + { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } #define __PYX_ERR(f_index, lineno, Ln_error) \ { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } @@ -1297,24 +1302,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); #define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) #define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) #define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) -#if CYTHON_COMPILING_IN_LIMITED_API -static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const wchar_t *u) -{ - const wchar_t *u_end = u; - while (*u_end++) ; - return (size_t)(u_end - u - 1); -} -#else -static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) -{ - const Py_UNICODE *u_end = u; - while (*u_end++) ; - return (size_t)(u_end - u - 1); -} -#endif #define __Pyx_PyUnicode_FromOrdinal(o) PyUnicode_FromOrdinal((int)o) -#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) -#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode #define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode #define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) #define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) @@ -1364,7 +1352,7 @@ static CYTHON_INLINE Py_hash_t __Pyx_PyIndex_AsHash_t(PyObject*); #endif typedef Py_ssize_t __Pyx_compact_pylong; typedef size_t __Pyx_compact_upylong; - #else // Py < 3.12 + #else #define __Pyx_PyLong_IsNeg(x) (Py_SIZE(x) < 0) #define __Pyx_PyLong_IsNonNeg(x) (Py_SIZE(x) >= 0) #define __Pyx_PyLong_IsZero(x) (Py_SIZE(x) == 0) @@ -1483,11 +1471,11 @@ static const char *__pyx_filename; /* #### Code section: filename_table ### */ static const char *__pyx_f[] = { - "venv/lib/python3.10/site-packages/Cython/Includes/cpython/contextvars.pxd", + "chenv/lib/python3.10/site-packages/Cython/Includes/cpython/contextvars.pxd", "clickhouse_driver/varint.pyx", - "venv/lib/python3.10/site-packages/Cython/Includes/cpython/type.pxd", - "venv/lib/python3.10/site-packages/Cython/Includes/cpython/bool.pxd", - "venv/lib/python3.10/site-packages/Cython/Includes/cpython/complex.pxd", + "chenv/lib/python3.10/site-packages/Cython/Includes/cpython/type.pxd", + "chenv/lib/python3.10/site-packages/Cython/Includes/cpython/bool.pxd", + "chenv/lib/python3.10/site-packages/Cython/Includes/cpython/complex.pxd", }; /* #### Code section: utility_code_proto_before_types ### */ /* ForceInitThreads.proto */ @@ -1635,8 +1623,8 @@ static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int #define __Pyx_Arg_NewRef_VARARGS(arg) __Pyx_NewRef(arg) #define __Pyx_Arg_XDECREF_VARARGS(arg) Py_XDECREF(arg) #else - #define __Pyx_Arg_NewRef_VARARGS(arg) arg // no-op - #define __Pyx_Arg_XDECREF_VARARGS(arg) // no-op - arg is borrowed + #define __Pyx_Arg_NewRef_VARARGS(arg) arg + #define __Pyx_Arg_XDECREF_VARARGS(arg) #endif #define __Pyx_NumKwargs_VARARGS(kwds) PyDict_Size(kwds) #define __Pyx_KwValues_VARARGS(args, nargs) NULL @@ -1652,8 +1640,9 @@ static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int #else #define __Pyx_KwargsAsDict_FASTCALL(kw, kwvalues) _PyStack_AsDict(kwvalues, kw) #endif - #define __Pyx_Arg_NewRef_FASTCALL(arg) arg // no-op, __Pyx_Arg_FASTCALL is direct and this needs - #define __Pyx_Arg_XDECREF_FASTCALL(arg) // no-op - arg was returned from array + #define __Pyx_Arg_NewRef_FASTCALL(arg) arg /* no-op, __Pyx_Arg_FASTCALL is direct and this needs + to have the same reference counting */ + #define __Pyx_Arg_XDECREF_FASTCALL(arg) #else #define __Pyx_Arg_FASTCALL __Pyx_Arg_VARARGS #define __Pyx_NumKwargs_FASTCALL __Pyx_NumKwargs_VARARGS @@ -1743,22 +1732,22 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObject **args, size_t nargs, PyObject *kwargs); /* TypeImport.proto */ -#ifndef __PYX_HAVE_RT_ImportType_proto_3_0_6 -#define __PYX_HAVE_RT_ImportType_proto_3_0_6 +#ifndef __PYX_HAVE_RT_ImportType_proto_3_0_9 +#define __PYX_HAVE_RT_ImportType_proto_3_0_9 #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L #include #endif #if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || __cplusplus >= 201103L -#define __PYX_GET_STRUCT_ALIGNMENT_3_0_6(s) alignof(s) +#define __PYX_GET_STRUCT_ALIGNMENT_3_0_9(s) alignof(s) #else -#define __PYX_GET_STRUCT_ALIGNMENT_3_0_6(s) sizeof(void*) +#define __PYX_GET_STRUCT_ALIGNMENT_3_0_9(s) sizeof(void*) #endif -enum __Pyx_ImportType_CheckSize_3_0_6 { - __Pyx_ImportType_CheckSize_Error_3_0_6 = 0, - __Pyx_ImportType_CheckSize_Warn_3_0_6 = 1, - __Pyx_ImportType_CheckSize_Ignore_3_0_6 = 2 +enum __Pyx_ImportType_CheckSize_3_0_9 { + __Pyx_ImportType_CheckSize_Error_3_0_9 = 0, + __Pyx_ImportType_CheckSize_Warn_3_0_9 = 1, + __Pyx_ImportType_CheckSize_Ignore_3_0_9 = 2 }; -static PyTypeObject *__Pyx_ImportType_3_0_6(PyObject* module, const char *module_name, const char *class_name, size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_6 check_size); +static PyTypeObject *__Pyx_ImportType_3_0_9(PyObject* module, const char *module_name, const char *class_name, size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_9 check_size); #endif /* IncludeStructmemberH.proto */ @@ -1859,7 +1848,7 @@ typedef struct { #endif void *defaults; int defaults_pyobjects; - size_t defaults_size; // used by FusedFunction for copying defaults + size_t defaults_size; int flags; PyObject *defaults_tuple; PyObject *defaults_kwdict; @@ -3908,23 +3897,23 @@ static int __Pyx_modinit_type_import_code(void) { /*--- Type import code ---*/ __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 9, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_ptype_7cpython_4type_type = __Pyx_ImportType_3_0_6(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", + __pyx_ptype_7cpython_4type_type = __Pyx_ImportType_3_0_9(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 - sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_6(PyTypeObject), + sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_9(PyTypeObject), #elif CYTHON_COMPILING_IN_LIMITED_API - sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_6(PyTypeObject), + sizeof(PyTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_9(PyTypeObject), #else - sizeof(PyHeapTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_6(PyHeapTypeObject), + sizeof(PyHeapTypeObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_9(PyHeapTypeObject), #endif - __Pyx_ImportType_CheckSize_Warn_3_0_6); if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(2, 9, __pyx_L1_error) + __Pyx_ImportType_CheckSize_Warn_3_0_9); if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(2, 9, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 8, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_ptype_7cpython_4bool_bool = __Pyx_ImportType_3_0_6(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "bool", sizeof(PyBoolObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_6(PyBoolObject),__Pyx_ImportType_CheckSize_Warn_3_0_6); if (!__pyx_ptype_7cpython_4bool_bool) __PYX_ERR(3, 8, __pyx_L1_error) + __pyx_ptype_7cpython_4bool_bool = __Pyx_ImportType_3_0_9(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "bool", sizeof(PyBoolObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_9(PyBoolObject),__Pyx_ImportType_CheckSize_Warn_3_0_9); if (!__pyx_ptype_7cpython_4bool_bool) __PYX_ERR(3, 8, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(4, 15, __pyx_L1_error) __Pyx_GOTREF(__pyx_t_1); - __pyx_ptype_7cpython_7complex_complex = __Pyx_ImportType_3_0_6(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "complex", sizeof(PyComplexObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_6(PyComplexObject),__Pyx_ImportType_CheckSize_Warn_3_0_6); if (!__pyx_ptype_7cpython_7complex_complex) __PYX_ERR(4, 15, __pyx_L1_error) + __pyx_ptype_7cpython_7complex_complex = __Pyx_ImportType_3_0_9(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "complex", sizeof(PyComplexObject), __PYX_GET_STRUCT_ALIGNMENT_3_0_9(PyComplexObject),__Pyx_ImportType_CheckSize_Warn_3_0_9); if (!__pyx_ptype_7cpython_7complex_complex) __PYX_ERR(4, 15, __pyx_L1_error) __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_RefNannyFinishContext(); return 0; @@ -4138,7 +4127,7 @@ static CYTHON_SMALL_CODE int __pyx_pymod_exec_varint(PyObject *__pyx_pyinit_modu __pyx_t_1 = PyModule_Create(&__pyx_moduledef); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1, __pyx_L1_error) { int add_module_result = PyState_AddModule(__pyx_t_1, &__pyx_moduledef); - __pyx_t_1 = 0; /* transfer ownership from __pyx_t_1 to varint pseudovariable */ + __pyx_t_1 = 0; /* transfer ownership from __pyx_t_1 to "varint" pseudovariable */ if (unlikely((add_module_result < 0))) __PYX_ERR(1, 1, __pyx_L1_error) pystate_addmodule_run = 1; } @@ -4541,11 +4530,11 @@ static CYTHON_INLINE PyObject * __Pyx_GetKwValue_FASTCALL(PyObject *kwnames, PyO { int eq = __Pyx_PyUnicode_Equals(s, PyTuple_GET_ITEM(kwnames, i), Py_EQ); if (unlikely(eq != 0)) { - if (unlikely(eq < 0)) return NULL; // error + if (unlikely(eq < 0)) return NULL; return kwvalues[i]; } } - return NULL; // not found (no exception set) + return NULL; } #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030d0000 CYTHON_UNUSED static PyObject *__Pyx_KwargsAsDict_FASTCALL(PyObject *kwnames, PyObject *const *kwvalues) { @@ -4632,7 +4621,7 @@ static int __Pyx_ParseOptionalKeywords( if (*name) { values[name-argnames] = value; #if CYTHON_AVOID_BORROWED_REFS - Py_INCREF(value); // transfer ownership of value to values + Py_INCREF(value); Py_DECREF(key); #endif key = NULL; @@ -4651,7 +4640,7 @@ static int __Pyx_ParseOptionalKeywords( && _PyString_Eq(**name, key)) { values[name-argnames] = value; #if CYTHON_AVOID_BORROWED_REFS - value = NULL; // ownership transferred to values + value = NULL; #endif break; } @@ -4683,7 +4672,7 @@ static int __Pyx_ParseOptionalKeywords( if (cmp == 0) { values[name-argnames] = value; #if CYTHON_AVOID_BORROWED_REFS - value = NULL; // ownership transferred to values + value = NULL; #endif break; } @@ -5029,10 +5018,10 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_FastCallDict(PyObject *func, PyObj } /* TypeImport */ -#ifndef __PYX_HAVE_RT_ImportType_3_0_6 -#define __PYX_HAVE_RT_ImportType_3_0_6 -static PyTypeObject *__Pyx_ImportType_3_0_6(PyObject *module, const char *module_name, const char *class_name, - size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_6 check_size) +#ifndef __PYX_HAVE_RT_ImportType_3_0_9 +#define __PYX_HAVE_RT_ImportType_3_0_9 +static PyTypeObject *__Pyx_ImportType_3_0_9(PyObject *module, const char *module_name, const char *class_name, + size_t size, size_t alignment, enum __Pyx_ImportType_CheckSize_3_0_9 check_size) { PyObject *result = 0; char warning[200]; @@ -5086,7 +5075,7 @@ static PyTypeObject *__Pyx_ImportType_3_0_6(PyObject *module, const char *module module_name, class_name, size, basicsize+itemsize); goto bad; } - if (check_size == __Pyx_ImportType_CheckSize_Error_3_0_6 && + if (check_size == __Pyx_ImportType_CheckSize_Error_3_0_9 && ((size_t)basicsize > size || (size_t)(basicsize + itemsize) < size)) { PyErr_Format(PyExc_ValueError, "%.200s.%.200s size changed, may indicate binary incompatibility. " @@ -5094,7 +5083,7 @@ static PyTypeObject *__Pyx_ImportType_3_0_6(PyObject *module, const char *module module_name, class_name, size, basicsize, basicsize+itemsize); goto bad; } - else if (check_size == __Pyx_ImportType_CheckSize_Warn_3_0_6 && (size_t)basicsize > size) { + else if (check_size == __Pyx_ImportType_CheckSize_Warn_3_0_9 && (size_t)basicsize > size) { PyOS_snprintf(warning, sizeof(warning), "%s.%s size changed, may indicate binary incompatibility. " "Expected %zd from C header, got %zd from PyObject", @@ -6167,7 +6156,7 @@ static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS(PyObject *func, default: return NULL; } - return ((_PyCFunctionFastWithKeywords)(void(*)(void))def->ml_meth)(self, args, nargs, kwnames); + return ((__Pyx_PyCFunctionFastWithKeywords)(void(*)(void))def->ml_meth)(self, args, nargs, kwnames); } static PyObject * __Pyx_CyFunction_Vectorcall_FASTCALL_KEYWORDS_METHOD(PyObject *func, PyObject *const *args, size_t nargsf, PyObject *kwnames) { @@ -6783,7 +6772,7 @@ static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( #else py_code = PyCode_NewEmpty(filename, funcname, py_line); #endif - Py_XDECREF(py_funcname); // XDECREF since it's only set on Py3 if cline + Py_XDECREF(py_funcname); return py_code; bad: Py_XDECREF(py_funcname); diff --git a/tests/test_insert.py b/tests/test_insert.py index 2d76ed8e..15faac66 100644 --- a/tests/test_insert.py +++ b/tests/test_insert.py @@ -1,235 +1,290 @@ from datetime import date +from unittest import skipIf from tests.testcase import BaseTestCase from clickhouse_driver import errors from clickhouse_driver.errors import ServerException from tests.util import require_server_version +try: + import pandas as pd + + PANDAS_IMPORTED = True +except ImportError: + PANDAS_IMPORTED = False + class InsertTestCase(BaseTestCase): def test_type_mismatch(self): - with self.create_table('a Float32'): + with self.create_table("a Float32"): with self.assertRaises(errors.TypeMismatchError): - data = [(date(2012, 10, 25), )] - self.client.execute( - 'INSERT INTO test (a) VALUES', data - ) + data = [(date(2012, 10, 25),)] + self.client.execute("INSERT INTO test (a) VALUES", data) def test_no_such_column(self): - with self.create_table('a Float32'): + with self.create_table("a Float32"): with self.assertRaises(ServerException): - data = [(1, )] - self.client.execute( - 'INSERT INTO test (b) VALUES', data - ) + data = [(1,)] + self.client.execute("INSERT INTO test (b) VALUES", data) def test_data_malformed_rows(self): - with self.create_table('a Int8'), self.assertRaises(TypeError): + with self.create_table("a Int8"), self.assertRaises(TypeError): data = [1] - self.client.execute( - 'INSERT INTO test (a) VALUES', data - ) + self.client.execute("INSERT INTO test (a) VALUES", data) def test_data_less_columns_then_expected(self): - with self.create_table('a Int8, b Int8'): + with self.create_table("a Int8, b Int8"): with self.assertRaises(ValueError) as e: - data = [(1, )] - self.client.execute( - 'INSERT INTO test (a, b) VALUES', data - ) - self.assertEqual(str(e.exception), 'Expected 2 columns, got 1') + data = [(1,)] + self.client.execute("INSERT INTO test (a, b) VALUES", data) + self.assertEqual(str(e.exception), "Expected 2 columns, got 1") def test_data_more_columns_then_expected(self): - with self.create_table('a Int8, b Int8'): + with self.create_table("a Int8, b Int8"): with self.assertRaises(ValueError) as e: data = [(1, 2, 3)] - self.client.execute( - 'INSERT INTO test (a, b) VALUES', data - ) - self.assertEqual(str(e.exception), 'Expected 2 columns, got 3') + self.client.execute("INSERT INTO test (a, b) VALUES", data) + self.assertEqual(str(e.exception), "Expected 2 columns, got 3") def test_data_different_rows_length(self): - with self.create_table('a Int8, b Int8'): + with self.create_table("a Int8, b Int8"): with self.assertRaises(ValueError) as e: - data = [(1, 2), (3, )] - self.client.execute( - 'INSERT INTO test (a, b) VALUES', data - ) - self.assertEqual(str(e.exception), 'Different rows length') + data = [(1, 2), (3,)] + self.client.execute("INSERT INTO test (a, b) VALUES", data) + self.assertEqual(str(e.exception), "Different rows length") def test_data_different_rows_length_from_dicts(self): - with self.create_table('a Int8, b Int8'): + with self.create_table("a Int8, b Int8"): with self.assertRaises(KeyError): - data = [{'a': 1, 'b': 2}, {'a': 3}] - self.client.execute( - 'INSERT INTO test (a, b) VALUES', data - ) + data = [{"a": 1, "b": 2}, {"a": 3}] + self.client.execute("INSERT INTO test (a, b) VALUES", data) def test_data_unsupported_row_type(self): - with self.create_table('a Int8'): + with self.create_table("a Int8"): with self.assertRaises(TypeError) as e: data = [1] self.client.execute( - 'INSERT INTO test (a) VALUES', data, types_check=True + "INSERT INTO test (a) VALUES", data, types_check=True ) - self.assertIn('dict, list or tuple is expected', str(e.exception)) + self.assertIn("dict, list or tuple is expected", str(e.exception)) def test_data_dicts_ok(self): - with self.create_table('a Int8, b Int8'): - data = [{'a': 1, 'b': 2}, {'a': 3, 'b': 4}] - self.client.execute( - 'INSERT INTO test (a, b) VALUES', data - ) + with self.create_table("a Int8, b Int8"): + data = [{"a": 1, "b": 2}, {"a": 3, "b": 4}] + self.client.execute("INSERT INTO test (a, b) VALUES", data) - query = 'SELECT * FROM test' + query = "SELECT * FROM test" inserted = self.emit_cli(query) - self.assertEqual(inserted, '1\t2\n3\t4\n') + self.assertEqual(inserted, "1\t2\n3\t4\n") inserted = self.client.execute(query) self.assertEqual(inserted, [(1, 2), (3, 4)]) def test_data_generator_type(self): - with self.create_table('a Int8'): - data = ((x, ) for x in range(3)) - self.client.execute( - 'INSERT INTO test (a) VALUES', data - ) - query = 'SELECT * FROM test' + with self.create_table("a Int8"): + data = ((x,) for x in range(3)) + self.client.execute("INSERT INTO test (a) VALUES", data) + query = "SELECT * FROM test" inserted = self.emit_cli(query) - self.assertEqual(inserted, '0\n1\n2\n') + self.assertEqual(inserted, "0\n1\n2\n") inserted = self.client.execute(query) - self.assertEqual(inserted, [(0,), (1, ), (2, )]) + self.assertEqual(inserted, [(0,), (1,), (2,)]) def test_data_dicts_mixed_with_lists(self): - with self.create_table('a Int8'): + with self.create_table("a Int8"): with self.assertRaises(TypeError) as e: - data = [{'a': 1}, (2, )] + data = [{"a": 1}, (2,)] self.client.execute( - 'INSERT INTO test (a) VALUES', data, types_check=True + "INSERT INTO test (a) VALUES", data, types_check=True ) - self.assertIn('dict is expected', str(e.exception)) + self.assertIn("dict is expected", str(e.exception)) with self.assertRaises(TypeError) as e: - data = [(1, ), {'a': 2}] + data = [(1,), {"a": 2}] self.client.execute( - 'INSERT INTO test (a) VALUES', data, types_check=True + "INSERT INTO test (a) VALUES", data, types_check=True ) - self.assertIn('list or tuple is expected', str(e.exception)) + self.assertIn("list or tuple is expected", str(e.exception)) def test_empty_insert(self): - with self.create_table('a Int8'): - self.client.execute( - 'INSERT INTO test (a) VALUES', [] - ) + with self.create_table("a Int8"): + self.client.execute("INSERT INTO test (a) VALUES", []) - query = 'SELECT * FROM test' + query = "SELECT * FROM test" inserted = self.emit_cli(query) - self.assertEqual(inserted, '') + self.assertEqual(inserted, "") inserted = self.client.execute(query) self.assertEqual(inserted, []) def test_insert_from_select(self): - with self.create_table('a UInt64'): + with self.create_table("a UInt64"): inserted = self.client.execute( - 'INSERT INTO test (a) ' - 'SELECT number FROM system.numbers LIMIT 5' + "INSERT INTO test (a) " "SELECT number FROM system.numbers LIMIT 5" ) self.assertEqual(inserted, []) def test_insert_return(self): - with self.create_table('a Int8'): - rv = self.client.execute( - 'INSERT INTO test (a) VALUES', [] - ) + with self.create_table("a Int8"): + rv = self.client.execute("INSERT INTO test (a) VALUES", []) self.assertEqual(rv, 0) rv = self.client.execute( - 'INSERT INTO test (a) VALUES', [(x,) for x in range(5)] + "INSERT INTO test (a) VALUES", [(x,) for x in range(5)] ) self.assertEqual(rv, 5) @require_server_version(22, 3, 6) def test_insert_from_input(self): - with self.create_table('a Int8'): - data = [{'a': 1}] + with self.create_table("a Int8"): + data = [{"a": 1}] self.client.execute( - "INSERT INTO test (a) " - "SELECT a FROM input ('a Int8') FORMAT Native", - data + "INSERT INTO test (a) " "SELECT a FROM input ('a Int8') FORMAT Native", + data, ) - query = 'SELECT * FROM test' + query = "SELECT * FROM test" inserted = self.emit_cli(query) - self.assertEqual(inserted, '1\n') + self.assertEqual(inserted, "1\n") def test_profile_events(self): - with self.create_table('x Int32'): - data = [{'x': 1}] - self.client.execute( - 'INSERT INTO test (x) VALUES', data - ) + with self.create_table("x Int32"): + data = [{"x": 1}] + self.client.execute("INSERT INTO test (x) VALUES", data) class InsertColumnarTestCase(BaseTestCase): def test_insert_tuple_ok(self): - with self.create_table('a Int8, b Int8'): + with self.create_table("a Int8, b Int8"): data = [(1, 2, 3), (4, 5, 6)] - self.client.execute( - 'INSERT INTO test (a, b) VALUES', data, columnar=True - ) + self.client.execute("INSERT INTO test (a, b) VALUES", data, columnar=True) - query = 'SELECT * FROM test' + query = "SELECT * FROM test" inserted = self.emit_cli(query) - self.assertEqual(inserted, '1\t4\n2\t5\n3\t6\n') + self.assertEqual(inserted, "1\t4\n2\t5\n3\t6\n") inserted = self.client.execute(query) self.assertEqual(inserted, [(1, 4), (2, 5), (3, 6)]) inserted = self.client.execute(query, columnar=True) self.assertEqual(inserted, [(1, 2, 3), (4, 5, 6)]) def test_insert_data_different_column_length(self): - with self.create_table('a Int8, b Int8'): + with self.create_table("a Int8, b Int8"): with self.assertRaises(ValueError) as e: data = [(1, 2, 3), (4, 5)] self.client.execute( - 'INSERT INTO test (a, b) VALUES', data, columnar=True + "INSERT INTO test (a, b) VALUES", data, columnar=True ) - self.assertEqual(str(e.exception), 'Expected 3 rows, got 2') + self.assertEqual(str(e.exception), "Expected 3 rows, got 2") def test_data_less_columns_then_expected(self): - with self.create_table('a Int8, b Int8'): + with self.create_table("a Int8, b Int8"): with self.assertRaises(ValueError) as e: data = [(1, 2)] self.client.execute( - 'INSERT INTO test (a, b) VALUES', data, columnar=True + "INSERT INTO test (a, b) VALUES", data, columnar=True ) - self.assertEqual(str(e.exception), 'Expected 2 columns, got 1') + self.assertEqual(str(e.exception), "Expected 2 columns, got 1") def test_data_more_columns_then_expected(self): - with self.create_table('a Int8, b Int8'): + with self.create_table("a Int8, b Int8"): with self.assertRaises(ValueError) as e: data = [(1, 2), (3, 4), (5, 6)] self.client.execute( - 'INSERT INTO test (a, b) VALUES', data, columnar=True + "INSERT INTO test (a, b) VALUES", data, columnar=True ) - self.assertEqual(str(e.exception), 'Expected 2 columns, got 3') + self.assertEqual(str(e.exception), "Expected 2 columns, got 3") def test_data_invalid_types(self): - with self.create_table('a Int8, b Int8'): + with self.create_table("a Int8, b Int8"): with self.assertRaises(TypeError) as e: - data = [(1, 2), {'a': 3, 'b': 4}] + data = [(1, 2), {"a": 3, "b": 4}] self.client.execute( - 'INSERT INTO test (a, b) VALUES', data, - types_check=True, columnar=True + "INSERT INTO test (a, b) VALUES", + data, + types_check=True, + columnar=True, ) - self.assertIn('list or tuple is expected', str(e.exception)) + self.assertIn("Expected list, tuple or numpy.ndarray", str(e.exception)) with self.assertRaises(TypeError) as e: data = [(1, 2), 3] self.client.execute( - 'INSERT INTO test (a, b) VALUES', data, - types_check=True, columnar=True + "INSERT INTO test (a, b) VALUES", + data, + types_check=True, + columnar=True, ) - self.assertIn('list or tuple is expected', str(e.exception)) + self.assertIn("Expected list, tuple or numpy.ndarray", str(e.exception)) + + +@skipIf(not PANDAS_IMPORTED, reason="pandas cannot be imported") +class InsertDataFrameTestCase(BaseTestCase): + """The test suite on pandas.DataFrame insertions.""" + + def test_insert_the_frame_with_dict_rows(self): + """https://github.com/mymarilyn/clickhouse-driver/issues/417""" + + with self.create_table("a Tuple(x Float32, y Float32)"): + df = pd.DataFrame( + [ + { + "a": (0.1, 0.1), + }, + ] + ) + self.client.insert_dataframe("INSERT INTO test VALUES", df) + + df = pd.DataFrame( + [ + { + "a": {"x": 0.2, "y": 0.2}, + }, + ] + ) + self.client.insert_dataframe("INSERT INTO test VALUES", df) + + df = pd.DataFrame( + [ + { + "a": {"x": 0.3, "y": 0.3}, + }, + ] + ) + self.client.insert_dataframe( + "INSERT INTO test VALUES", df, settings={"use_numpy": False} + ) + + df = pd.DataFrame( + [ + { + "a": (0.4, 0.4), + }, + ] + ) + self.client.execute("INSERT INTO test VALUES", df.values.tolist()) + + df = pd.DataFrame( + [ + { + "a": (0.5, 0.5), + }, + ] + ) + self.client.execute( + "INSERT INTO test VALUES", + df.values.tolist(), + settings={"use_numpy": False}, + ) + + query = "SELECT * FROM test" + result = self.client.execute(query) + # normalising the result + result = [tuple(map(lambda val: round(val, 1), row[0])) for row in result] + + # sorted for ensuring the order - data races + self.assertEqual( + sorted(result), + [(0.1, 0.1), (0.2, 0.2), (0.3, 0.3), (0.4, 0.4), (0.5, 0.5)], + ) From ce779ca9c75ba87754277e35acc4fd761395a78a Mon Sep 17 00:00:00 2001 From: Stanley Kudrow Date: Tue, 12 Mar 2024 14:30:26 +0300 Subject: [PATCH 2/2] remove __repr__'s from block.py, pass the changed modules through flake8, black and ruff --- clickhouse_driver/block.py | 26 +++------ clickhouse_driver/client.py | 85 +++++++++++++++++++++------- clickhouse_driver/columns/service.py | 46 +++++++++++---- clickhouse_driver/connection.py | 85 +++++++++++++++++++++------- clickhouse_driver/util/helpers.py | 9 +-- tests/test_insert.py | 22 +++++-- 6 files changed, 193 insertions(+), 80 deletions(-) diff --git a/clickhouse_driver/block.py b/clickhouse_driver/block.py index 0e7a0112..c064d0e6 100644 --- a/clickhouse_driver/block.py +++ b/clickhouse_driver/block.py @@ -8,13 +8,6 @@ class BlockInfo(object): is_overflows = False bucket_num = -1 - def __repr__(self) -> str: - cls_name = self.__class__.__name__ - attrs = { - key: val for key, val in (vars(self)).items() if not key.startswith("_") - } - return f"{cls_name}({', '.join([f'{aname}={aval}' for aname, aval in attrs.items()])})" - def write(self, buf): # Set of pairs (`FIELD_NUM`, value) in binary form. Then 0. write_varint(1, buf) @@ -49,13 +42,6 @@ def __init__( super(BaseBlock, self).__init__() - def __repr__(self) -> str: - cls_name = self.__class__.__name__ - attrs = { - key: val for key, val in (vars(self)).items() if not key.startswith("_") - } - return f"{cls_name}({', '.join([f'{aname}={aval}' for aname, aval in attrs.items()])})" - def normalize(self, data): return data @@ -201,7 +187,9 @@ def _pure_mutate_dicts_to_rows( new_data.append(row[name]) else: new_data.append( - self._pure_mutate_dicts_to_rows(row[name], cwt, check_row_type) + self._pure_mutate_dicts_to_rows( + row[name], cwt, check_row_type + ) ) data[i] = new_data # return for recursion @@ -223,15 +211,15 @@ def _check_rows(self, data): def _check_row_type(self, row): if not isinstance(row, self.supported_row_types): raise TypeError( - "Unsupported row type: {}. dict, list or tuple is expected.".format( - type(row) - ) + f"Unsupported row type: {type(row)}. " + "dict, list or tuple is expected." ) def _check_tuple_row_type(self, row): if not isinstance(row, self.tuple_row_types): raise TypeError( - "Unsupported row type: {}. list or tuple is expected.".format(type(row)) + f"Unsupported row type: {type(row)}. " + "list or tuple is expected." ) def _check_dict_row_type(self, row): diff --git a/clickhouse_driver/client.py b/clickhouse_driver/client.py index 6ff9d178..0360b794 100644 --- a/clickhouse_driver/client.py +++ b/clickhouse_driver/client.py @@ -11,7 +11,12 @@ from .connection import Connection from .log import log_block from .protocol import ServerPacketTypes -from .result import IterQueryResult, ProgressQueryResult, QueryResult, QueryInfo +from .result import ( + IterQueryResult, + ProgressQueryResult, + QueryResult, + QueryInfo, +) from .util.escape import escape_params from .util.helpers import column_chunks, chunks, asbool @@ -108,8 +113,12 @@ def __init__(self, *args, **kwargs): "input_format_null_as_default": self.settings.pop( "input_format_null_as_default", False ), - "namedtuple_as_json": self.settings.pop("namedtuple_as_json", True), - "server_side_params": self.settings.pop("server_side_params", False), + "namedtuple_as_json": self.settings.pop( + "namedtuple_as_json", True + ), + "server_side_params": self.settings.pop( + "server_side_params", False + ), } if self.client_settings["use_numpy"]: @@ -191,7 +200,9 @@ def disconnect_connection(self): def reset_last_query(self): self.last_query = None - def receive_result(self, with_column_types=False, progress=False, columnar=False): + def receive_result( + self, with_column_types=False, progress=False, columnar=False + ): gen = self.packet_generator() @@ -209,7 +220,9 @@ def receive_result(self, with_column_types=False, progress=False, columnar=False def iter_receive_result(self, with_column_types=False): gen = self.packet_generator() - result = self.iter_query_result_cls(gen, with_column_types=with_column_types) + result = self.iter_query_result_cls( + gen, with_column_types=with_column_types + ) for rows in result: for row in rows: @@ -535,10 +548,17 @@ def query_dataframe( if replace_nonwords: columns = [re.sub(r"\W", "_", x) for x in columns] - return pd.DataFrame({col: d for d, col in zip(data, columns)}, columns=columns) + return pd.DataFrame( + {col: d for d, col in zip(data, columns)}, columns=columns + ) def insert_dataframe( - self, query, dataframe, external_tables=None, query_id=None, settings=None + self, + query, + dataframe, + external_tables=None, + query_id=None, + settings=None, ): """ *New in version 0.2.0.* @@ -577,7 +597,7 @@ def insert_dataframe( f"DataFrame has missing required columns: {list(diff)}" ) - # TODO: to find a more pandas-idiomatic way of data "tuplefication" + # TODO: to find a more pandas-idiomatic way data = [] for column in columns: column_values = dataframe[column].values @@ -604,12 +624,18 @@ def process_ordinary_query_with_progress( ): if params is not None: - query = self.substitute_params(query, params, self.connection.context) + query = self.substitute_params( + query, params, self.connection.context + ) self.connection.send_query(query, query_id=query_id, params=params) - self.connection.send_external_tables(external_tables, types_check=types_check) + self.connection.send_external_tables( + external_tables, types_check=types_check + ) return self.receive_result( - with_column_types=with_column_types, progress=True, columnar=columnar + with_column_types=with_column_types, + progress=True, + columnar=columnar, ) def process_ordinary_query( @@ -624,9 +650,13 @@ def process_ordinary_query( ): if params is not None: - query = self.substitute_params(query, params, self.connection.context) + query = self.substitute_params( + query, params, self.connection.context + ) self.connection.send_query(query, query_id=query_id, params=params) - self.connection.send_external_tables(external_tables, types_check=types_check) + self.connection.send_external_tables( + external_tables, types_check=types_check + ) return self.receive_result( with_column_types=with_column_types, columnar=columnar ) @@ -642,10 +672,14 @@ def iter_process_ordinary_query( ): if params is not None: - query = self.substitute_params(query, params, self.connection.context) + query = self.substitute_params( + query, params, self.connection.context + ) self.connection.send_query(query, query_id=query_id, params=params) - self.connection.send_external_tables(external_tables, types_check=types_check) + self.connection.send_external_tables( + external_tables, types_check=types_check + ) return self.iter_receive_result(with_column_types=with_column_types) def process_insert_query( @@ -658,7 +692,9 @@ def process_insert_query( columnar=False, ): self.connection.send_query(query_without_data, query_id=query_id) - self.connection.send_external_tables(external_tables, types_check=types_check) + self.connection.send_external_tables( + external_tables, types_check=types_check + ) sample_block = self.receive_sample_block() if sample_block: @@ -782,7 +818,10 @@ def receive_end_of_insert_query(self): def receive_profile_events(self): revision = self.connection.server_info.used_revision - if revision < defines.DBMS_MIN_PROTOCOL_VERSION_WITH_PROFILE_EVENTS_IN_INSERT: + if ( + revision + < defines.DBMS_MIN_PROTOCOL_VERSION_WITH_PROFILE_EVENTS_IN_INSERT + ): return None while True: @@ -881,7 +920,11 @@ def from_url(cls, url): kwargs["secure"] = True compression_algs = {"lz4", "lz4hc", "zstd"} - timeouts = {"connect_timeout", "send_receive_timeout", "sync_request_timeout"} + timeouts = { + "connect_timeout", + "send_receive_timeout", + "sync_request_timeout", + } for name, value in parse_qs(url.query).items(): if not value or not len(value): @@ -922,7 +965,11 @@ def from_url(cls, url): kwargs[name] = asbool(value) except ValueError: parts = value.split(",") - kwargs[name] = (float(parts[0]), float(parts[1]), int(parts[2])) + kwargs[name] = ( + float(parts[0]), + float(parts[1]), + int(parts[2]), + ) elif name == "client_revision": kwargs[name] = int(value) diff --git a/clickhouse_driver/columns/service.py b/clickhouse_driver/columns/service.py index 3efb896f..8c624144 100644 --- a/clickhouse_driver/columns/service.py +++ b/clickhouse_driver/columns/service.py @@ -29,7 +29,9 @@ from .nothingcolumn import NothingColumn from .nullcolumn import NullColumn from .nullablecolumn import create_nullable_column -from .simpleaggregatefunctioncolumn import create_simple_aggregate_function_column +from .simpleaggregatefunctioncolumn import ( + create_simple_aggregate_function_column, +) from .stringcolumn import create_string_column from .tuplecolumn import create_tuple_column from .nestedcolumn import create_nested_column @@ -108,7 +110,8 @@ def get_column_by_spec(spec, column_options, use_numpy=None): except errors.UnknownTypeError: use_numpy = False logger.warning( - f"NumPy support is not implemented for {spec}. Using generic column" + f"NumPy support is not implemented for {spec}. " + "Using a generic column" ) def create_column_with_options(x): @@ -123,11 +126,17 @@ def create_column_with_options(x): elif spec.startswith("Decimal"): return create_decimal_column(spec, column_options) elif spec.startswith("Array"): - return create_array_column(spec, create_column_with_options, column_options) + return create_array_column( + spec, create_column_with_options, column_options + ) elif spec.startswith("Tuple"): - return create_tuple_column(spec, create_column_with_options, column_options) + return create_tuple_column( + spec, create_column_with_options, column_options + ) elif spec.startswith("Nested"): - return create_nested_column(spec, create_column_with_options, column_options) + return create_nested_column( + spec, create_column_with_options, column_options + ) elif spec.startswith("Nullable"): return create_nullable_column(spec, create_column_with_options) elif spec.startswith("LowCardinality"): @@ -135,15 +144,23 @@ def create_column_with_options(x): spec, create_column_with_options, column_options ) elif spec.startswith("SimpleAggregateFunction"): - return create_simple_aggregate_function_column(spec, create_column_with_options) + return create_simple_aggregate_function_column( + spec, create_column_with_options + ) elif spec.startswith("Map"): - return create_map_column(spec, create_column_with_options, column_options) + return create_map_column( + spec, create_column_with_options, column_options + ) elif spec.startswith("Object('json')"): - return create_json_column(spec, create_column_with_options, column_options) + return create_json_column( + spec, create_column_with_options, column_options + ) else: for alias, primitive in aliases: if spec.startswith(alias): - return create_column_with_options(primitive + spec[len(alias) :]) + return create_column_with_options( + primitive + spec[len(alias) :] # noqa: E203 + ) try: cls = column_by_type[spec] return cls(**column_options) @@ -152,7 +169,12 @@ def create_column_with_options(x): def read_column( - context, column_spec, n_items, buf, use_numpy=None, has_custom_serialization=False + context, + column_spec, + n_items, + buf, + use_numpy=None, + has_custom_serialization=False, ): column_options = { "context": context, @@ -163,7 +185,9 @@ def read_column( return col.read_data(n_items, buf) -def write_column(context, column_name, column_spec, items, buf, types_check=False): +def write_column( + context, column_name, column_spec, items, buf, types_check=False +): column_options = {"context": context, "types_check": types_check} column = get_column_by_spec(column_spec, column_options) diff --git a/clickhouse_driver/connection.py b/clickhouse_driver/connection.py index d7731d10..6e4d18ab 100644 --- a/clickhouse_driver/connection.py +++ b/clickhouse_driver/connection.py @@ -199,7 +199,8 @@ def __init__( self.settings_is_important = settings_is_important self.tcp_keepalive = tcp_keepalive self.client_revision = min( - client_revision or defines.CLIENT_REVISION, defines.CLIENT_REVISION + client_revision or defines.CLIENT_REVISION, + defines.CLIENT_REVISION, ) self.secure_socket = secure @@ -268,7 +269,10 @@ def __repr__(self): else "(not connected)" ) - return "" % (dsn, self.compression) + return "" % ( + dsn, + self.compression, + ) def get_description(self): return "{}:{}".format(self.host, self.port) @@ -390,12 +394,16 @@ def _set_keepalive(self): self.socket.setsockopt( socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, interval_sec ) - self.socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPCNT, probes) + self.socket.setsockopt( + socket.IPPROTO_TCP, socket.TCP_KEEPCNT, probes + ) elif platform == "darwin": TCP_KEEPALIVE = 0x10 # Only interval is available in mac os. - self.socket.setsockopt(socket.IPPROTO_TCP, TCP_KEEPALIVE, interval_sec) + self.socket.setsockopt( + socket.IPPROTO_TCP, TCP_KEEPALIVE, interval_sec + ) def _format_connection_error(self, e, host, port): err = (e.strerror + " ") if e.strerror else "" @@ -405,7 +413,9 @@ def connect(self): if self.connected: self.disconnect() - logger.debug("Connecting. Database: %s. User: %s", self.database, self.user) + logger.debug( + "Connecting. Database: %s. User: %s", self.database, self.user + ) err = None for i in range(len(self.hosts)): @@ -417,13 +427,17 @@ def connect(self): except socket.timeout as e: self.disconnect() - logger.warning("Failed to connect to %s:%s", host, port, exc_info=True) + logger.warning( + "Failed to connect to %s:%s", host, port, exc_info=True + ) err_str = self._format_connection_error(e, host, port) err = errors.SocketTimeoutError(err_str) except socket.error as e: self.disconnect() - logger.warning("Failed to connect to %s:%s", host, port, exc_info=True) + logger.warning( + "Failed to connect to %s:%s", host, port, exc_info=True + ) err_str = self._format_connection_error(e, host, port) err = errors.NetworkError(err_str) @@ -503,7 +517,10 @@ def receive_hello(self): server_timezone = read_binary_str(self.fin) server_display_name = "" - if used_revision >= defines.DBMS_MIN_REVISION_WITH_SERVER_DISPLAY_NAME: + if ( + used_revision + >= defines.DBMS_MIN_REVISION_WITH_SERVER_DISPLAY_NAME + ): server_display_name = read_binary_str(self.fin) server_version_patch = server_revision @@ -512,14 +529,17 @@ def receive_hello(self): if ( used_revision - >= defines.DBMS_MIN_PROTOCOL_VERSION_WITH_PASSWORD_COMPLEXITY_RULES + >= defines.DBMS_MIN_PROTOCOL_VERSION_WITH_PASSWORD_COMPLEXITY_RULES # noqa: E501 ): rules_size = read_varint(self.fin) for _i in range(rules_size): read_binary_str(self.fin) # original_pattern read_binary_str(self.fin) # exception_message - if used_revision >= defines.DBMS_MIN_REVISION_WITH_INTERSERVER_SECRET_V2: + if ( + used_revision + >= defines.DBMS_MIN_REVISION_WITH_INTERSERVER_SECRET_V2 # noqa: E501 + ): read_binary_uint64(self.fin) # read_nonce self.server_info = ServerInfo( @@ -547,7 +567,9 @@ def receive_hello(self): raise self.receive_exception() else: - message = self.unexpected_packet_message("Hello or Exception", packet_type) + message = self.unexpected_packet_message( + "Hello or Exception", packet_type + ) self.disconnect() raise errors.UnexpectedPacketFromServerError(message) @@ -555,7 +577,9 @@ def send_addendum(self): revision = self.server_info.used_revision if revision >= defines.DBMS_MIN_PROTOCOL_VERSION_WITH_QUOTA_KEY: - write_binary_str(self.context.client_settings["quota_key"], self.fout) + write_binary_str( + self.context.client_settings["quota_key"], self.fout + ) def ping(self): timeout = self.sync_request_timeout @@ -580,7 +604,9 @@ def ping(self): except (socket.error, EOFError) as e: # It's just a warning now. # Current connection will be closed, new will be established. - logger.warning("Error on %s ping: %s", self.get_description(), e) + logger.warning( + "Error on %s ping: %s", self.get_description(), e + ) return False return True @@ -617,7 +643,9 @@ def receive_packet(self): pass elif packet_type == ServerPacketTypes.TABLE_COLUMNS: - packet.multistring_message = self.receive_multistring_message(packet_type) + packet.multistring_message = self.receive_multistring_message( + packet_type + ) elif packet_type == ServerPacketTypes.PART_UUIDS: packet.block = self.receive_data() @@ -650,7 +678,10 @@ def get_block_out_stream(self): from .streams.compressed import CompressedBlockOutputStream return CompressedBlockOutputStream( - self.compressor_cls, self.compress_block_size, self.fout, self.context + self.compressor_cls, + self.compress_block_size, + self.fout, + self.context, ) else: return BlockOutputStream(self.fout, self.context) @@ -704,20 +735,26 @@ def send_query(self, query, query_id=None, params=None): revision = self.server_info.used_revision if revision >= defines.DBMS_MIN_REVISION_WITH_CLIENT_INFO: client_info = ClientInfo( - self.client_name, self.context, client_revision=self.client_revision + self.client_name, + self.context, + client_revision=self.client_revision, ) client_info.query_kind = ClientInfo.QueryKind.INITIAL_QUERY client_info.write(revision, self.fout) settings_as_strings = ( - revision >= defines.DBMS_MIN_REVISION_WITH_SETTINGS_SERIALIZED_AS_STRINGS + revision + >= defines.DBMS_MIN_REVISION_WITH_SETTINGS_SERIALIZED_AS_STRINGS ) settings_flags = 0 if self.settings_is_important: settings_flags |= SettingsFlags.IMPORTANT write_settings( - self.context.settings, self.fout, settings_as_strings, settings_flags + self.context.settings, + self.fout, + settings_as_strings, + settings_flags, ) if revision >= defines.DBMS_MIN_REVISION_WITH_INTERSERVER_SECRET: @@ -731,7 +768,9 @@ def send_query(self, query, query_id=None, params=None): if revision >= defines.DBMS_MIN_PROTOCOL_VERSION_WITH_PARAMETERS: if self.context.client_settings["server_side_params"]: # Always settings_as_strings = True - escaped = escape_params(params or {}, self.context, for_server=True) + escaped = escape_params( + params or {}, self.context, for_server=True + ) else: escaped = {} write_settings(escaped, self.fout, True, SettingsFlags.CUSTOM) @@ -748,7 +787,9 @@ def send_cancel(self): def send_external_tables(self, tables, types_check=False): for table in tables or []: if not table["structure"]: - raise ValueError('Empty table "{}" structure'.format(table["name"])) + raise ValueError( + 'Empty table "{}" structure'.format(table["name"]) + ) data = table["data"] block_cls = RowOrientedBlock @@ -761,7 +802,9 @@ def send_external_tables(self, tables, types_check=False): block_cls = NumpyColumnOrientedBlock - block = block_cls(table["structure"], data, types_check=types_check) + block = block_cls( + table["structure"], data, types_check=types_check + ) self.send_data(block, table_name=table["name"]) # Empty block, end of data transfer. diff --git a/clickhouse_driver/util/helpers.py b/clickhouse_driver/util/helpers.py index dda9048c..2e676ee6 100644 --- a/clickhouse_driver/util/helpers.py +++ b/clickhouse_driver/util/helpers.py @@ -19,12 +19,12 @@ def chunks(seq, n): # islice is MUCH slower than slice for lists and tuples. if _check_sequence_to_be_an_expected_iterable(seq): i = 0 - item = seq[i : i + n] - # DeprecationWarning: The truth value of an empty array is ambiguous. -> numpy caused + item = seq[i : i + n] # noqa: E203 + # DeprecationWarning: The truth value of an empty array is ambiguous. while len(item): yield list(item) i += n - item = seq[i : i + n] + item = seq[i : i + n] # noqa: E203 else: it = iter(seq) item = list(islice(it, n)) @@ -43,7 +43,8 @@ def column_chunks(columns, n): for column in columns: if not _check_sequence_to_be_an_expected_iterable(column): raise TypeError( - f"Unsupported column type: {type(column)}. Expected list, tuple or numpy.ndarray" + f"Unsupported column type: {type(column)}. " + "Expected list, tuple or numpy.ndarray" ) # create chunk generator for every column diff --git a/tests/test_insert.py b/tests/test_insert.py index 15faac66..a031012b 100644 --- a/tests/test_insert.py +++ b/tests/test_insert.py @@ -120,7 +120,8 @@ def test_empty_insert(self): def test_insert_from_select(self): with self.create_table("a UInt64"): inserted = self.client.execute( - "INSERT INTO test (a) " "SELECT number FROM system.numbers LIMIT 5" + "INSERT INTO test (a) " + "SELECT number FROM system.numbers LIMIT 5" ) self.assertEqual(inserted, []) @@ -139,7 +140,8 @@ def test_insert_from_input(self): with self.create_table("a Int8"): data = [{"a": 1}] self.client.execute( - "INSERT INTO test (a) " "SELECT a FROM input ('a Int8') FORMAT Native", + "INSERT INTO test (a) " + "SELECT a FROM input ('a Int8') FORMAT Native", data, ) @@ -157,7 +159,9 @@ class InsertColumnarTestCase(BaseTestCase): def test_insert_tuple_ok(self): with self.create_table("a Int8, b Int8"): data = [(1, 2, 3), (4, 5, 6)] - self.client.execute("INSERT INTO test (a, b) VALUES", data, columnar=True) + self.client.execute( + "INSERT INTO test (a, b) VALUES", data, columnar=True + ) query = "SELECT * FROM test" inserted = self.emit_cli(query) @@ -205,7 +209,9 @@ def test_data_invalid_types(self): columnar=True, ) - self.assertIn("Expected list, tuple or numpy.ndarray", str(e.exception)) + self.assertIn( + "Expected list, tuple or numpy.ndarray", str(e.exception) + ) with self.assertRaises(TypeError) as e: data = [(1, 2), 3] @@ -216,7 +222,9 @@ def test_data_invalid_types(self): columnar=True, ) - self.assertIn("Expected list, tuple or numpy.ndarray", str(e.exception)) + self.assertIn( + "Expected list, tuple or numpy.ndarray", str(e.exception) + ) @skipIf(not PANDAS_IMPORTED, reason="pandas cannot be imported") @@ -281,7 +289,9 @@ def test_insert_the_frame_with_dict_rows(self): query = "SELECT * FROM test" result = self.client.execute(query) # normalising the result - result = [tuple(map(lambda val: round(val, 1), row[0])) for row in result] + result = [ + tuple(map(lambda val: round(val, 1), row[0])) for row in result + ] # sorted for ensuring the order - data races self.assertEqual(