From e20c77e4c6f9d8326c387fd0a2833ed959bf1658 Mon Sep 17 00:00:00 2001 From: proller Date: Tue, 19 Feb 2019 23:51:44 +0300 Subject: [PATCH] Add parquet support. Fixes, tests, ... --- .gitmodules | 14 +- CMakeLists.txt | 11 +- cmake/find_boost.cmake | 7 +- cmake/find_libxml2.cmake | 5 +- cmake/find_lz4.cmake | 11 +- cmake/find_parquet.cmake | 91 +- cmake/find_snappy.cmake | 27 + contrib/CMakeLists.txt | 56 +- contrib/arrow | 2 +- contrib/arrow-cmake/CMakeLists.txt | 212 + contrib/arrow-cmake/build/cmake/config.h.in | 1 + .../cpp/src/parquet/parquet_constants.cpp | 17 + .../cpp/src/parquet/parquet_constants.h | 24 + .../cpp/src/parquet/parquet_types.cpp | 6501 +++++++++++++++++ .../cpp/src/parquet/parquet_types.h | 2523 +++++++ .../cpp/src/parquet/parquet_version.h | 24 + contrib/arrow-cmake/cpp/src/thrift/stdcxx.h | 11 + contrib/boost | 2 +- contrib/boost-cmake/CMakeLists.txt | 57 +- contrib/librdkafka-cmake/CMakeLists.txt | 8 +- contrib/lz4-cmake/CMakeLists.txt | 4 + contrib/snappy | 1 + contrib/thrift | 1 + dbms/CMakeLists.txt | 6 +- dbms/programs/server/Server.cpp | 2 +- dbms/src/Common/config.h.in | 2 + .../DataStreams/ParquetBlockInputStream.cpp | 336 - .../src/DataStreams/ParquetBlockInputStream.h | 43 - .../DataStreams/ParquetBlockOutputStream.cpp | 271 - .../DataStreams/ParquetBlockOutputStream.h | 36 - dbms/src/DataTypes/DataTypesDecimal.h | 4 +- dbms/src/Formats/FormatFactory.cpp | 5 + dbms/src/Formats/FormatSettings.h | 6 + .../Formats/ODBCDriver2BlockOutputStream.cpp | 4 - dbms/src/Formats/ParquetBlockInputStream.cpp | 497 ++ dbms/src/Formats/ParquetBlockInputStream.h | 46 + dbms/src/Formats/ParquetBlockOutputStream.cpp | 453 ++ dbms/src/Formats/ParquetBlockOutputStream.h | 46 + .../Formats/TabSeparatedRawRowOutputStream.h | 3 +- dbms/src/IO/readFloatText.h | 2 +- dbms/src/Interpreters/Settings.h | 1 + ...StorageSystemBuildOptions.generated.cpp.in | 5 + .../0_stateless/00700_decimal_casts.sql | 2 - .../0_stateless/00900_parquet.reference | 62 + .../queries/0_stateless/00900_parquet.sh | 136 + .../00900_parquet_create_table_columns.pl | 54 + .../00900_parquet_decimal.reference | 17 + .../0_stateless/00900_parquet_decimal.sh | 111 + .../0_stateless/00900_parquet_load.reference | 729 ++ .../queries/0_stateless/00900_parquet_load.sh | 58 + .../data_parquet/alltypes_dictionary.parquet | Bin 0 -> 1698 bytes .../alltypes_dictionary.parquet.columns | 1 + .../data_parquet/alltypes_plain.parquet | Bin 0 -> 1851 bytes .../alltypes_plain.parquet.columns | 1 + .../alltypes_plain.snappy.parquet | Bin 0 -> 1736 bytes .../alltypes_plain.snappy.parquet.columns | 1 + .../data_parquet/byte_array_decimal.parquet | Bin 0 -> 324 bytes .../byte_array_decimal.parquet.columns | 1 + .../data_parquet/datapage_v2.snappy.parquet | Bin 0 -> 1165 bytes .../datapage_v2.snappy.parquet.columns | 1 + .../fixed_length_decimal_1.parquet | Bin 0 -> 677 bytes .../fixed_length_decimal_1.parquet.columns | 1 + .../fixed_length_decimal_legacy.parquet | Bin 0 -> 537 bytes ...ixed_length_decimal_legacy.parquet.columns | 1 + .../data_parquet/int32_decimal.parquet | Bin 0 -> 478 bytes .../int32_decimal.parquet.columns | 1 + .../data_parquet/int64_decimal.parquet | Bin 0 -> 591 bytes .../int64_decimal.parquet.columns | 1 + .../nation.dict-malformed.parquet | Bin 0 -> 2850 bytes .../nation.dict-malformed.parquet.columns | 1 + .../data_parquet/nested_lists.snappy.parquet | Bin 0 -> 881 bytes .../nested_lists.snappy.parquet.columns | 1 + .../data_parquet/nested_maps.snappy.parquet | Bin 0 -> 1324 bytes .../nested_maps.snappy.parquet.columns | 1 + .../data_parquet/nonnullable.impala.parquet | Bin 0 -> 3186 bytes .../nonnullable.impala.parquet.columns | 1 + .../data_parquet/nullable.impala.parquet | Bin 0 -> 3896 bytes .../nullable.impala.parquet.columns | 1 + .../data_parquet/nulls.snappy.parquet | Bin 0 -> 461 bytes .../data_parquet/nulls.snappy.parquet.columns | 1 + .../repeated_no_annotation.parquet | Bin 0 -> 662 bytes .../repeated_no_annotation.parquet.columns | 1 + .../data_parquet/userdata1.parquet | Bin 0 -> 113629 bytes .../data_parquet/userdata1.parquet.columns | 1 + .../data_parquet/userdata2.parquet | Bin 0 -> 112193 bytes .../data_parquet/userdata2.parquet.columns | 1 + .../data_parquet/userdata3.parquet | Bin 0 -> 113239 bytes .../data_parquet/userdata3.parquet.columns | 1 + .../data_parquet/userdata4.parquet | Bin 0 -> 113060 bytes .../data_parquet/userdata4.parquet.columns | 1 + .../data_parquet/userdata5.parquet | Bin 0 -> 113424 bytes .../data_parquet/userdata5.parquet.columns | 1 + .../v0.7.1.all-named-index.parquet | Bin 0 -> 3948 bytes .../v0.7.1.all-named-index.parquet.columns | 1 + .../v0.7.1.column-metadata-handling.parquet | Bin 0 -> 2012 bytes ...1.column-metadata-handling.parquet.columns | 1 + .../0_stateless/data_parquet/v0.7.1.parquet | Bin 0 -> 4372 bytes .../data_parquet/v0.7.1.parquet.columns | 1 + .../v0.7.1.some-named-index.parquet | Bin 0 -> 4008 bytes .../v0.7.1.some-named-index.parquet.columns | 1 + debian/source/options | 1 - libs/libglibc-compatibility/CMakeLists.txt | 1 + utils/build/build_debian_unbundled.sh | 2 +- 103 files changed, 11778 insertions(+), 798 deletions(-) create mode 100644 cmake/find_snappy.cmake create mode 100644 contrib/arrow-cmake/CMakeLists.txt create mode 120000 contrib/arrow-cmake/build/cmake/config.h.in create mode 100644 contrib/arrow-cmake/cpp/src/parquet/parquet_constants.cpp create mode 100644 contrib/arrow-cmake/cpp/src/parquet/parquet_constants.h create mode 100644 contrib/arrow-cmake/cpp/src/parquet/parquet_types.cpp create mode 100644 contrib/arrow-cmake/cpp/src/parquet/parquet_types.h create mode 100644 contrib/arrow-cmake/cpp/src/parquet/parquet_version.h create mode 100644 contrib/arrow-cmake/cpp/src/thrift/stdcxx.h create mode 160000 contrib/snappy create mode 160000 contrib/thrift delete mode 100644 dbms/src/DataStreams/ParquetBlockInputStream.cpp delete mode 100644 dbms/src/DataStreams/ParquetBlockInputStream.h delete mode 100644 dbms/src/DataStreams/ParquetBlockOutputStream.cpp delete mode 100644 dbms/src/DataStreams/ParquetBlockOutputStream.h create mode 100644 dbms/src/Formats/ParquetBlockInputStream.cpp create mode 100644 dbms/src/Formats/ParquetBlockInputStream.h create mode 100644 dbms/src/Formats/ParquetBlockOutputStream.cpp create mode 100644 dbms/src/Formats/ParquetBlockOutputStream.h create mode 100644 dbms/tests/queries/0_stateless/00900_parquet.reference create mode 100755 dbms/tests/queries/0_stateless/00900_parquet.sh create mode 100755 dbms/tests/queries/0_stateless/00900_parquet_create_table_columns.pl create mode 100644 dbms/tests/queries/0_stateless/00900_parquet_decimal.reference create mode 100755 dbms/tests/queries/0_stateless/00900_parquet_decimal.sh create mode 100644 dbms/tests/queries/0_stateless/00900_parquet_load.reference create mode 100755 dbms/tests/queries/0_stateless/00900_parquet_load.sh create mode 100644 dbms/tests/queries/0_stateless/data_parquet/alltypes_dictionary.parquet create mode 100644 dbms/tests/queries/0_stateless/data_parquet/alltypes_dictionary.parquet.columns create mode 100644 dbms/tests/queries/0_stateless/data_parquet/alltypes_plain.parquet create mode 100644 dbms/tests/queries/0_stateless/data_parquet/alltypes_plain.parquet.columns create mode 100644 dbms/tests/queries/0_stateless/data_parquet/alltypes_plain.snappy.parquet create mode 100644 dbms/tests/queries/0_stateless/data_parquet/alltypes_plain.snappy.parquet.columns create mode 100644 dbms/tests/queries/0_stateless/data_parquet/byte_array_decimal.parquet create mode 100644 dbms/tests/queries/0_stateless/data_parquet/byte_array_decimal.parquet.columns create mode 100644 dbms/tests/queries/0_stateless/data_parquet/datapage_v2.snappy.parquet create mode 100644 dbms/tests/queries/0_stateless/data_parquet/datapage_v2.snappy.parquet.columns create mode 100644 dbms/tests/queries/0_stateless/data_parquet/fixed_length_decimal_1.parquet create mode 100644 dbms/tests/queries/0_stateless/data_parquet/fixed_length_decimal_1.parquet.columns create mode 100644 dbms/tests/queries/0_stateless/data_parquet/fixed_length_decimal_legacy.parquet create mode 100644 dbms/tests/queries/0_stateless/data_parquet/fixed_length_decimal_legacy.parquet.columns create mode 100644 dbms/tests/queries/0_stateless/data_parquet/int32_decimal.parquet create mode 100644 dbms/tests/queries/0_stateless/data_parquet/int32_decimal.parquet.columns create mode 100644 dbms/tests/queries/0_stateless/data_parquet/int64_decimal.parquet create mode 100644 dbms/tests/queries/0_stateless/data_parquet/int64_decimal.parquet.columns create mode 100644 dbms/tests/queries/0_stateless/data_parquet/nation.dict-malformed.parquet create mode 100644 dbms/tests/queries/0_stateless/data_parquet/nation.dict-malformed.parquet.columns create mode 100644 dbms/tests/queries/0_stateless/data_parquet/nested_lists.snappy.parquet create mode 100644 dbms/tests/queries/0_stateless/data_parquet/nested_lists.snappy.parquet.columns create mode 100644 dbms/tests/queries/0_stateless/data_parquet/nested_maps.snappy.parquet create mode 100644 dbms/tests/queries/0_stateless/data_parquet/nested_maps.snappy.parquet.columns create mode 100644 dbms/tests/queries/0_stateless/data_parquet/nonnullable.impala.parquet create mode 100644 dbms/tests/queries/0_stateless/data_parquet/nonnullable.impala.parquet.columns create mode 100644 dbms/tests/queries/0_stateless/data_parquet/nullable.impala.parquet create mode 100644 dbms/tests/queries/0_stateless/data_parquet/nullable.impala.parquet.columns create mode 100644 dbms/tests/queries/0_stateless/data_parquet/nulls.snappy.parquet create mode 100644 dbms/tests/queries/0_stateless/data_parquet/nulls.snappy.parquet.columns create mode 100644 dbms/tests/queries/0_stateless/data_parquet/repeated_no_annotation.parquet create mode 100644 dbms/tests/queries/0_stateless/data_parquet/repeated_no_annotation.parquet.columns create mode 100644 dbms/tests/queries/0_stateless/data_parquet/userdata1.parquet create mode 100644 dbms/tests/queries/0_stateless/data_parquet/userdata1.parquet.columns create mode 100644 dbms/tests/queries/0_stateless/data_parquet/userdata2.parquet create mode 100644 dbms/tests/queries/0_stateless/data_parquet/userdata2.parquet.columns create mode 100644 dbms/tests/queries/0_stateless/data_parquet/userdata3.parquet create mode 100644 dbms/tests/queries/0_stateless/data_parquet/userdata3.parquet.columns create mode 100644 dbms/tests/queries/0_stateless/data_parquet/userdata4.parquet create mode 100644 dbms/tests/queries/0_stateless/data_parquet/userdata4.parquet.columns create mode 100644 dbms/tests/queries/0_stateless/data_parquet/userdata5.parquet create mode 100644 dbms/tests/queries/0_stateless/data_parquet/userdata5.parquet.columns create mode 100644 dbms/tests/queries/0_stateless/data_parquet/v0.7.1.all-named-index.parquet create mode 100644 dbms/tests/queries/0_stateless/data_parquet/v0.7.1.all-named-index.parquet.columns create mode 100644 dbms/tests/queries/0_stateless/data_parquet/v0.7.1.column-metadata-handling.parquet create mode 100644 dbms/tests/queries/0_stateless/data_parquet/v0.7.1.column-metadata-handling.parquet.columns create mode 100644 dbms/tests/queries/0_stateless/data_parquet/v0.7.1.parquet create mode 100644 dbms/tests/queries/0_stateless/data_parquet/v0.7.1.parquet.columns create mode 100644 dbms/tests/queries/0_stateless/data_parquet/v0.7.1.some-named-index.parquet create mode 100644 dbms/tests/queries/0_stateless/data_parquet/v0.7.1.some-named-index.parquet.columns diff --git a/.gitmodules b/.gitmodules index a3ce6c2f5dc..6ad948c9a0a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -48,10 +48,16 @@ url = https://github.com/ClickHouse-Extras/protobuf.git [submodule "contrib/boost"] path = contrib/boost - url = https://github.com/ClickHouse-Extras/boost-extra.git + url = https://github.com/ClickHouse-Extras/boost.git [submodule "contrib/base64"] path = contrib/base64 url = https://github.com/aklomp/base64.git +[submodule "contrib/arrow"] + path = contrib/arrow + url = https://github.com/apache/arrow +[submodule "contrib/thrift"] + path = contrib/thrift + url = https://github.com/apache/thrift.git [submodule "contrib/libhdfs3"] path = contrib/libhdfs3 url = https://github.com/ClickHouse-Extras/libhdfs3.git @@ -61,12 +67,12 @@ [submodule "contrib/libgsasl"] path = contrib/libgsasl url = https://github.com/ClickHouse-Extras/libgsasl.git +[submodule "contrib/snappy"] + path = contrib/snappy + url = https://github.com/google/snappy [submodule "contrib/cppkafka"] path = contrib/cppkafka url = https://github.com/ClickHouse-Extras/cppkafka.git [submodule "contrib/brotli"] path = contrib/brotli url = https://github.com/google/brotli.git -[submodule "contrib/arrow"] - path = contrib/arrow - url = https://github.com/apache/arrow diff --git a/CMakeLists.txt b/CMakeLists.txt index 1d211d50135..8bbc7ca40ea 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -224,6 +224,7 @@ endif () message (STATUS "Building for: ${CMAKE_SYSTEM} ${CMAKE_SYSTEM_PROCESSOR} ${CMAKE_LIBRARY_ARCHITECTURE} ; USE_STATIC_LIBRARIES=${USE_STATIC_LIBRARIES} MAKE_STATIC_LIBRARIES=${MAKE_STATIC_LIBRARIES} SPLIT_SHARED=${SPLIT_SHARED_LIBRARIES} UNBUNDLED=${UNBUNDLED} CCACHE=${CCACHE_FOUND} ${CCACHE_VERSION}") include(GNUInstallDirs) +include (cmake/find_contrib_lib.cmake) include (cmake/find_ssl.cmake) include (cmake/lib_name.cmake) @@ -258,17 +259,15 @@ include (cmake/find_pdqsort.cmake) include (cmake/find_hdfs3.cmake) # uses protobuf include (cmake/find_consistent-hashing.cmake) include (cmake/find_base64.cmake) -if (ENABLE_TESTS) - include (cmake/find_gtest.cmake) -endif () -include (cmake/find_parquet.cmake) - -include (cmake/find_contrib_lib.cmake) find_contrib_lib(cityhash) find_contrib_lib(farmhash) find_contrib_lib(metrohash) find_contrib_lib(btrie) find_contrib_lib(double-conversion) +include (cmake/find_parquet.cmake) +if (ENABLE_TESTS) + include (cmake/find_gtest.cmake) +endif () # Need to process before "contrib" dir: include (libs/libcommon/cmake/find_gperftools.cmake) diff --git a/cmake/find_boost.cmake b/cmake/find_boost.cmake index 5a024d4d3db..b37782556d1 100644 --- a/cmake/find_boost.cmake +++ b/cmake/find_boost.cmake @@ -9,7 +9,7 @@ endif () if (NOT USE_INTERNAL_BOOST_LIBRARY) set (Boost_USE_STATIC_LIBS ${USE_STATIC_LIBRARIES}) set (BOOST_ROOT "/usr/local") - find_package (Boost 1.60 COMPONENTS program_options system filesystem thread) + find_package (Boost 1.60 COMPONENTS program_options system filesystem thread regex) # incomplete, no include search, who use it? if (NOT Boost_FOUND) # # Try to find manually. @@ -29,9 +29,12 @@ if (NOT Boost_SYSTEM_LIBRARY) set (Boost_SYSTEM_LIBRARY boost_system_internal) set (Boost_PROGRAM_OPTIONS_LIBRARY boost_program_options_internal) set (Boost_FILESYSTEM_LIBRARY boost_filesystem_internal ${Boost_SYSTEM_LIBRARY}) + set (Boost_REGEX_LIBRARY boost_regex_internal) set (Boost_INCLUDE_DIRS) + set (BOOST_ROOT "${ClickHouse_SOURCE_DIR}/contrib/boost") + # For boost from github: file (GLOB Boost_INCLUDE_DIRS_ "${ClickHouse_SOURCE_DIR}/contrib/boost/libs/*/include") list (APPEND Boost_INCLUDE_DIRS ${Boost_INCLUDE_DIRS_}) @@ -44,4 +47,4 @@ if (NOT Boost_SYSTEM_LIBRARY) endif () -message (STATUS "Using Boost: ${Boost_INCLUDE_DIRS} : ${Boost_PROGRAM_OPTIONS_LIBRARY},${Boost_SYSTEM_LIBRARY},${Boost_FILESYSTEM_LIBRARY}") +message (STATUS "Using Boost: ${Boost_INCLUDE_DIRS} : ${Boost_PROGRAM_OPTIONS_LIBRARY},${Boost_SYSTEM_LIBRARY},${Boost_FILESYSTEM_LIBRARY},${Boost_REGEX_LIBRARY}") diff --git a/cmake/find_libxml2.cmake b/cmake/find_libxml2.cmake index b421d113361..73732e139c5 100644 --- a/cmake/find_libxml2.cmake +++ b/cmake/find_libxml2.cmake @@ -9,8 +9,9 @@ if (NOT EXISTS "${ClickHouse_SOURCE_DIR}/contrib/libxml2/libxml.h") endif () if (NOT USE_INTERNAL_LIBXML2_LIBRARY) - find_library (LIBXML2_LIBRARY libxml2) - find_path (LIBXML2_INCLUDE_DIR NAMES libxml.h PATHS ${LIBXML2_INCLUDE_PATHS}) + find_package (LibXml2) + #find_library (LIBXML2_LIBRARY libxml2) + #find_path (LIBXML2_INCLUDE_DIR NAMES libxml.h PATHS ${LIBXML2_INCLUDE_PATHS}) endif () if (LIBXML2_LIBRARY AND LIBXML2_INCLUDE_DIR) diff --git a/cmake/find_lz4.cmake b/cmake/find_lz4.cmake index d8a38c05c02..5f5e058b53d 100644 --- a/cmake/find_lz4.cmake +++ b/cmake/find_lz4.cmake @@ -1,8 +1,11 @@ option (USE_INTERNAL_LZ4_LIBRARY "Set to FALSE to use system lz4 library instead of bundled" ${NOT_UNBUNDLED}) -if (USE_INTERNAL_LZ4_LIBRARY AND NOT EXISTS "${ClickHouse_SOURCE_DIR}/contrib/lz4/lib/lz4.h") - message (WARNING "submodule contrib/lz4 is missing. to fix try run: \n git submodule update --init --recursive") - set (USE_INTERNAL_LZ4_LIBRARY 0) +if (NOT EXISTS "${ClickHouse_SOURCE_DIR}/contrib/lz4/lib/lz4.h") + if (USE_INTERNAL_LZ4_LIBRARY) + message (WARNING "submodule contrib/lz4 is missing. to fix try run: \n git submodule update --init --recursive") + set (USE_INTERNAL_LZ4_LIBRARY 0) + endif () + set (MISSING_INTERNAL_LZ4_LIBRARY 1) endif () if (NOT USE_INTERNAL_LZ4_LIBRARY) @@ -11,7 +14,7 @@ if (NOT USE_INTERNAL_LZ4_LIBRARY) endif () if (LZ4_LIBRARY AND LZ4_INCLUDE_DIR) -else () +elseif (NOT MISSING_INTERNAL_LZ4_LIBRARY) set (LZ4_INCLUDE_DIR ${ClickHouse_SOURCE_DIR}/contrib/lz4/lib) set (USE_INTERNAL_LZ4_LIBRARY 1) set (LZ4_LIBRARY lz4) diff --git a/cmake/find_parquet.cmake b/cmake/find_parquet.cmake index 92da31a73ae..bfaf51abb46 100644 --- a/cmake/find_parquet.cmake +++ b/cmake/find_parquet.cmake @@ -1,31 +1,68 @@ -option (USE_INTERNAL_PARQUET_LIBRARY "Set to FALSE to use system parquet library instead of bundled" ${NOT_UNBUNDLED}) +if (NOT OS_FREEBSD) # Freebsd: ../contrib/arrow/cpp/src/arrow/util/bit-util.h:27:10: fatal error: endian.h: No such file or directory + option(USE_INTERNAL_PARQUET_LIBRARY "Set to FALSE to use system parquet library instead of bundled" ${NOT_UNBUNDLED}) +endif() -if (NOT EXISTS "${ClickHouse_SOURCE_DIR}/contrib/arrow/cpp/CMakeLists.txt") - if (USE_INTERNAL_PARQUET_LIBRARY) - message (WARNING "submodule contrib/arrow (required for Parquet) is missing. to fix try run: \n git submodule update --init --recursive") - endif () - set (USE_INTERNAL_PARQUET_LIBRARY 0) - set (MISSING_INTERNAL_PARQUET_LIBRARY 1) -endif () +if(NOT EXISTS "${ClickHouse_SOURCE_DIR}/contrib/arrow/cpp/CMakeLists.txt") + if(USE_INTERNAL_PARQUET_LIBRARY) + message(WARNING "submodule contrib/arrow (required for Parquet) is missing. to fix try run: \n git submodule update --init --recursive") + endif() + set(USE_INTERNAL_PARQUET_LIBRARY 0) + set(MISSING_INTERNAL_PARQUET_LIBRARY 1) +endif() -if (NOT USE_INTERNAL_PARQUET_LIBRARY) - find_package (Arrow) - find_package (Parquet) -endif () +if(NOT USE_INTERNAL_PARQUET_LIBRARY) + find_package(Arrow) + find_package(Parquet) +endif() -if (ARROW_INCLUDE_DIR AND PARQUET_INCLUDE_DIR) -elseif (NOT MISSING_INTERNAL_PARQUET_LIBRARY) - set (USE_INTERNAL_PARQUET_LIBRARY 1) - # TODO: is it required? - # set (ARROW_INCLUDE_DIR "${ClickHouse_SOURCE_DIR}/contrib/arrow/cpp/src/arrow") - # set (PARQUET_INCLUDE_DIR "${ClickHouse_SOURCE_DIR}/contrib/arrow/cpp/src/parquet") - set (ARROW_LIBRARY arrow_static) - set (PARQUET_LIBRARY parquet_static) - set (USE_PARQUET 1) -endif () +if(ARROW_INCLUDE_DIR AND PARQUET_INCLUDE_DIR) +elseif(NOT MISSING_INTERNAL_PARQUET_LIBRARY AND NOT OS_FREEBSD) + include(cmake/find_snappy.cmake) + set(CAN_USE_INTERNAL_PARQUET_LIBRARY 1) + include(CheckCXXSourceCompiles) + if(NOT USE_INTERNAL_DOUBLE_CONVERSION_LIBRARY) + set(CMAKE_REQUIRED_LIBRARIES ${DOUBLE_CONVERSION_LIBRARIES}) + set(CMAKE_REQUIRED_INCLUDES ${DOUBLE_CONVERSION_INCLUDE_DIR}) + check_cxx_source_compiles(" + #include + int main() { static const int flags_ = double_conversion::StringToDoubleConverter::ALLOW_CASE_INSENSIBILITY; return 0;} + " HAVE_DOUBLE_CONVERSION_ALLOW_CASE_INSENSIBILITY) -if (USE_PARQUET) - message (STATUS "Using Parquet: ${ARROW_INCLUDE_DIR} ${PARQUET_INCLUDE_DIR}") -else () - message (STATUS "Building without Parquet support") -endif () + if(NOT HAVE_DOUBLE_CONVERSION_ALLOW_CASE_INSENSIBILITY) # HAVE_STD_RANDOM_SHUFFLE + message(STATUS "Disabling internal parquet library because arrow is broken (can't use old double_conversion)") + set(CAN_USE_INTERNAL_PARQUET_LIBRARY 0) + endif() + endif() + + if(NOT CAN_USE_INTERNAL_PARQUET_LIBRARY) + set(USE_INTERNAL_PARQUET_LIBRARY 0) + else() + set(USE_INTERNAL_PARQUET_LIBRARY 1) + + if(USE_INTERNAL_PARQUET_LIBRARY_NATIVE_CMAKE) + set(ARROW_INCLUDE_DIR "${ClickHouse_SOURCE_DIR}/contrib/arrow/cpp/src") + set(PARQUET_INCLUDE_DIR "${ClickHouse_SOURCE_DIR}/contrib/arrow/cpp/src" ${ClickHouse_BINARY_DIR}/contrib/arrow/cpp/src) + endif() + + if(${USE_STATIC_LIBRARIES}) + set(ARROW_LIBRARY arrow_static) + set(PARQUET_LIBRARY parquet_static) + set(THRIFT_LIBRARY thrift_static) + else() + set(ARROW_LIBRARY arrow_shared) + set(PARQUET_LIBRARY parquet_shared) + if(USE_INTERNAL_PARQUET_LIBRARY_NATIVE_CMAKE) + list(APPEND PARQUET_LIBRARY ${Boost_REGEX_LIBRARY}) + endif() + set(THRIFT_LIBRARY thrift) + endif() + + set(USE_PARQUET 1) + endif() +endif() + +if(USE_PARQUET) + message(STATUS "Using Parquet: ${ARROW_LIBRARY}:${ARROW_INCLUDE_DIR} ; ${PARQUET_LIBRARY}:${PARQUET_INCLUDE_DIR} ; ${THRIFT_LIBRARY}") +else() + message(STATUS "Building without Parquet support") +endif() diff --git a/cmake/find_snappy.cmake b/cmake/find_snappy.cmake new file mode 100644 index 00000000000..1098bbc3e53 --- /dev/null +++ b/cmake/find_snappy.cmake @@ -0,0 +1,27 @@ +option(USE_INTERNAL_SNAPPY_LIBRARY "Set to FALSE to use system snappy library instead of bundled" ${NOT_UNBUNDLED}) + +if(NOT EXISTS "${ClickHouse_SOURCE_DIR}/contrib/snappy/snappy.h") + if(USE_INTERNAL_SNAPPY_LIBRARY) + message(WARNING "submodule contrib/snappy is missing. to fix try run: \n git submodule update --init --recursive") + set(USE_INTERNAL_SNAPPY_LIBRARY 0) + endif() + set(MISSING_INTERNAL_SNAPPY_LIBRARY 1) +endif() + +if(NOT USE_INTERNAL_SNAPPY_LIBRARY) + find_library(SNAPPY_LIBRARY snappy) + find_path(SNAPPY_INCLUDE_DIR NAMES snappy.h PATHS ${SNAPPY_INCLUDE_PATHS}) +endif() + +if(SNAPPY_LIBRARY AND SNAPPY_INCLUDE_DIR) +elseif(NOT MISSING_INTERNAL_SNAPPY_LIBRARY) + set(SNAPPY_INCLUDE_DIR ${ClickHouse_SOURCE_DIR}/contrib/snappy) + set(USE_INTERNAL_SNAPPY_LIBRARY 1) + set(SNAPPY_LIBRARY snappy) +endif() + +if(SNAPPY_LIBRARY AND SNAPPY_INCLUDE_DIR) + set(USE_SNAPPY 1) +endif() + +message(STATUS "Using snappy=${USE_SNAPPY}: ${SNAPPY_INCLUDE_DIR} : ${SNAPPY_LIBRARY}") diff --git a/contrib/CMakeLists.txt b/contrib/CMakeLists.txt index a06e8cbb886..9cc3edfe69a 100644 --- a/contrib/CMakeLists.txt +++ b/contrib/CMakeLists.txt @@ -151,17 +151,61 @@ if (USE_INTERNAL_CAPNP_LIBRARY) endif () if (USE_INTERNAL_PARQUET_LIBRARY) - set (ARROW_COMPUTE ON) - set (ARROW_PARQUET ON) - set (ARROW_VERBOSE_THIRDPARTY_BUILD ON) - set (PARQUET_ARROW_LINKAGE "static") - set (ARROW_BUILD_STATIC ON) +if (USE_INTERNAL_PARQUET_LIBRARY_NATIVE_CMAKE) + # We dont use arrow's cmakefiles because they uses too many depends and download some libs in compile time + # But this mode can be used for updating auto-generated parquet files: + # cmake -DUSE_INTERNAL_PARQUET_LIBRARY_NATIVE_CMAKE=1 -DUSE_STATIC_LIBRARIES=0 + # copy {BUILD_DIR}/contrib/arrow/cpp/src/parquet/*.cpp,*.h -> /contrib/arrow-cmake/cpp/src/parquet/ + + # Also useful parquet reader: + # cd contrib/arrow/cpp/build && mkdir -p build && cmake .. -DPARQUET_BUILD_EXECUTABLES=1 && make -j8 + # contrib/arrow/cpp/build/debug/parquet-reader some_file.parquet + + set (ARROW_COMPUTE ON CACHE INTERNAL "") + set (ARROW_PARQUET ON CACHE INTERNAL "") + set (ARROW_VERBOSE_THIRDPARTY_BUILD ON CACHE INTERNAL "") + set (ARROW_BUILD_SHARED 1 CACHE INTERNAL "") + set (ARROW_BOOST_HEADER_ONLY ON CACHE INTERNAL "") + #set (BOOST_INCLUDEDIR Boost_INCLUDE_DIRS) + set (Boost_FOUND 1 CACHE INTERNAL "") + #set (ZLIB_HOME ${ZLIB_INCLUDE_DIR}) + #set (ZLIB_FOUND 1) + if (MAKE_STATIC_LIBRARIES) + set (PARQUET_ARROW_LINKAGE "static" CACHE INTERNAL "") + set (ARROW_TEST_LINKAGE "static" CACHE INTERNAL "") + set (ARROW_BUILD_STATIC ${MAKE_STATIC_LIBRARIES} CACHE INTERNAL "") + else() + set (PARQUET_ARROW_LINKAGE "shared" CACHE INTERNAL "") + set (ARROW_TEST_LINKAGE "shared" CACHE INTERNAL "") + endif() + + if(CMAKE_BUILD_TYPE STREQUAL "RELWITHDEBINFO") + set(_save_build_type ${CMAKE_BUILD_TYPE}) + set(CMAKE_BUILD_TYPE RELEASE) + endif() # Because Arrow uses CMAKE_SOURCE_DIR as a project path # Hopefully will be fixed in https://github.com/apache/arrow/pull/2676 set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${ClickHouse_SOURCE_DIR}/contrib/arrow/cpp/cmake_modules") add_subdirectory (arrow/cpp) -endif () + + if(_save_build_type) + set(CMAKE_BUILD_TYPE ${_save_build_type}) + endif() + +else() + + if(USE_INTERNAL_SNAPPY_LIBRARY) + set(SNAPPY_BUILD_TESTS 0 CACHE INTERNAL "") + if (NOT MAKE_STATIC_LIBRARIES) + set(BUILD_SHARED_LIBS 1) # TODO: set at root dir + endif() + add_subdirectory(snappy) + endif() + + add_subdirectory(arrow-cmake) +endif() +endif() if (USE_INTERNAL_POCO_LIBRARY) set (POCO_VERBOSE_MESSAGES 0 CACHE INTERNAL "") diff --git a/contrib/arrow b/contrib/arrow index af20905877f..87ac6fddaf2 160000 --- a/contrib/arrow +++ b/contrib/arrow @@ -1 +1 @@ -Subproject commit af20905877fb353367d7ee5a808f759532a5ca0f +Subproject commit 87ac6fddaf21d0b4ee8b8090533ff293db0da1b4 diff --git a/contrib/arrow-cmake/CMakeLists.txt b/contrib/arrow-cmake/CMakeLists.txt new file mode 100644 index 00000000000..b2ff92c5eb3 --- /dev/null +++ b/contrib/arrow-cmake/CMakeLists.txt @@ -0,0 +1,212 @@ +# === thrift + +set(LIBRARY_DIR ${ClickHouse_SOURCE_DIR}/contrib/thrift/lib/cpp) +# contrib/thrift/lib/cpp/CMakeLists.txt +set(thriftcpp_SOURCES + ${LIBRARY_DIR}/src/thrift/TApplicationException.cpp + ${LIBRARY_DIR}/src/thrift/TOutput.cpp + ${LIBRARY_DIR}/src/thrift/async/TAsyncChannel.cpp + ${LIBRARY_DIR}/src/thrift/async/TAsyncProtocolProcessor.cpp + ${LIBRARY_DIR}/src/thrift/async/TConcurrentClientSyncInfo.h + ${LIBRARY_DIR}/src/thrift/async/TConcurrentClientSyncInfo.cpp + ${LIBRARY_DIR}/src/thrift/concurrency/ThreadManager.cpp + ${LIBRARY_DIR}/src/thrift/concurrency/TimerManager.cpp + ${LIBRARY_DIR}/src/thrift/concurrency/Util.cpp + ${LIBRARY_DIR}/src/thrift/processor/PeekProcessor.cpp + ${LIBRARY_DIR}/src/thrift/protocol/TBase64Utils.cpp + ${LIBRARY_DIR}/src/thrift/protocol/TDebugProtocol.cpp + ${LIBRARY_DIR}/src/thrift/protocol/TJSONProtocol.cpp + ${LIBRARY_DIR}/src/thrift/protocol/TMultiplexedProtocol.cpp + ${LIBRARY_DIR}/src/thrift/protocol/TProtocol.cpp + ${LIBRARY_DIR}/src/thrift/transport/TTransportException.cpp + ${LIBRARY_DIR}/src/thrift/transport/TFDTransport.cpp + ${LIBRARY_DIR}/src/thrift/transport/TSimpleFileTransport.cpp + ${LIBRARY_DIR}/src/thrift/transport/THttpTransport.cpp + ${LIBRARY_DIR}/src/thrift/transport/THttpClient.cpp + ${LIBRARY_DIR}/src/thrift/transport/THttpServer.cpp + ${LIBRARY_DIR}/src/thrift/transport/TSocket.cpp + ${LIBRARY_DIR}/src/thrift/transport/TSocketPool.cpp + ${LIBRARY_DIR}/src/thrift/transport/TServerSocket.cpp + ${LIBRARY_DIR}/src/thrift/transport/TTransportUtils.cpp + ${LIBRARY_DIR}/src/thrift/transport/TBufferTransports.cpp + ${LIBRARY_DIR}/src/thrift/server/TConnectedClient.cpp + ${LIBRARY_DIR}/src/thrift/server/TServerFramework.cpp + ${LIBRARY_DIR}/src/thrift/server/TSimpleServer.cpp + ${LIBRARY_DIR}/src/thrift/server/TThreadPoolServer.cpp + ${LIBRARY_DIR}/src/thrift/server/TThreadedServer.cpp +) +set( thriftcpp_threads_SOURCES + ${LIBRARY_DIR}/src/thrift/concurrency/ThreadFactory.cpp + ${LIBRARY_DIR}/src/thrift/concurrency/Thread.cpp + ${LIBRARY_DIR}/src/thrift/concurrency/Monitor.cpp + ${LIBRARY_DIR}/src/thrift/concurrency/Mutex.cpp +) +add_library(${THRIFT_LIBRARY} ${LINK_MODE} ${thriftcpp_SOURCES} ${thriftcpp_threads_SOURCES}) +set_target_properties(${THRIFT_LIBRARY} PROPERTIES CXX_STANDARD 14) # REMOVE after https://github.com/apache/thrift/pull/1641 +target_include_directories(${THRIFT_LIBRARY} SYSTEM PUBLIC ${ClickHouse_SOURCE_DIR}/contrib/thrift/lib/cpp/src PRIVATE ${Boost_INCLUDE_DIRS}) + + + +# === arrow + +set(LIBRARY_DIR ${ClickHouse_SOURCE_DIR}/contrib/arrow/cpp/src/arrow) +# arrow/cpp/src/arrow/CMakeLists.txt +set(ARROW_SRCS + ${LIBRARY_DIR}/array.cc + + ${LIBRARY_DIR}/builder.cc + ${LIBRARY_DIR}/array/builder_adaptive.cc + ${LIBRARY_DIR}/array/builder_base.cc + ${LIBRARY_DIR}/array/builder_binary.cc + ${LIBRARY_DIR}/array/builder_decimal.cc + ${LIBRARY_DIR}/array/builder_dict.cc + ${LIBRARY_DIR}/array/builder_nested.cc + ${LIBRARY_DIR}/array/builder_primitive.cc + + ${LIBRARY_DIR}/buffer.cc + ${LIBRARY_DIR}/compare.cc + ${LIBRARY_DIR}/memory_pool.cc + ${LIBRARY_DIR}/pretty_print.cc + ${LIBRARY_DIR}/record_batch.cc + ${LIBRARY_DIR}/status.cc + ${LIBRARY_DIR}/table.cc + ${LIBRARY_DIR}/table_builder.cc + ${LIBRARY_DIR}/tensor.cc + ${LIBRARY_DIR}/sparse_tensor.cc + ${LIBRARY_DIR}/type.cc + ${LIBRARY_DIR}/visitor.cc + + ${LIBRARY_DIR}/csv/converter.cc + ${LIBRARY_DIR}/csv/chunker.cc + ${LIBRARY_DIR}/csv/column-builder.cc + ${LIBRARY_DIR}/csv/options.cc + ${LIBRARY_DIR}/csv/parser.cc + ${LIBRARY_DIR}/csv/reader.cc + + ${LIBRARY_DIR}/io/buffered.cc + ${LIBRARY_DIR}/io/compressed.cc + ${LIBRARY_DIR}/io/file.cc + ${LIBRARY_DIR}/io/interfaces.cc + ${LIBRARY_DIR}/io/memory.cc + ${LIBRARY_DIR}/io/readahead.cc + + ${LIBRARY_DIR}/util/bit-util.cc + ${LIBRARY_DIR}/util/compression.cc + ${LIBRARY_DIR}/util/cpu-info.cc + ${LIBRARY_DIR}/util/decimal.cc + ${LIBRARY_DIR}/util/int-util.cc + ${LIBRARY_DIR}/util/io-util.cc + ${LIBRARY_DIR}/util/logging.cc + ${LIBRARY_DIR}/util/key_value_metadata.cc + ${LIBRARY_DIR}/util/task-group.cc + ${LIBRARY_DIR}/util/thread-pool.cc + ${LIBRARY_DIR}/util/trie.cc + ${LIBRARY_DIR}/util/utf8.cc +) + +set(ARROW_SRCS ${ARROW_SRCS} + ${LIBRARY_DIR}/compute/context.cc + ${LIBRARY_DIR}/compute/kernels/boolean.cc + ${LIBRARY_DIR}/compute/kernels/cast.cc + ${LIBRARY_DIR}/compute/kernels/hash.cc + ${LIBRARY_DIR}/compute/kernels/util-internal.cc +) + +if (LZ4_INCLUDE_DIR AND LZ4_LIBRARY) + set(ARROW_WITH_LZ4 1) +endif() + +if(SNAPPY_INCLUDE_DIR AND SNAPPY_LIBRARY) + set(ARROW_WITH_SNAPPY 1) +endif() + +if(ZLIB_INCLUDE_DIR AND ZLIB_LIBRARIES) + set(ARROW_WITH_ZLIB 1) +endif() + +if (ZSTD_INCLUDE_DIR AND ZSTD_LIBRARY) + set(ARROW_WITH_ZSTD 1) +endif() + +if (ARROW_WITH_LZ4) + add_definitions(-DARROW_WITH_LZ4) + SET(ARROW_SRCS ${LIBRARY_DIR}/util/compression_lz4.cc ${ARROW_SRCS}) +endif() + +if (ARROW_WITH_SNAPPY) + add_definitions(-DARROW_WITH_SNAPPY) + SET(ARROW_SRCS ${LIBRARY_DIR}/util/compression_snappy.cc ${ARROW_SRCS}) +endif() + +if (ARROW_WITH_ZLIB) + add_definitions(-DARROW_WITH_ZLIB) + SET(ARROW_SRCS ${LIBRARY_DIR}/util/compression_zlib.cc ${ARROW_SRCS}) +endif() + +if (ARROW_WITH_ZSTD) + add_definitions(-DARROW_WITH_ZSTD) + SET(ARROW_SRCS ${LIBRARY_DIR}/util/compression_zstd.cc ${ARROW_SRCS}) +endif() + + +add_library(${ARROW_LIBRARY} ${LINK_MODE} ${ARROW_SRCS}) +target_include_directories(${ARROW_LIBRARY} SYSTEM PUBLIC ${ClickHouse_SOURCE_DIR}/contrib/arrow/cpp/src PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/cpp/src ${Boost_INCLUDE_DIRS}) +target_link_libraries(${ARROW_LIBRARY} PRIVATE ${DOUBLE_CONVERSION_LIBRARIES} Threads::Threads) +if (ARROW_WITH_LZ4) + target_link_libraries(${ARROW_LIBRARY} PRIVATE ${LZ4_LIBRARY}) +endif() +if (ARROW_WITH_SNAPPY) + target_link_libraries(${ARROW_LIBRARY} PRIVATE ${SNAPPY_LIBRARY}) +endif() +if (ARROW_WITH_ZLIB) + target_link_libraries(${ARROW_LIBRARY} PRIVATE ${ZLIB_LIBRARIES}) +endif() +if (ARROW_WITH_ZSTD) + target_link_libraries(${ARROW_LIBRARY} PRIVATE ${ZSTD_LIBRARY}) +endif() + + +# === parquet + +set(LIBRARY_DIR ${ClickHouse_SOURCE_DIR}/contrib/arrow/cpp/src/parquet) +# arrow/cpp/src/parquet/CMakeLists.txt +set(PARQUET_SRCS + ${LIBRARY_DIR}/arrow/reader.cc + ${LIBRARY_DIR}/arrow/record_reader.cc + ${LIBRARY_DIR}/arrow/schema.cc + ${LIBRARY_DIR}/arrow/writer.cc + ${LIBRARY_DIR}/bloom_filter.cc + ${LIBRARY_DIR}/column_reader.cc + ${LIBRARY_DIR}/column_scanner.cc + ${LIBRARY_DIR}/column_writer.cc + ${LIBRARY_DIR}/file_reader.cc + ${LIBRARY_DIR}/file_writer.cc + ${LIBRARY_DIR}/metadata.cc + ${LIBRARY_DIR}/murmur3.cc + ${LIBRARY_DIR}/printer.cc + ${LIBRARY_DIR}/schema.cc + ${LIBRARY_DIR}/statistics.cc + ${LIBRARY_DIR}/types.cc + ${LIBRARY_DIR}/util/comparison.cc + ${LIBRARY_DIR}/util/memory.cc +) +#list(TRANSFORM PARQUET_SRCS PREPEND ${LIBRARY_DIR}/) # cmake 3.12 +list(APPEND PARQUET_SRCS + ${CMAKE_CURRENT_SOURCE_DIR}/cpp/src/parquet/parquet_constants.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/cpp/src/parquet/parquet_types.cpp +) +add_library(${PARQUET_LIBRARY} ${LINK_MODE} ${PARQUET_SRCS}) +target_include_directories(${PARQUET_LIBRARY} SYSTEM PUBLIC ${ClickHouse_SOURCE_DIR}/contrib/arrow/cpp/src ${CMAKE_CURRENT_SOURCE_DIR}/cpp/src) +include(${ClickHouse_SOURCE_DIR}/contrib/thrift/build/cmake/ConfigureChecks.cmake) # makes config.h +target_link_libraries(${PARQUET_LIBRARY} PRIVATE ${ARROW_LIBRARY} ${THRIFT_LIBRARY} ${Boost_REGEX_LIBRARY}) +target_include_directories(${PARQUET_LIBRARY} PRIVATE ${Boost_INCLUDE_DIRS}) + + +# === tools + +set(TOOLS_DIR ${ClickHouse_SOURCE_DIR}/contrib/arrow/cpp/tools/parquet) +set(PARQUET_TOOLS parquet-dump-schema parquet-reader parquet-scan) +foreach(TOOL ${PARQUET_TOOLS}) + add_executable(${TOOL} ${TOOLS_DIR}/${TOOL}.cc) + target_link_libraries(${TOOL} ${PARQUET_LIBRARY}) +endforeach() diff --git a/contrib/arrow-cmake/build/cmake/config.h.in b/contrib/arrow-cmake/build/cmake/config.h.in new file mode 120000 index 00000000000..eb28c214748 --- /dev/null +++ b/contrib/arrow-cmake/build/cmake/config.h.in @@ -0,0 +1 @@ +../../../thrift/build/cmake/config.h.in \ No newline at end of file diff --git a/contrib/arrow-cmake/cpp/src/parquet/parquet_constants.cpp b/contrib/arrow-cmake/cpp/src/parquet/parquet_constants.cpp new file mode 100644 index 00000000000..e1775208368 --- /dev/null +++ b/contrib/arrow-cmake/cpp/src/parquet/parquet_constants.cpp @@ -0,0 +1,17 @@ +/** + * Autogenerated by Thrift Compiler (0.11.0) + * + * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + * @generated + */ +#include "parquet_constants.h" + +namespace parquet { namespace format { + +const parquetConstants g_parquet_constants; + +parquetConstants::parquetConstants() { +} + +}} // namespace + diff --git a/contrib/arrow-cmake/cpp/src/parquet/parquet_constants.h b/contrib/arrow-cmake/cpp/src/parquet/parquet_constants.h new file mode 100644 index 00000000000..b4fbf3ab99e --- /dev/null +++ b/contrib/arrow-cmake/cpp/src/parquet/parquet_constants.h @@ -0,0 +1,24 @@ +/** + * Autogenerated by Thrift Compiler (0.11.0) + * + * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + * @generated + */ +#ifndef parquet_CONSTANTS_H +#define parquet_CONSTANTS_H + +#include "parquet_types.h" + +namespace parquet { namespace format { + +class parquetConstants { + public: + parquetConstants(); + +}; + +extern const parquetConstants g_parquet_constants; + +}} // namespace + +#endif diff --git a/contrib/arrow-cmake/cpp/src/parquet/parquet_types.cpp b/contrib/arrow-cmake/cpp/src/parquet/parquet_types.cpp new file mode 100644 index 00000000000..f9780d268f3 --- /dev/null +++ b/contrib/arrow-cmake/cpp/src/parquet/parquet_types.cpp @@ -0,0 +1,6501 @@ +/** + * Autogenerated by Thrift Compiler (0.11.0) + * + * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + * @generated + */ +#include "parquet_types.h" + +#include +#include + +#include + +namespace parquet { namespace format { + +int _kTypeValues[] = { + Type::BOOLEAN, + Type::INT32, + Type::INT64, + Type::INT96, + Type::FLOAT, + Type::DOUBLE, + Type::BYTE_ARRAY, + Type::FIXED_LEN_BYTE_ARRAY +}; +const char* _kTypeNames[] = { + "BOOLEAN", + "INT32", + "INT64", + "INT96", + "FLOAT", + "DOUBLE", + "BYTE_ARRAY", + "FIXED_LEN_BYTE_ARRAY" +}; +const std::map _Type_VALUES_TO_NAMES(::apache::thrift::TEnumIterator(8, _kTypeValues, _kTypeNames), ::apache::thrift::TEnumIterator(-1, NULL, NULL)); + +std::ostream& operator<<(std::ostream& out, const Type::type& val) { + std::map::const_iterator it = _Type_VALUES_TO_NAMES.find(val); + if (it != _Type_VALUES_TO_NAMES.end()) { + out << it->second; + } else { + out << static_cast(val); + } + return out; +} + +int _kConvertedTypeValues[] = { + ConvertedType::UTF8, + ConvertedType::MAP, + ConvertedType::MAP_KEY_VALUE, + ConvertedType::LIST, + ConvertedType::ENUM, + ConvertedType::DECIMAL, + ConvertedType::DATE, + ConvertedType::TIME_MILLIS, + ConvertedType::TIME_MICROS, + ConvertedType::TIMESTAMP_MILLIS, + ConvertedType::TIMESTAMP_MICROS, + ConvertedType::UINT_8, + ConvertedType::UINT_16, + ConvertedType::UINT_32, + ConvertedType::UINT_64, + ConvertedType::INT_8, + ConvertedType::INT_16, + ConvertedType::INT_32, + ConvertedType::INT_64, + ConvertedType::JSON, + ConvertedType::BSON, + ConvertedType::INTERVAL +}; +const char* _kConvertedTypeNames[] = { + "UTF8", + "MAP", + "MAP_KEY_VALUE", + "LIST", + "ENUM", + "DECIMAL", + "DATE", + "TIME_MILLIS", + "TIME_MICROS", + "TIMESTAMP_MILLIS", + "TIMESTAMP_MICROS", + "UINT_8", + "UINT_16", + "UINT_32", + "UINT_64", + "INT_8", + "INT_16", + "INT_32", + "INT_64", + "JSON", + "BSON", + "INTERVAL" +}; +const std::map _ConvertedType_VALUES_TO_NAMES(::apache::thrift::TEnumIterator(22, _kConvertedTypeValues, _kConvertedTypeNames), ::apache::thrift::TEnumIterator(-1, NULL, NULL)); + +std::ostream& operator<<(std::ostream& out, const ConvertedType::type& val) { + std::map::const_iterator it = _ConvertedType_VALUES_TO_NAMES.find(val); + if (it != _ConvertedType_VALUES_TO_NAMES.end()) { + out << it->second; + } else { + out << static_cast(val); + } + return out; +} + +int _kFieldRepetitionTypeValues[] = { + FieldRepetitionType::REQUIRED, + FieldRepetitionType::OPTIONAL, + FieldRepetitionType::REPEATED +}; +const char* _kFieldRepetitionTypeNames[] = { + "REQUIRED", + "OPTIONAL", + "REPEATED" +}; +const std::map _FieldRepetitionType_VALUES_TO_NAMES(::apache::thrift::TEnumIterator(3, _kFieldRepetitionTypeValues, _kFieldRepetitionTypeNames), ::apache::thrift::TEnumIterator(-1, NULL, NULL)); + +std::ostream& operator<<(std::ostream& out, const FieldRepetitionType::type& val) { + std::map::const_iterator it = _FieldRepetitionType_VALUES_TO_NAMES.find(val); + if (it != _FieldRepetitionType_VALUES_TO_NAMES.end()) { + out << it->second; + } else { + out << static_cast(val); + } + return out; +} + +int _kEncodingValues[] = { + Encoding::PLAIN, + Encoding::PLAIN_DICTIONARY, + Encoding::RLE, + Encoding::BIT_PACKED, + Encoding::DELTA_BINARY_PACKED, + Encoding::DELTA_LENGTH_BYTE_ARRAY, + Encoding::DELTA_BYTE_ARRAY, + Encoding::RLE_DICTIONARY +}; +const char* _kEncodingNames[] = { + "PLAIN", + "PLAIN_DICTIONARY", + "RLE", + "BIT_PACKED", + "DELTA_BINARY_PACKED", + "DELTA_LENGTH_BYTE_ARRAY", + "DELTA_BYTE_ARRAY", + "RLE_DICTIONARY" +}; +const std::map _Encoding_VALUES_TO_NAMES(::apache::thrift::TEnumIterator(8, _kEncodingValues, _kEncodingNames), ::apache::thrift::TEnumIterator(-1, NULL, NULL)); + +std::ostream& operator<<(std::ostream& out, const Encoding::type& val) { + std::map::const_iterator it = _Encoding_VALUES_TO_NAMES.find(val); + if (it != _Encoding_VALUES_TO_NAMES.end()) { + out << it->second; + } else { + out << static_cast(val); + } + return out; +} + +int _kCompressionCodecValues[] = { + CompressionCodec::UNCOMPRESSED, + CompressionCodec::SNAPPY, + CompressionCodec::GZIP, + CompressionCodec::LZO, + CompressionCodec::BROTLI, + CompressionCodec::LZ4, + CompressionCodec::ZSTD +}; +const char* _kCompressionCodecNames[] = { + "UNCOMPRESSED", + "SNAPPY", + "GZIP", + "LZO", + "BROTLI", + "LZ4", + "ZSTD" +}; +const std::map _CompressionCodec_VALUES_TO_NAMES(::apache::thrift::TEnumIterator(7, _kCompressionCodecValues, _kCompressionCodecNames), ::apache::thrift::TEnumIterator(-1, NULL, NULL)); + +std::ostream& operator<<(std::ostream& out, const CompressionCodec::type& val) { + std::map::const_iterator it = _CompressionCodec_VALUES_TO_NAMES.find(val); + if (it != _CompressionCodec_VALUES_TO_NAMES.end()) { + out << it->second; + } else { + out << static_cast(val); + } + return out; +} + +int _kPageTypeValues[] = { + PageType::DATA_PAGE, + PageType::INDEX_PAGE, + PageType::DICTIONARY_PAGE, + PageType::DATA_PAGE_V2 +}; +const char* _kPageTypeNames[] = { + "DATA_PAGE", + "INDEX_PAGE", + "DICTIONARY_PAGE", + "DATA_PAGE_V2" +}; +const std::map _PageType_VALUES_TO_NAMES(::apache::thrift::TEnumIterator(4, _kPageTypeValues, _kPageTypeNames), ::apache::thrift::TEnumIterator(-1, NULL, NULL)); + +std::ostream& operator<<(std::ostream& out, const PageType::type& val) { + std::map::const_iterator it = _PageType_VALUES_TO_NAMES.find(val); + if (it != _PageType_VALUES_TO_NAMES.end()) { + out << it->second; + } else { + out << static_cast(val); + } + return out; +} + +int _kBoundaryOrderValues[] = { + BoundaryOrder::UNORDERED, + BoundaryOrder::ASCENDING, + BoundaryOrder::DESCENDING +}; +const char* _kBoundaryOrderNames[] = { + "UNORDERED", + "ASCENDING", + "DESCENDING" +}; +const std::map _BoundaryOrder_VALUES_TO_NAMES(::apache::thrift::TEnumIterator(3, _kBoundaryOrderValues, _kBoundaryOrderNames), ::apache::thrift::TEnumIterator(-1, NULL, NULL)); + +std::ostream& operator<<(std::ostream& out, const BoundaryOrder::type& val) { + std::map::const_iterator it = _BoundaryOrder_VALUES_TO_NAMES.find(val); + if (it != _BoundaryOrder_VALUES_TO_NAMES.end()) { + out << it->second; + } else { + out << static_cast(val); + } + return out; +} + + +Statistics::~Statistics() throw() { +} + + +void Statistics::__set_max(const std::string& val) { + this->max = val; +__isset.max = true; +} + +void Statistics::__set_min(const std::string& val) { + this->min = val; +__isset.min = true; +} + +void Statistics::__set_null_count(const int64_t val) { + this->null_count = val; +__isset.null_count = true; +} + +void Statistics::__set_distinct_count(const int64_t val) { + this->distinct_count = val; +__isset.distinct_count = true; +} + +void Statistics::__set_max_value(const std::string& val) { + this->max_value = val; +__isset.max_value = true; +} + +void Statistics::__set_min_value(const std::string& val) { + this->min_value = val; +__isset.min_value = true; +} +std::ostream& operator<<(std::ostream& out, const Statistics& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t Statistics::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_STRING) { + xfer += iprot->readBinary(this->max); + this->__isset.max = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 2: + if (ftype == ::apache::thrift::protocol::T_STRING) { + xfer += iprot->readBinary(this->min); + this->__isset.min = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 3: + if (ftype == ::apache::thrift::protocol::T_I64) { + xfer += iprot->readI64(this->null_count); + this->__isset.null_count = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 4: + if (ftype == ::apache::thrift::protocol::T_I64) { + xfer += iprot->readI64(this->distinct_count); + this->__isset.distinct_count = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 5: + if (ftype == ::apache::thrift::protocol::T_STRING) { + xfer += iprot->readBinary(this->max_value); + this->__isset.max_value = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 6: + if (ftype == ::apache::thrift::protocol::T_STRING) { + xfer += iprot->readBinary(this->min_value); + this->__isset.min_value = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t Statistics::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("Statistics"); + + if (this->__isset.max) { + xfer += oprot->writeFieldBegin("max", ::apache::thrift::protocol::T_STRING, 1); + xfer += oprot->writeBinary(this->max); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.min) { + xfer += oprot->writeFieldBegin("min", ::apache::thrift::protocol::T_STRING, 2); + xfer += oprot->writeBinary(this->min); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.null_count) { + xfer += oprot->writeFieldBegin("null_count", ::apache::thrift::protocol::T_I64, 3); + xfer += oprot->writeI64(this->null_count); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.distinct_count) { + xfer += oprot->writeFieldBegin("distinct_count", ::apache::thrift::protocol::T_I64, 4); + xfer += oprot->writeI64(this->distinct_count); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.max_value) { + xfer += oprot->writeFieldBegin("max_value", ::apache::thrift::protocol::T_STRING, 5); + xfer += oprot->writeBinary(this->max_value); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.min_value) { + xfer += oprot->writeFieldBegin("min_value", ::apache::thrift::protocol::T_STRING, 6); + xfer += oprot->writeBinary(this->min_value); + xfer += oprot->writeFieldEnd(); + } + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(Statistics &a, Statistics &b) { + using ::std::swap; + swap(a.max, b.max); + swap(a.min, b.min); + swap(a.null_count, b.null_count); + swap(a.distinct_count, b.distinct_count); + swap(a.max_value, b.max_value); + swap(a.min_value, b.min_value); + swap(a.__isset, b.__isset); +} + +Statistics::Statistics(const Statistics& other0) { + max = other0.max; + min = other0.min; + null_count = other0.null_count; + distinct_count = other0.distinct_count; + max_value = other0.max_value; + min_value = other0.min_value; + __isset = other0.__isset; +} +Statistics& Statistics::operator=(const Statistics& other1) { + max = other1.max; + min = other1.min; + null_count = other1.null_count; + distinct_count = other1.distinct_count; + max_value = other1.max_value; + min_value = other1.min_value; + __isset = other1.__isset; + return *this; +} +void Statistics::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "Statistics("; + out << "max="; (__isset.max ? (out << to_string(max)) : (out << "")); + out << ", " << "min="; (__isset.min ? (out << to_string(min)) : (out << "")); + out << ", " << "null_count="; (__isset.null_count ? (out << to_string(null_count)) : (out << "")); + out << ", " << "distinct_count="; (__isset.distinct_count ? (out << to_string(distinct_count)) : (out << "")); + out << ", " << "max_value="; (__isset.max_value ? (out << to_string(max_value)) : (out << "")); + out << ", " << "min_value="; (__isset.min_value ? (out << to_string(min_value)) : (out << "")); + out << ")"; +} + + +StringType::~StringType() throw() { +} + +std::ostream& operator<<(std::ostream& out, const StringType& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t StringType::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t StringType::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("StringType"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(StringType &a, StringType &b) { + using ::std::swap; + (void) a; + (void) b; +} + +StringType::StringType(const StringType& other2) { + (void) other2; +} +StringType& StringType::operator=(const StringType& other3) { + (void) other3; + return *this; +} +void StringType::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "StringType("; + out << ")"; +} + + +UUIDType::~UUIDType() throw() { +} + +std::ostream& operator<<(std::ostream& out, const UUIDType& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t UUIDType::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t UUIDType::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("UUIDType"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(UUIDType &a, UUIDType &b) { + using ::std::swap; + (void) a; + (void) b; +} + +UUIDType::UUIDType(const UUIDType& other4) { + (void) other4; +} +UUIDType& UUIDType::operator=(const UUIDType& other5) { + (void) other5; + return *this; +} +void UUIDType::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "UUIDType("; + out << ")"; +} + + +MapType::~MapType() throw() { +} + +std::ostream& operator<<(std::ostream& out, const MapType& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t MapType::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t MapType::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("MapType"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(MapType &a, MapType &b) { + using ::std::swap; + (void) a; + (void) b; +} + +MapType::MapType(const MapType& other6) { + (void) other6; +} +MapType& MapType::operator=(const MapType& other7) { + (void) other7; + return *this; +} +void MapType::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "MapType("; + out << ")"; +} + + +ListType::~ListType() throw() { +} + +std::ostream& operator<<(std::ostream& out, const ListType& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t ListType::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t ListType::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("ListType"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(ListType &a, ListType &b) { + using ::std::swap; + (void) a; + (void) b; +} + +ListType::ListType(const ListType& other8) { + (void) other8; +} +ListType& ListType::operator=(const ListType& other9) { + (void) other9; + return *this; +} +void ListType::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "ListType("; + out << ")"; +} + + +EnumType::~EnumType() throw() { +} + +std::ostream& operator<<(std::ostream& out, const EnumType& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t EnumType::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t EnumType::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("EnumType"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(EnumType &a, EnumType &b) { + using ::std::swap; + (void) a; + (void) b; +} + +EnumType::EnumType(const EnumType& other10) { + (void) other10; +} +EnumType& EnumType::operator=(const EnumType& other11) { + (void) other11; + return *this; +} +void EnumType::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "EnumType("; + out << ")"; +} + + +DateType::~DateType() throw() { +} + +std::ostream& operator<<(std::ostream& out, const DateType& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t DateType::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t DateType::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("DateType"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(DateType &a, DateType &b) { + using ::std::swap; + (void) a; + (void) b; +} + +DateType::DateType(const DateType& other12) { + (void) other12; +} +DateType& DateType::operator=(const DateType& other13) { + (void) other13; + return *this; +} +void DateType::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "DateType("; + out << ")"; +} + + +NullType::~NullType() throw() { +} + +std::ostream& operator<<(std::ostream& out, const NullType& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t NullType::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t NullType::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("NullType"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(NullType &a, NullType &b) { + using ::std::swap; + (void) a; + (void) b; +} + +NullType::NullType(const NullType& other14) { + (void) other14; +} +NullType& NullType::operator=(const NullType& other15) { + (void) other15; + return *this; +} +void NullType::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "NullType("; + out << ")"; +} + + +DecimalType::~DecimalType() throw() { +} + + +void DecimalType::__set_scale(const int32_t val) { + this->scale = val; +} + +void DecimalType::__set_precision(const int32_t val) { + this->precision = val; +} +std::ostream& operator<<(std::ostream& out, const DecimalType& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t DecimalType::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + bool isset_scale = false; + bool isset_precision = false; + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->scale); + isset_scale = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 2: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->precision); + isset_precision = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + if (!isset_scale) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_precision) + throw TProtocolException(TProtocolException::INVALID_DATA); + return xfer; +} + +uint32_t DecimalType::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("DecimalType"); + + xfer += oprot->writeFieldBegin("scale", ::apache::thrift::protocol::T_I32, 1); + xfer += oprot->writeI32(this->scale); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("precision", ::apache::thrift::protocol::T_I32, 2); + xfer += oprot->writeI32(this->precision); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(DecimalType &a, DecimalType &b) { + using ::std::swap; + swap(a.scale, b.scale); + swap(a.precision, b.precision); +} + +DecimalType::DecimalType(const DecimalType& other16) { + scale = other16.scale; + precision = other16.precision; +} +DecimalType& DecimalType::operator=(const DecimalType& other17) { + scale = other17.scale; + precision = other17.precision; + return *this; +} +void DecimalType::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "DecimalType("; + out << "scale=" << to_string(scale); + out << ", " << "precision=" << to_string(precision); + out << ")"; +} + + +MilliSeconds::~MilliSeconds() throw() { +} + +std::ostream& operator<<(std::ostream& out, const MilliSeconds& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t MilliSeconds::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t MilliSeconds::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("MilliSeconds"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(MilliSeconds &a, MilliSeconds &b) { + using ::std::swap; + (void) a; + (void) b; +} + +MilliSeconds::MilliSeconds(const MilliSeconds& other18) { + (void) other18; +} +MilliSeconds& MilliSeconds::operator=(const MilliSeconds& other19) { + (void) other19; + return *this; +} +void MilliSeconds::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "MilliSeconds("; + out << ")"; +} + + +MicroSeconds::~MicroSeconds() throw() { +} + +std::ostream& operator<<(std::ostream& out, const MicroSeconds& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t MicroSeconds::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t MicroSeconds::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("MicroSeconds"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(MicroSeconds &a, MicroSeconds &b) { + using ::std::swap; + (void) a; + (void) b; +} + +MicroSeconds::MicroSeconds(const MicroSeconds& other20) { + (void) other20; +} +MicroSeconds& MicroSeconds::operator=(const MicroSeconds& other21) { + (void) other21; + return *this; +} +void MicroSeconds::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "MicroSeconds("; + out << ")"; +} + + +TimeUnit::~TimeUnit() throw() { +} + + +void TimeUnit::__set_MILLIS(const MilliSeconds& val) { + this->MILLIS = val; +__isset.MILLIS = true; +} + +void TimeUnit::__set_MICROS(const MicroSeconds& val) { + this->MICROS = val; +__isset.MICROS = true; +} +std::ostream& operator<<(std::ostream& out, const TimeUnit& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t TimeUnit::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->MILLIS.read(iprot); + this->__isset.MILLIS = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 2: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->MICROS.read(iprot); + this->__isset.MICROS = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t TimeUnit::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("TimeUnit"); + + if (this->__isset.MILLIS) { + xfer += oprot->writeFieldBegin("MILLIS", ::apache::thrift::protocol::T_STRUCT, 1); + xfer += this->MILLIS.write(oprot); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.MICROS) { + xfer += oprot->writeFieldBegin("MICROS", ::apache::thrift::protocol::T_STRUCT, 2); + xfer += this->MICROS.write(oprot); + xfer += oprot->writeFieldEnd(); + } + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(TimeUnit &a, TimeUnit &b) { + using ::std::swap; + swap(a.MILLIS, b.MILLIS); + swap(a.MICROS, b.MICROS); + swap(a.__isset, b.__isset); +} + +TimeUnit::TimeUnit(const TimeUnit& other22) { + MILLIS = other22.MILLIS; + MICROS = other22.MICROS; + __isset = other22.__isset; +} +TimeUnit& TimeUnit::operator=(const TimeUnit& other23) { + MILLIS = other23.MILLIS; + MICROS = other23.MICROS; + __isset = other23.__isset; + return *this; +} +void TimeUnit::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "TimeUnit("; + out << "MILLIS="; (__isset.MILLIS ? (out << to_string(MILLIS)) : (out << "")); + out << ", " << "MICROS="; (__isset.MICROS ? (out << to_string(MICROS)) : (out << "")); + out << ")"; +} + + +TimestampType::~TimestampType() throw() { +} + + +void TimestampType::__set_isAdjustedToUTC(const bool val) { + this->isAdjustedToUTC = val; +} + +void TimestampType::__set_unit(const TimeUnit& val) { + this->unit = val; +} +std::ostream& operator<<(std::ostream& out, const TimestampType& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t TimestampType::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + bool isset_isAdjustedToUTC = false; + bool isset_unit = false; + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_BOOL) { + xfer += iprot->readBool(this->isAdjustedToUTC); + isset_isAdjustedToUTC = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 2: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->unit.read(iprot); + isset_unit = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + if (!isset_isAdjustedToUTC) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_unit) + throw TProtocolException(TProtocolException::INVALID_DATA); + return xfer; +} + +uint32_t TimestampType::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("TimestampType"); + + xfer += oprot->writeFieldBegin("isAdjustedToUTC", ::apache::thrift::protocol::T_BOOL, 1); + xfer += oprot->writeBool(this->isAdjustedToUTC); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("unit", ::apache::thrift::protocol::T_STRUCT, 2); + xfer += this->unit.write(oprot); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(TimestampType &a, TimestampType &b) { + using ::std::swap; + swap(a.isAdjustedToUTC, b.isAdjustedToUTC); + swap(a.unit, b.unit); +} + +TimestampType::TimestampType(const TimestampType& other24) { + isAdjustedToUTC = other24.isAdjustedToUTC; + unit = other24.unit; +} +TimestampType& TimestampType::operator=(const TimestampType& other25) { + isAdjustedToUTC = other25.isAdjustedToUTC; + unit = other25.unit; + return *this; +} +void TimestampType::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "TimestampType("; + out << "isAdjustedToUTC=" << to_string(isAdjustedToUTC); + out << ", " << "unit=" << to_string(unit); + out << ")"; +} + + +TimeType::~TimeType() throw() { +} + + +void TimeType::__set_isAdjustedToUTC(const bool val) { + this->isAdjustedToUTC = val; +} + +void TimeType::__set_unit(const TimeUnit& val) { + this->unit = val; +} +std::ostream& operator<<(std::ostream& out, const TimeType& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t TimeType::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + bool isset_isAdjustedToUTC = false; + bool isset_unit = false; + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_BOOL) { + xfer += iprot->readBool(this->isAdjustedToUTC); + isset_isAdjustedToUTC = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 2: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->unit.read(iprot); + isset_unit = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + if (!isset_isAdjustedToUTC) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_unit) + throw TProtocolException(TProtocolException::INVALID_DATA); + return xfer; +} + +uint32_t TimeType::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("TimeType"); + + xfer += oprot->writeFieldBegin("isAdjustedToUTC", ::apache::thrift::protocol::T_BOOL, 1); + xfer += oprot->writeBool(this->isAdjustedToUTC); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("unit", ::apache::thrift::protocol::T_STRUCT, 2); + xfer += this->unit.write(oprot); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(TimeType &a, TimeType &b) { + using ::std::swap; + swap(a.isAdjustedToUTC, b.isAdjustedToUTC); + swap(a.unit, b.unit); +} + +TimeType::TimeType(const TimeType& other26) { + isAdjustedToUTC = other26.isAdjustedToUTC; + unit = other26.unit; +} +TimeType& TimeType::operator=(const TimeType& other27) { + isAdjustedToUTC = other27.isAdjustedToUTC; + unit = other27.unit; + return *this; +} +void TimeType::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "TimeType("; + out << "isAdjustedToUTC=" << to_string(isAdjustedToUTC); + out << ", " << "unit=" << to_string(unit); + out << ")"; +} + + +IntType::~IntType() throw() { +} + + +void IntType::__set_bitWidth(const int8_t val) { + this->bitWidth = val; +} + +void IntType::__set_isSigned(const bool val) { + this->isSigned = val; +} +std::ostream& operator<<(std::ostream& out, const IntType& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t IntType::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + bool isset_bitWidth = false; + bool isset_isSigned = false; + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_BYTE) { + xfer += iprot->readByte(this->bitWidth); + isset_bitWidth = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 2: + if (ftype == ::apache::thrift::protocol::T_BOOL) { + xfer += iprot->readBool(this->isSigned); + isset_isSigned = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + if (!isset_bitWidth) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_isSigned) + throw TProtocolException(TProtocolException::INVALID_DATA); + return xfer; +} + +uint32_t IntType::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("IntType"); + + xfer += oprot->writeFieldBegin("bitWidth", ::apache::thrift::protocol::T_BYTE, 1); + xfer += oprot->writeByte(this->bitWidth); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("isSigned", ::apache::thrift::protocol::T_BOOL, 2); + xfer += oprot->writeBool(this->isSigned); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(IntType &a, IntType &b) { + using ::std::swap; + swap(a.bitWidth, b.bitWidth); + swap(a.isSigned, b.isSigned); +} + +IntType::IntType(const IntType& other28) { + bitWidth = other28.bitWidth; + isSigned = other28.isSigned; +} +IntType& IntType::operator=(const IntType& other29) { + bitWidth = other29.bitWidth; + isSigned = other29.isSigned; + return *this; +} +void IntType::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "IntType("; + out << "bitWidth=" << to_string(bitWidth); + out << ", " << "isSigned=" << to_string(isSigned); + out << ")"; +} + + +JsonType::~JsonType() throw() { +} + +std::ostream& operator<<(std::ostream& out, const JsonType& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t JsonType::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t JsonType::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("JsonType"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(JsonType &a, JsonType &b) { + using ::std::swap; + (void) a; + (void) b; +} + +JsonType::JsonType(const JsonType& other30) { + (void) other30; +} +JsonType& JsonType::operator=(const JsonType& other31) { + (void) other31; + return *this; +} +void JsonType::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "JsonType("; + out << ")"; +} + + +BsonType::~BsonType() throw() { +} + +std::ostream& operator<<(std::ostream& out, const BsonType& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t BsonType::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t BsonType::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("BsonType"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(BsonType &a, BsonType &b) { + using ::std::swap; + (void) a; + (void) b; +} + +BsonType::BsonType(const BsonType& other32) { + (void) other32; +} +BsonType& BsonType::operator=(const BsonType& other33) { + (void) other33; + return *this; +} +void BsonType::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "BsonType("; + out << ")"; +} + + +LogicalType::~LogicalType() throw() { +} + + +void LogicalType::__set_STRING(const StringType& val) { + this->STRING = val; +__isset.STRING = true; +} + +void LogicalType::__set_MAP(const MapType& val) { + this->MAP = val; +__isset.MAP = true; +} + +void LogicalType::__set_LIST(const ListType& val) { + this->LIST = val; +__isset.LIST = true; +} + +void LogicalType::__set_ENUM(const EnumType& val) { + this->ENUM = val; +__isset.ENUM = true; +} + +void LogicalType::__set_DECIMAL(const DecimalType& val) { + this->DECIMAL = val; +__isset.DECIMAL = true; +} + +void LogicalType::__set_DATE(const DateType& val) { + this->DATE = val; +__isset.DATE = true; +} + +void LogicalType::__set_TIME(const TimeType& val) { + this->TIME = val; +__isset.TIME = true; +} + +void LogicalType::__set_TIMESTAMP(const TimestampType& val) { + this->TIMESTAMP = val; +__isset.TIMESTAMP = true; +} + +void LogicalType::__set_INTEGER(const IntType& val) { + this->INTEGER = val; +__isset.INTEGER = true; +} + +void LogicalType::__set_UNKNOWN(const NullType& val) { + this->UNKNOWN = val; +__isset.UNKNOWN = true; +} + +void LogicalType::__set_JSON(const JsonType& val) { + this->JSON = val; +__isset.JSON = true; +} + +void LogicalType::__set_BSON(const BsonType& val) { + this->BSON = val; +__isset.BSON = true; +} +std::ostream& operator<<(std::ostream& out, const LogicalType& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t LogicalType::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->STRING.read(iprot); + this->__isset.STRING = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 2: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->MAP.read(iprot); + this->__isset.MAP = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 3: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->LIST.read(iprot); + this->__isset.LIST = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 4: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->ENUM.read(iprot); + this->__isset.ENUM = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 5: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->DECIMAL.read(iprot); + this->__isset.DECIMAL = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 6: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->DATE.read(iprot); + this->__isset.DATE = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 7: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->TIME.read(iprot); + this->__isset.TIME = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 8: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->TIMESTAMP.read(iprot); + this->__isset.TIMESTAMP = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 10: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->INTEGER.read(iprot); + this->__isset.INTEGER = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 11: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->UNKNOWN.read(iprot); + this->__isset.UNKNOWN = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 12: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->JSON.read(iprot); + this->__isset.JSON = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 13: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->BSON.read(iprot); + this->__isset.BSON = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t LogicalType::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("LogicalType"); + + if (this->__isset.STRING) { + xfer += oprot->writeFieldBegin("STRING", ::apache::thrift::protocol::T_STRUCT, 1); + xfer += this->STRING.write(oprot); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.MAP) { + xfer += oprot->writeFieldBegin("MAP", ::apache::thrift::protocol::T_STRUCT, 2); + xfer += this->MAP.write(oprot); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.LIST) { + xfer += oprot->writeFieldBegin("LIST", ::apache::thrift::protocol::T_STRUCT, 3); + xfer += this->LIST.write(oprot); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.ENUM) { + xfer += oprot->writeFieldBegin("ENUM", ::apache::thrift::protocol::T_STRUCT, 4); + xfer += this->ENUM.write(oprot); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.DECIMAL) { + xfer += oprot->writeFieldBegin("DECIMAL", ::apache::thrift::protocol::T_STRUCT, 5); + xfer += this->DECIMAL.write(oprot); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.DATE) { + xfer += oprot->writeFieldBegin("DATE", ::apache::thrift::protocol::T_STRUCT, 6); + xfer += this->DATE.write(oprot); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.TIME) { + xfer += oprot->writeFieldBegin("TIME", ::apache::thrift::protocol::T_STRUCT, 7); + xfer += this->TIME.write(oprot); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.TIMESTAMP) { + xfer += oprot->writeFieldBegin("TIMESTAMP", ::apache::thrift::protocol::T_STRUCT, 8); + xfer += this->TIMESTAMP.write(oprot); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.INTEGER) { + xfer += oprot->writeFieldBegin("INTEGER", ::apache::thrift::protocol::T_STRUCT, 10); + xfer += this->INTEGER.write(oprot); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.UNKNOWN) { + xfer += oprot->writeFieldBegin("UNKNOWN", ::apache::thrift::protocol::T_STRUCT, 11); + xfer += this->UNKNOWN.write(oprot); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.JSON) { + xfer += oprot->writeFieldBegin("JSON", ::apache::thrift::protocol::T_STRUCT, 12); + xfer += this->JSON.write(oprot); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.BSON) { + xfer += oprot->writeFieldBegin("BSON", ::apache::thrift::protocol::T_STRUCT, 13); + xfer += this->BSON.write(oprot); + xfer += oprot->writeFieldEnd(); + } + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(LogicalType &a, LogicalType &b) { + using ::std::swap; + swap(a.STRING, b.STRING); + swap(a.MAP, b.MAP); + swap(a.LIST, b.LIST); + swap(a.ENUM, b.ENUM); + swap(a.DECIMAL, b.DECIMAL); + swap(a.DATE, b.DATE); + swap(a.TIME, b.TIME); + swap(a.TIMESTAMP, b.TIMESTAMP); + swap(a.INTEGER, b.INTEGER); + swap(a.UNKNOWN, b.UNKNOWN); + swap(a.JSON, b.JSON); + swap(a.BSON, b.BSON); + swap(a.__isset, b.__isset); +} + +LogicalType::LogicalType(const LogicalType& other34) { + STRING = other34.STRING; + MAP = other34.MAP; + LIST = other34.LIST; + ENUM = other34.ENUM; + DECIMAL = other34.DECIMAL; + DATE = other34.DATE; + TIME = other34.TIME; + TIMESTAMP = other34.TIMESTAMP; + INTEGER = other34.INTEGER; + UNKNOWN = other34.UNKNOWN; + JSON = other34.JSON; + BSON = other34.BSON; + __isset = other34.__isset; +} +LogicalType& LogicalType::operator=(const LogicalType& other35) { + STRING = other35.STRING; + MAP = other35.MAP; + LIST = other35.LIST; + ENUM = other35.ENUM; + DECIMAL = other35.DECIMAL; + DATE = other35.DATE; + TIME = other35.TIME; + TIMESTAMP = other35.TIMESTAMP; + INTEGER = other35.INTEGER; + UNKNOWN = other35.UNKNOWN; + JSON = other35.JSON; + BSON = other35.BSON; + __isset = other35.__isset; + return *this; +} +void LogicalType::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "LogicalType("; + out << "STRING="; (__isset.STRING ? (out << to_string(STRING)) : (out << "")); + out << ", " << "MAP="; (__isset.MAP ? (out << to_string(MAP)) : (out << "")); + out << ", " << "LIST="; (__isset.LIST ? (out << to_string(LIST)) : (out << "")); + out << ", " << "ENUM="; (__isset.ENUM ? (out << to_string(ENUM)) : (out << "")); + out << ", " << "DECIMAL="; (__isset.DECIMAL ? (out << to_string(DECIMAL)) : (out << "")); + out << ", " << "DATE="; (__isset.DATE ? (out << to_string(DATE)) : (out << "")); + out << ", " << "TIME="; (__isset.TIME ? (out << to_string(TIME)) : (out << "")); + out << ", " << "TIMESTAMP="; (__isset.TIMESTAMP ? (out << to_string(TIMESTAMP)) : (out << "")); + out << ", " << "INTEGER="; (__isset.INTEGER ? (out << to_string(INTEGER)) : (out << "")); + out << ", " << "UNKNOWN="; (__isset.UNKNOWN ? (out << to_string(UNKNOWN)) : (out << "")); + out << ", " << "JSON="; (__isset.JSON ? (out << to_string(JSON)) : (out << "")); + out << ", " << "BSON="; (__isset.BSON ? (out << to_string(BSON)) : (out << "")); + out << ")"; +} + + +SchemaElement::~SchemaElement() throw() { +} + + +void SchemaElement::__set_type(const Type::type val) { + this->type = val; +__isset.type = true; +} + +void SchemaElement::__set_type_length(const int32_t val) { + this->type_length = val; +__isset.type_length = true; +} + +void SchemaElement::__set_repetition_type(const FieldRepetitionType::type val) { + this->repetition_type = val; +__isset.repetition_type = true; +} + +void SchemaElement::__set_name(const std::string& val) { + this->name = val; +} + +void SchemaElement::__set_num_children(const int32_t val) { + this->num_children = val; +__isset.num_children = true; +} + +void SchemaElement::__set_converted_type(const ConvertedType::type val) { + this->converted_type = val; +__isset.converted_type = true; +} + +void SchemaElement::__set_scale(const int32_t val) { + this->scale = val; +__isset.scale = true; +} + +void SchemaElement::__set_precision(const int32_t val) { + this->precision = val; +__isset.precision = true; +} + +void SchemaElement::__set_field_id(const int32_t val) { + this->field_id = val; +__isset.field_id = true; +} + +void SchemaElement::__set_logicalType(const LogicalType& val) { + this->logicalType = val; +__isset.logicalType = true; +} +std::ostream& operator<<(std::ostream& out, const SchemaElement& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t SchemaElement::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + bool isset_name = false; + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_I32) { + int32_t ecast36; + xfer += iprot->readI32(ecast36); + this->type = (Type::type)ecast36; + this->__isset.type = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 2: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->type_length); + this->__isset.type_length = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 3: + if (ftype == ::apache::thrift::protocol::T_I32) { + int32_t ecast37; + xfer += iprot->readI32(ecast37); + this->repetition_type = (FieldRepetitionType::type)ecast37; + this->__isset.repetition_type = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 4: + if (ftype == ::apache::thrift::protocol::T_STRING) { + xfer += iprot->readString(this->name); + isset_name = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 5: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->num_children); + this->__isset.num_children = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 6: + if (ftype == ::apache::thrift::protocol::T_I32) { + int32_t ecast38; + xfer += iprot->readI32(ecast38); + this->converted_type = (ConvertedType::type)ecast38; + this->__isset.converted_type = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 7: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->scale); + this->__isset.scale = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 8: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->precision); + this->__isset.precision = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 9: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->field_id); + this->__isset.field_id = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 10: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->logicalType.read(iprot); + this->__isset.logicalType = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + if (!isset_name) + throw TProtocolException(TProtocolException::INVALID_DATA); + return xfer; +} + +uint32_t SchemaElement::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("SchemaElement"); + + if (this->__isset.type) { + xfer += oprot->writeFieldBegin("type", ::apache::thrift::protocol::T_I32, 1); + xfer += oprot->writeI32((int32_t)this->type); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.type_length) { + xfer += oprot->writeFieldBegin("type_length", ::apache::thrift::protocol::T_I32, 2); + xfer += oprot->writeI32(this->type_length); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.repetition_type) { + xfer += oprot->writeFieldBegin("repetition_type", ::apache::thrift::protocol::T_I32, 3); + xfer += oprot->writeI32((int32_t)this->repetition_type); + xfer += oprot->writeFieldEnd(); + } + xfer += oprot->writeFieldBegin("name", ::apache::thrift::protocol::T_STRING, 4); + xfer += oprot->writeString(this->name); + xfer += oprot->writeFieldEnd(); + + if (this->__isset.num_children) { + xfer += oprot->writeFieldBegin("num_children", ::apache::thrift::protocol::T_I32, 5); + xfer += oprot->writeI32(this->num_children); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.converted_type) { + xfer += oprot->writeFieldBegin("converted_type", ::apache::thrift::protocol::T_I32, 6); + xfer += oprot->writeI32((int32_t)this->converted_type); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.scale) { + xfer += oprot->writeFieldBegin("scale", ::apache::thrift::protocol::T_I32, 7); + xfer += oprot->writeI32(this->scale); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.precision) { + xfer += oprot->writeFieldBegin("precision", ::apache::thrift::protocol::T_I32, 8); + xfer += oprot->writeI32(this->precision); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.field_id) { + xfer += oprot->writeFieldBegin("field_id", ::apache::thrift::protocol::T_I32, 9); + xfer += oprot->writeI32(this->field_id); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.logicalType) { + xfer += oprot->writeFieldBegin("logicalType", ::apache::thrift::protocol::T_STRUCT, 10); + xfer += this->logicalType.write(oprot); + xfer += oprot->writeFieldEnd(); + } + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(SchemaElement &a, SchemaElement &b) { + using ::std::swap; + swap(a.type, b.type); + swap(a.type_length, b.type_length); + swap(a.repetition_type, b.repetition_type); + swap(a.name, b.name); + swap(a.num_children, b.num_children); + swap(a.converted_type, b.converted_type); + swap(a.scale, b.scale); + swap(a.precision, b.precision); + swap(a.field_id, b.field_id); + swap(a.logicalType, b.logicalType); + swap(a.__isset, b.__isset); +} + +SchemaElement::SchemaElement(const SchemaElement& other39) { + type = other39.type; + type_length = other39.type_length; + repetition_type = other39.repetition_type; + name = other39.name; + num_children = other39.num_children; + converted_type = other39.converted_type; + scale = other39.scale; + precision = other39.precision; + field_id = other39.field_id; + logicalType = other39.logicalType; + __isset = other39.__isset; +} +SchemaElement& SchemaElement::operator=(const SchemaElement& other40) { + type = other40.type; + type_length = other40.type_length; + repetition_type = other40.repetition_type; + name = other40.name; + num_children = other40.num_children; + converted_type = other40.converted_type; + scale = other40.scale; + precision = other40.precision; + field_id = other40.field_id; + logicalType = other40.logicalType; + __isset = other40.__isset; + return *this; +} +void SchemaElement::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "SchemaElement("; + out << "type="; (__isset.type ? (out << to_string(type)) : (out << "")); + out << ", " << "type_length="; (__isset.type_length ? (out << to_string(type_length)) : (out << "")); + out << ", " << "repetition_type="; (__isset.repetition_type ? (out << to_string(repetition_type)) : (out << "")); + out << ", " << "name=" << to_string(name); + out << ", " << "num_children="; (__isset.num_children ? (out << to_string(num_children)) : (out << "")); + out << ", " << "converted_type="; (__isset.converted_type ? (out << to_string(converted_type)) : (out << "")); + out << ", " << "scale="; (__isset.scale ? (out << to_string(scale)) : (out << "")); + out << ", " << "precision="; (__isset.precision ? (out << to_string(precision)) : (out << "")); + out << ", " << "field_id="; (__isset.field_id ? (out << to_string(field_id)) : (out << "")); + out << ", " << "logicalType="; (__isset.logicalType ? (out << to_string(logicalType)) : (out << "")); + out << ")"; +} + + +DataPageHeader::~DataPageHeader() throw() { +} + + +void DataPageHeader::__set_num_values(const int32_t val) { + this->num_values = val; +} + +void DataPageHeader::__set_encoding(const Encoding::type val) { + this->encoding = val; +} + +void DataPageHeader::__set_definition_level_encoding(const Encoding::type val) { + this->definition_level_encoding = val; +} + +void DataPageHeader::__set_repetition_level_encoding(const Encoding::type val) { + this->repetition_level_encoding = val; +} + +void DataPageHeader::__set_statistics(const Statistics& val) { + this->statistics = val; +__isset.statistics = true; +} +std::ostream& operator<<(std::ostream& out, const DataPageHeader& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t DataPageHeader::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + bool isset_num_values = false; + bool isset_encoding = false; + bool isset_definition_level_encoding = false; + bool isset_repetition_level_encoding = false; + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->num_values); + isset_num_values = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 2: + if (ftype == ::apache::thrift::protocol::T_I32) { + int32_t ecast41; + xfer += iprot->readI32(ecast41); + this->encoding = (Encoding::type)ecast41; + isset_encoding = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 3: + if (ftype == ::apache::thrift::protocol::T_I32) { + int32_t ecast42; + xfer += iprot->readI32(ecast42); + this->definition_level_encoding = (Encoding::type)ecast42; + isset_definition_level_encoding = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 4: + if (ftype == ::apache::thrift::protocol::T_I32) { + int32_t ecast43; + xfer += iprot->readI32(ecast43); + this->repetition_level_encoding = (Encoding::type)ecast43; + isset_repetition_level_encoding = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 5: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->statistics.read(iprot); + this->__isset.statistics = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + if (!isset_num_values) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_encoding) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_definition_level_encoding) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_repetition_level_encoding) + throw TProtocolException(TProtocolException::INVALID_DATA); + return xfer; +} + +uint32_t DataPageHeader::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("DataPageHeader"); + + xfer += oprot->writeFieldBegin("num_values", ::apache::thrift::protocol::T_I32, 1); + xfer += oprot->writeI32(this->num_values); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("encoding", ::apache::thrift::protocol::T_I32, 2); + xfer += oprot->writeI32((int32_t)this->encoding); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("definition_level_encoding", ::apache::thrift::protocol::T_I32, 3); + xfer += oprot->writeI32((int32_t)this->definition_level_encoding); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("repetition_level_encoding", ::apache::thrift::protocol::T_I32, 4); + xfer += oprot->writeI32((int32_t)this->repetition_level_encoding); + xfer += oprot->writeFieldEnd(); + + if (this->__isset.statistics) { + xfer += oprot->writeFieldBegin("statistics", ::apache::thrift::protocol::T_STRUCT, 5); + xfer += this->statistics.write(oprot); + xfer += oprot->writeFieldEnd(); + } + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(DataPageHeader &a, DataPageHeader &b) { + using ::std::swap; + swap(a.num_values, b.num_values); + swap(a.encoding, b.encoding); + swap(a.definition_level_encoding, b.definition_level_encoding); + swap(a.repetition_level_encoding, b.repetition_level_encoding); + swap(a.statistics, b.statistics); + swap(a.__isset, b.__isset); +} + +DataPageHeader::DataPageHeader(const DataPageHeader& other44) { + num_values = other44.num_values; + encoding = other44.encoding; + definition_level_encoding = other44.definition_level_encoding; + repetition_level_encoding = other44.repetition_level_encoding; + statistics = other44.statistics; + __isset = other44.__isset; +} +DataPageHeader& DataPageHeader::operator=(const DataPageHeader& other45) { + num_values = other45.num_values; + encoding = other45.encoding; + definition_level_encoding = other45.definition_level_encoding; + repetition_level_encoding = other45.repetition_level_encoding; + statistics = other45.statistics; + __isset = other45.__isset; + return *this; +} +void DataPageHeader::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "DataPageHeader("; + out << "num_values=" << to_string(num_values); + out << ", " << "encoding=" << to_string(encoding); + out << ", " << "definition_level_encoding=" << to_string(definition_level_encoding); + out << ", " << "repetition_level_encoding=" << to_string(repetition_level_encoding); + out << ", " << "statistics="; (__isset.statistics ? (out << to_string(statistics)) : (out << "")); + out << ")"; +} + + +IndexPageHeader::~IndexPageHeader() throw() { +} + +std::ostream& operator<<(std::ostream& out, const IndexPageHeader& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t IndexPageHeader::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t IndexPageHeader::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("IndexPageHeader"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(IndexPageHeader &a, IndexPageHeader &b) { + using ::std::swap; + (void) a; + (void) b; +} + +IndexPageHeader::IndexPageHeader(const IndexPageHeader& other46) { + (void) other46; +} +IndexPageHeader& IndexPageHeader::operator=(const IndexPageHeader& other47) { + (void) other47; + return *this; +} +void IndexPageHeader::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "IndexPageHeader("; + out << ")"; +} + + +DictionaryPageHeader::~DictionaryPageHeader() throw() { +} + + +void DictionaryPageHeader::__set_num_values(const int32_t val) { + this->num_values = val; +} + +void DictionaryPageHeader::__set_encoding(const Encoding::type val) { + this->encoding = val; +} + +void DictionaryPageHeader::__set_is_sorted(const bool val) { + this->is_sorted = val; +__isset.is_sorted = true; +} +std::ostream& operator<<(std::ostream& out, const DictionaryPageHeader& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t DictionaryPageHeader::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + bool isset_num_values = false; + bool isset_encoding = false; + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->num_values); + isset_num_values = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 2: + if (ftype == ::apache::thrift::protocol::T_I32) { + int32_t ecast48; + xfer += iprot->readI32(ecast48); + this->encoding = (Encoding::type)ecast48; + isset_encoding = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 3: + if (ftype == ::apache::thrift::protocol::T_BOOL) { + xfer += iprot->readBool(this->is_sorted); + this->__isset.is_sorted = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + if (!isset_num_values) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_encoding) + throw TProtocolException(TProtocolException::INVALID_DATA); + return xfer; +} + +uint32_t DictionaryPageHeader::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("DictionaryPageHeader"); + + xfer += oprot->writeFieldBegin("num_values", ::apache::thrift::protocol::T_I32, 1); + xfer += oprot->writeI32(this->num_values); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("encoding", ::apache::thrift::protocol::T_I32, 2); + xfer += oprot->writeI32((int32_t)this->encoding); + xfer += oprot->writeFieldEnd(); + + if (this->__isset.is_sorted) { + xfer += oprot->writeFieldBegin("is_sorted", ::apache::thrift::protocol::T_BOOL, 3); + xfer += oprot->writeBool(this->is_sorted); + xfer += oprot->writeFieldEnd(); + } + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(DictionaryPageHeader &a, DictionaryPageHeader &b) { + using ::std::swap; + swap(a.num_values, b.num_values); + swap(a.encoding, b.encoding); + swap(a.is_sorted, b.is_sorted); + swap(a.__isset, b.__isset); +} + +DictionaryPageHeader::DictionaryPageHeader(const DictionaryPageHeader& other49) { + num_values = other49.num_values; + encoding = other49.encoding; + is_sorted = other49.is_sorted; + __isset = other49.__isset; +} +DictionaryPageHeader& DictionaryPageHeader::operator=(const DictionaryPageHeader& other50) { + num_values = other50.num_values; + encoding = other50.encoding; + is_sorted = other50.is_sorted; + __isset = other50.__isset; + return *this; +} +void DictionaryPageHeader::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "DictionaryPageHeader("; + out << "num_values=" << to_string(num_values); + out << ", " << "encoding=" << to_string(encoding); + out << ", " << "is_sorted="; (__isset.is_sorted ? (out << to_string(is_sorted)) : (out << "")); + out << ")"; +} + + +DataPageHeaderV2::~DataPageHeaderV2() throw() { +} + + +void DataPageHeaderV2::__set_num_values(const int32_t val) { + this->num_values = val; +} + +void DataPageHeaderV2::__set_num_nulls(const int32_t val) { + this->num_nulls = val; +} + +void DataPageHeaderV2::__set_num_rows(const int32_t val) { + this->num_rows = val; +} + +void DataPageHeaderV2::__set_encoding(const Encoding::type val) { + this->encoding = val; +} + +void DataPageHeaderV2::__set_definition_levels_byte_length(const int32_t val) { + this->definition_levels_byte_length = val; +} + +void DataPageHeaderV2::__set_repetition_levels_byte_length(const int32_t val) { + this->repetition_levels_byte_length = val; +} + +void DataPageHeaderV2::__set_is_compressed(const bool val) { + this->is_compressed = val; +__isset.is_compressed = true; +} + +void DataPageHeaderV2::__set_statistics(const Statistics& val) { + this->statistics = val; +__isset.statistics = true; +} +std::ostream& operator<<(std::ostream& out, const DataPageHeaderV2& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t DataPageHeaderV2::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + bool isset_num_values = false; + bool isset_num_nulls = false; + bool isset_num_rows = false; + bool isset_encoding = false; + bool isset_definition_levels_byte_length = false; + bool isset_repetition_levels_byte_length = false; + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->num_values); + isset_num_values = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 2: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->num_nulls); + isset_num_nulls = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 3: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->num_rows); + isset_num_rows = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 4: + if (ftype == ::apache::thrift::protocol::T_I32) { + int32_t ecast51; + xfer += iprot->readI32(ecast51); + this->encoding = (Encoding::type)ecast51; + isset_encoding = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 5: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->definition_levels_byte_length); + isset_definition_levels_byte_length = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 6: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->repetition_levels_byte_length); + isset_repetition_levels_byte_length = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 7: + if (ftype == ::apache::thrift::protocol::T_BOOL) { + xfer += iprot->readBool(this->is_compressed); + this->__isset.is_compressed = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 8: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->statistics.read(iprot); + this->__isset.statistics = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + if (!isset_num_values) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_num_nulls) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_num_rows) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_encoding) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_definition_levels_byte_length) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_repetition_levels_byte_length) + throw TProtocolException(TProtocolException::INVALID_DATA); + return xfer; +} + +uint32_t DataPageHeaderV2::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("DataPageHeaderV2"); + + xfer += oprot->writeFieldBegin("num_values", ::apache::thrift::protocol::T_I32, 1); + xfer += oprot->writeI32(this->num_values); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("num_nulls", ::apache::thrift::protocol::T_I32, 2); + xfer += oprot->writeI32(this->num_nulls); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("num_rows", ::apache::thrift::protocol::T_I32, 3); + xfer += oprot->writeI32(this->num_rows); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("encoding", ::apache::thrift::protocol::T_I32, 4); + xfer += oprot->writeI32((int32_t)this->encoding); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("definition_levels_byte_length", ::apache::thrift::protocol::T_I32, 5); + xfer += oprot->writeI32(this->definition_levels_byte_length); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("repetition_levels_byte_length", ::apache::thrift::protocol::T_I32, 6); + xfer += oprot->writeI32(this->repetition_levels_byte_length); + xfer += oprot->writeFieldEnd(); + + if (this->__isset.is_compressed) { + xfer += oprot->writeFieldBegin("is_compressed", ::apache::thrift::protocol::T_BOOL, 7); + xfer += oprot->writeBool(this->is_compressed); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.statistics) { + xfer += oprot->writeFieldBegin("statistics", ::apache::thrift::protocol::T_STRUCT, 8); + xfer += this->statistics.write(oprot); + xfer += oprot->writeFieldEnd(); + } + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(DataPageHeaderV2 &a, DataPageHeaderV2 &b) { + using ::std::swap; + swap(a.num_values, b.num_values); + swap(a.num_nulls, b.num_nulls); + swap(a.num_rows, b.num_rows); + swap(a.encoding, b.encoding); + swap(a.definition_levels_byte_length, b.definition_levels_byte_length); + swap(a.repetition_levels_byte_length, b.repetition_levels_byte_length); + swap(a.is_compressed, b.is_compressed); + swap(a.statistics, b.statistics); + swap(a.__isset, b.__isset); +} + +DataPageHeaderV2::DataPageHeaderV2(const DataPageHeaderV2& other52) { + num_values = other52.num_values; + num_nulls = other52.num_nulls; + num_rows = other52.num_rows; + encoding = other52.encoding; + definition_levels_byte_length = other52.definition_levels_byte_length; + repetition_levels_byte_length = other52.repetition_levels_byte_length; + is_compressed = other52.is_compressed; + statistics = other52.statistics; + __isset = other52.__isset; +} +DataPageHeaderV2& DataPageHeaderV2::operator=(const DataPageHeaderV2& other53) { + num_values = other53.num_values; + num_nulls = other53.num_nulls; + num_rows = other53.num_rows; + encoding = other53.encoding; + definition_levels_byte_length = other53.definition_levels_byte_length; + repetition_levels_byte_length = other53.repetition_levels_byte_length; + is_compressed = other53.is_compressed; + statistics = other53.statistics; + __isset = other53.__isset; + return *this; +} +void DataPageHeaderV2::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "DataPageHeaderV2("; + out << "num_values=" << to_string(num_values); + out << ", " << "num_nulls=" << to_string(num_nulls); + out << ", " << "num_rows=" << to_string(num_rows); + out << ", " << "encoding=" << to_string(encoding); + out << ", " << "definition_levels_byte_length=" << to_string(definition_levels_byte_length); + out << ", " << "repetition_levels_byte_length=" << to_string(repetition_levels_byte_length); + out << ", " << "is_compressed="; (__isset.is_compressed ? (out << to_string(is_compressed)) : (out << "")); + out << ", " << "statistics="; (__isset.statistics ? (out << to_string(statistics)) : (out << "")); + out << ")"; +} + + +PageHeader::~PageHeader() throw() { +} + + +void PageHeader::__set_type(const PageType::type val) { + this->type = val; +} + +void PageHeader::__set_uncompressed_page_size(const int32_t val) { + this->uncompressed_page_size = val; +} + +void PageHeader::__set_compressed_page_size(const int32_t val) { + this->compressed_page_size = val; +} + +void PageHeader::__set_crc(const int32_t val) { + this->crc = val; +__isset.crc = true; +} + +void PageHeader::__set_data_page_header(const DataPageHeader& val) { + this->data_page_header = val; +__isset.data_page_header = true; +} + +void PageHeader::__set_index_page_header(const IndexPageHeader& val) { + this->index_page_header = val; +__isset.index_page_header = true; +} + +void PageHeader::__set_dictionary_page_header(const DictionaryPageHeader& val) { + this->dictionary_page_header = val; +__isset.dictionary_page_header = true; +} + +void PageHeader::__set_data_page_header_v2(const DataPageHeaderV2& val) { + this->data_page_header_v2 = val; +__isset.data_page_header_v2 = true; +} +std::ostream& operator<<(std::ostream& out, const PageHeader& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t PageHeader::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + bool isset_type = false; + bool isset_uncompressed_page_size = false; + bool isset_compressed_page_size = false; + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_I32) { + int32_t ecast54; + xfer += iprot->readI32(ecast54); + this->type = (PageType::type)ecast54; + isset_type = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 2: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->uncompressed_page_size); + isset_uncompressed_page_size = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 3: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->compressed_page_size); + isset_compressed_page_size = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 4: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->crc); + this->__isset.crc = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 5: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->data_page_header.read(iprot); + this->__isset.data_page_header = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 6: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->index_page_header.read(iprot); + this->__isset.index_page_header = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 7: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->dictionary_page_header.read(iprot); + this->__isset.dictionary_page_header = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 8: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->data_page_header_v2.read(iprot); + this->__isset.data_page_header_v2 = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + if (!isset_type) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_uncompressed_page_size) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_compressed_page_size) + throw TProtocolException(TProtocolException::INVALID_DATA); + return xfer; +} + +uint32_t PageHeader::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("PageHeader"); + + xfer += oprot->writeFieldBegin("type", ::apache::thrift::protocol::T_I32, 1); + xfer += oprot->writeI32((int32_t)this->type); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("uncompressed_page_size", ::apache::thrift::protocol::T_I32, 2); + xfer += oprot->writeI32(this->uncompressed_page_size); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("compressed_page_size", ::apache::thrift::protocol::T_I32, 3); + xfer += oprot->writeI32(this->compressed_page_size); + xfer += oprot->writeFieldEnd(); + + if (this->__isset.crc) { + xfer += oprot->writeFieldBegin("crc", ::apache::thrift::protocol::T_I32, 4); + xfer += oprot->writeI32(this->crc); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.data_page_header) { + xfer += oprot->writeFieldBegin("data_page_header", ::apache::thrift::protocol::T_STRUCT, 5); + xfer += this->data_page_header.write(oprot); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.index_page_header) { + xfer += oprot->writeFieldBegin("index_page_header", ::apache::thrift::protocol::T_STRUCT, 6); + xfer += this->index_page_header.write(oprot); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.dictionary_page_header) { + xfer += oprot->writeFieldBegin("dictionary_page_header", ::apache::thrift::protocol::T_STRUCT, 7); + xfer += this->dictionary_page_header.write(oprot); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.data_page_header_v2) { + xfer += oprot->writeFieldBegin("data_page_header_v2", ::apache::thrift::protocol::T_STRUCT, 8); + xfer += this->data_page_header_v2.write(oprot); + xfer += oprot->writeFieldEnd(); + } + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(PageHeader &a, PageHeader &b) { + using ::std::swap; + swap(a.type, b.type); + swap(a.uncompressed_page_size, b.uncompressed_page_size); + swap(a.compressed_page_size, b.compressed_page_size); + swap(a.crc, b.crc); + swap(a.data_page_header, b.data_page_header); + swap(a.index_page_header, b.index_page_header); + swap(a.dictionary_page_header, b.dictionary_page_header); + swap(a.data_page_header_v2, b.data_page_header_v2); + swap(a.__isset, b.__isset); +} + +PageHeader::PageHeader(const PageHeader& other55) { + type = other55.type; + uncompressed_page_size = other55.uncompressed_page_size; + compressed_page_size = other55.compressed_page_size; + crc = other55.crc; + data_page_header = other55.data_page_header; + index_page_header = other55.index_page_header; + dictionary_page_header = other55.dictionary_page_header; + data_page_header_v2 = other55.data_page_header_v2; + __isset = other55.__isset; +} +PageHeader& PageHeader::operator=(const PageHeader& other56) { + type = other56.type; + uncompressed_page_size = other56.uncompressed_page_size; + compressed_page_size = other56.compressed_page_size; + crc = other56.crc; + data_page_header = other56.data_page_header; + index_page_header = other56.index_page_header; + dictionary_page_header = other56.dictionary_page_header; + data_page_header_v2 = other56.data_page_header_v2; + __isset = other56.__isset; + return *this; +} +void PageHeader::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "PageHeader("; + out << "type=" << to_string(type); + out << ", " << "uncompressed_page_size=" << to_string(uncompressed_page_size); + out << ", " << "compressed_page_size=" << to_string(compressed_page_size); + out << ", " << "crc="; (__isset.crc ? (out << to_string(crc)) : (out << "")); + out << ", " << "data_page_header="; (__isset.data_page_header ? (out << to_string(data_page_header)) : (out << "")); + out << ", " << "index_page_header="; (__isset.index_page_header ? (out << to_string(index_page_header)) : (out << "")); + out << ", " << "dictionary_page_header="; (__isset.dictionary_page_header ? (out << to_string(dictionary_page_header)) : (out << "")); + out << ", " << "data_page_header_v2="; (__isset.data_page_header_v2 ? (out << to_string(data_page_header_v2)) : (out << "")); + out << ")"; +} + + +KeyValue::~KeyValue() throw() { +} + + +void KeyValue::__set_key(const std::string& val) { + this->key = val; +} + +void KeyValue::__set_value(const std::string& val) { + this->value = val; +__isset.value = true; +} +std::ostream& operator<<(std::ostream& out, const KeyValue& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t KeyValue::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + bool isset_key = false; + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_STRING) { + xfer += iprot->readString(this->key); + isset_key = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 2: + if (ftype == ::apache::thrift::protocol::T_STRING) { + xfer += iprot->readString(this->value); + this->__isset.value = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + if (!isset_key) + throw TProtocolException(TProtocolException::INVALID_DATA); + return xfer; +} + +uint32_t KeyValue::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("KeyValue"); + + xfer += oprot->writeFieldBegin("key", ::apache::thrift::protocol::T_STRING, 1); + xfer += oprot->writeString(this->key); + xfer += oprot->writeFieldEnd(); + + if (this->__isset.value) { + xfer += oprot->writeFieldBegin("value", ::apache::thrift::protocol::T_STRING, 2); + xfer += oprot->writeString(this->value); + xfer += oprot->writeFieldEnd(); + } + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(KeyValue &a, KeyValue &b) { + using ::std::swap; + swap(a.key, b.key); + swap(a.value, b.value); + swap(a.__isset, b.__isset); +} + +KeyValue::KeyValue(const KeyValue& other57) { + key = other57.key; + value = other57.value; + __isset = other57.__isset; +} +KeyValue& KeyValue::operator=(const KeyValue& other58) { + key = other58.key; + value = other58.value; + __isset = other58.__isset; + return *this; +} +void KeyValue::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "KeyValue("; + out << "key=" << to_string(key); + out << ", " << "value="; (__isset.value ? (out << to_string(value)) : (out << "")); + out << ")"; +} + + +SortingColumn::~SortingColumn() throw() { +} + + +void SortingColumn::__set_column_idx(const int32_t val) { + this->column_idx = val; +} + +void SortingColumn::__set_descending(const bool val) { + this->descending = val; +} + +void SortingColumn::__set_nulls_first(const bool val) { + this->nulls_first = val; +} +std::ostream& operator<<(std::ostream& out, const SortingColumn& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t SortingColumn::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + bool isset_column_idx = false; + bool isset_descending = false; + bool isset_nulls_first = false; + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->column_idx); + isset_column_idx = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 2: + if (ftype == ::apache::thrift::protocol::T_BOOL) { + xfer += iprot->readBool(this->descending); + isset_descending = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 3: + if (ftype == ::apache::thrift::protocol::T_BOOL) { + xfer += iprot->readBool(this->nulls_first); + isset_nulls_first = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + if (!isset_column_idx) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_descending) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_nulls_first) + throw TProtocolException(TProtocolException::INVALID_DATA); + return xfer; +} + +uint32_t SortingColumn::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("SortingColumn"); + + xfer += oprot->writeFieldBegin("column_idx", ::apache::thrift::protocol::T_I32, 1); + xfer += oprot->writeI32(this->column_idx); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("descending", ::apache::thrift::protocol::T_BOOL, 2); + xfer += oprot->writeBool(this->descending); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("nulls_first", ::apache::thrift::protocol::T_BOOL, 3); + xfer += oprot->writeBool(this->nulls_first); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(SortingColumn &a, SortingColumn &b) { + using ::std::swap; + swap(a.column_idx, b.column_idx); + swap(a.descending, b.descending); + swap(a.nulls_first, b.nulls_first); +} + +SortingColumn::SortingColumn(const SortingColumn& other59) { + column_idx = other59.column_idx; + descending = other59.descending; + nulls_first = other59.nulls_first; +} +SortingColumn& SortingColumn::operator=(const SortingColumn& other60) { + column_idx = other60.column_idx; + descending = other60.descending; + nulls_first = other60.nulls_first; + return *this; +} +void SortingColumn::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "SortingColumn("; + out << "column_idx=" << to_string(column_idx); + out << ", " << "descending=" << to_string(descending); + out << ", " << "nulls_first=" << to_string(nulls_first); + out << ")"; +} + + +PageEncodingStats::~PageEncodingStats() throw() { +} + + +void PageEncodingStats::__set_page_type(const PageType::type val) { + this->page_type = val; +} + +void PageEncodingStats::__set_encoding(const Encoding::type val) { + this->encoding = val; +} + +void PageEncodingStats::__set_count(const int32_t val) { + this->count = val; +} +std::ostream& operator<<(std::ostream& out, const PageEncodingStats& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t PageEncodingStats::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + bool isset_page_type = false; + bool isset_encoding = false; + bool isset_count = false; + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_I32) { + int32_t ecast61; + xfer += iprot->readI32(ecast61); + this->page_type = (PageType::type)ecast61; + isset_page_type = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 2: + if (ftype == ::apache::thrift::protocol::T_I32) { + int32_t ecast62; + xfer += iprot->readI32(ecast62); + this->encoding = (Encoding::type)ecast62; + isset_encoding = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 3: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->count); + isset_count = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + if (!isset_page_type) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_encoding) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_count) + throw TProtocolException(TProtocolException::INVALID_DATA); + return xfer; +} + +uint32_t PageEncodingStats::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("PageEncodingStats"); + + xfer += oprot->writeFieldBegin("page_type", ::apache::thrift::protocol::T_I32, 1); + xfer += oprot->writeI32((int32_t)this->page_type); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("encoding", ::apache::thrift::protocol::T_I32, 2); + xfer += oprot->writeI32((int32_t)this->encoding); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("count", ::apache::thrift::protocol::T_I32, 3); + xfer += oprot->writeI32(this->count); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(PageEncodingStats &a, PageEncodingStats &b) { + using ::std::swap; + swap(a.page_type, b.page_type); + swap(a.encoding, b.encoding); + swap(a.count, b.count); +} + +PageEncodingStats::PageEncodingStats(const PageEncodingStats& other63) { + page_type = other63.page_type; + encoding = other63.encoding; + count = other63.count; +} +PageEncodingStats& PageEncodingStats::operator=(const PageEncodingStats& other64) { + page_type = other64.page_type; + encoding = other64.encoding; + count = other64.count; + return *this; +} +void PageEncodingStats::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "PageEncodingStats("; + out << "page_type=" << to_string(page_type); + out << ", " << "encoding=" << to_string(encoding); + out << ", " << "count=" << to_string(count); + out << ")"; +} + + +ColumnMetaData::~ColumnMetaData() throw() { +} + + +void ColumnMetaData::__set_type(const Type::type val) { + this->type = val; +} + +void ColumnMetaData::__set_encodings(const std::vector & val) { + this->encodings = val; +} + +void ColumnMetaData::__set_path_in_schema(const std::vector & val) { + this->path_in_schema = val; +} + +void ColumnMetaData::__set_codec(const CompressionCodec::type val) { + this->codec = val; +} + +void ColumnMetaData::__set_num_values(const int64_t val) { + this->num_values = val; +} + +void ColumnMetaData::__set_total_uncompressed_size(const int64_t val) { + this->total_uncompressed_size = val; +} + +void ColumnMetaData::__set_total_compressed_size(const int64_t val) { + this->total_compressed_size = val; +} + +void ColumnMetaData::__set_key_value_metadata(const std::vector & val) { + this->key_value_metadata = val; +__isset.key_value_metadata = true; +} + +void ColumnMetaData::__set_data_page_offset(const int64_t val) { + this->data_page_offset = val; +} + +void ColumnMetaData::__set_index_page_offset(const int64_t val) { + this->index_page_offset = val; +__isset.index_page_offset = true; +} + +void ColumnMetaData::__set_dictionary_page_offset(const int64_t val) { + this->dictionary_page_offset = val; +__isset.dictionary_page_offset = true; +} + +void ColumnMetaData::__set_statistics(const Statistics& val) { + this->statistics = val; +__isset.statistics = true; +} + +void ColumnMetaData::__set_encoding_stats(const std::vector & val) { + this->encoding_stats = val; +__isset.encoding_stats = true; +} +std::ostream& operator<<(std::ostream& out, const ColumnMetaData& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t ColumnMetaData::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + bool isset_type = false; + bool isset_encodings = false; + bool isset_path_in_schema = false; + bool isset_codec = false; + bool isset_num_values = false; + bool isset_total_uncompressed_size = false; + bool isset_total_compressed_size = false; + bool isset_data_page_offset = false; + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_I32) { + int32_t ecast65; + xfer += iprot->readI32(ecast65); + this->type = (Type::type)ecast65; + isset_type = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 2: + if (ftype == ::apache::thrift::protocol::T_LIST) { + { + this->encodings.clear(); + uint32_t _size66; + ::apache::thrift::protocol::TType _etype69; + xfer += iprot->readListBegin(_etype69, _size66); + this->encodings.resize(_size66); + uint32_t _i70; + for (_i70 = 0; _i70 < _size66; ++_i70) + { + int32_t ecast71; + xfer += iprot->readI32(ecast71); + this->encodings[_i70] = (Encoding::type)ecast71; + } + xfer += iprot->readListEnd(); + } + isset_encodings = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 3: + if (ftype == ::apache::thrift::protocol::T_LIST) { + { + this->path_in_schema.clear(); + uint32_t _size72; + ::apache::thrift::protocol::TType _etype75; + xfer += iprot->readListBegin(_etype75, _size72); + this->path_in_schema.resize(_size72); + uint32_t _i76; + for (_i76 = 0; _i76 < _size72; ++_i76) + { + xfer += iprot->readString(this->path_in_schema[_i76]); + } + xfer += iprot->readListEnd(); + } + isset_path_in_schema = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 4: + if (ftype == ::apache::thrift::protocol::T_I32) { + int32_t ecast77; + xfer += iprot->readI32(ecast77); + this->codec = (CompressionCodec::type)ecast77; + isset_codec = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 5: + if (ftype == ::apache::thrift::protocol::T_I64) { + xfer += iprot->readI64(this->num_values); + isset_num_values = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 6: + if (ftype == ::apache::thrift::protocol::T_I64) { + xfer += iprot->readI64(this->total_uncompressed_size); + isset_total_uncompressed_size = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 7: + if (ftype == ::apache::thrift::protocol::T_I64) { + xfer += iprot->readI64(this->total_compressed_size); + isset_total_compressed_size = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 8: + if (ftype == ::apache::thrift::protocol::T_LIST) { + { + this->key_value_metadata.clear(); + uint32_t _size78; + ::apache::thrift::protocol::TType _etype81; + xfer += iprot->readListBegin(_etype81, _size78); + this->key_value_metadata.resize(_size78); + uint32_t _i82; + for (_i82 = 0; _i82 < _size78; ++_i82) + { + xfer += this->key_value_metadata[_i82].read(iprot); + } + xfer += iprot->readListEnd(); + } + this->__isset.key_value_metadata = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 9: + if (ftype == ::apache::thrift::protocol::T_I64) { + xfer += iprot->readI64(this->data_page_offset); + isset_data_page_offset = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 10: + if (ftype == ::apache::thrift::protocol::T_I64) { + xfer += iprot->readI64(this->index_page_offset); + this->__isset.index_page_offset = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 11: + if (ftype == ::apache::thrift::protocol::T_I64) { + xfer += iprot->readI64(this->dictionary_page_offset); + this->__isset.dictionary_page_offset = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 12: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->statistics.read(iprot); + this->__isset.statistics = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 13: + if (ftype == ::apache::thrift::protocol::T_LIST) { + { + this->encoding_stats.clear(); + uint32_t _size83; + ::apache::thrift::protocol::TType _etype86; + xfer += iprot->readListBegin(_etype86, _size83); + this->encoding_stats.resize(_size83); + uint32_t _i87; + for (_i87 = 0; _i87 < _size83; ++_i87) + { + xfer += this->encoding_stats[_i87].read(iprot); + } + xfer += iprot->readListEnd(); + } + this->__isset.encoding_stats = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + if (!isset_type) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_encodings) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_path_in_schema) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_codec) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_num_values) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_total_uncompressed_size) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_total_compressed_size) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_data_page_offset) + throw TProtocolException(TProtocolException::INVALID_DATA); + return xfer; +} + +uint32_t ColumnMetaData::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("ColumnMetaData"); + + xfer += oprot->writeFieldBegin("type", ::apache::thrift::protocol::T_I32, 1); + xfer += oprot->writeI32((int32_t)this->type); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("encodings", ::apache::thrift::protocol::T_LIST, 2); + { + xfer += oprot->writeListBegin(::apache::thrift::protocol::T_I32, static_cast(this->encodings.size())); + std::vector ::const_iterator _iter88; + for (_iter88 = this->encodings.begin(); _iter88 != this->encodings.end(); ++_iter88) + { + xfer += oprot->writeI32((int32_t)(*_iter88)); + } + xfer += oprot->writeListEnd(); + } + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("path_in_schema", ::apache::thrift::protocol::T_LIST, 3); + { + xfer += oprot->writeListBegin(::apache::thrift::protocol::T_STRING, static_cast(this->path_in_schema.size())); + std::vector ::const_iterator _iter89; + for (_iter89 = this->path_in_schema.begin(); _iter89 != this->path_in_schema.end(); ++_iter89) + { + xfer += oprot->writeString((*_iter89)); + } + xfer += oprot->writeListEnd(); + } + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("codec", ::apache::thrift::protocol::T_I32, 4); + xfer += oprot->writeI32((int32_t)this->codec); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("num_values", ::apache::thrift::protocol::T_I64, 5); + xfer += oprot->writeI64(this->num_values); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("total_uncompressed_size", ::apache::thrift::protocol::T_I64, 6); + xfer += oprot->writeI64(this->total_uncompressed_size); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("total_compressed_size", ::apache::thrift::protocol::T_I64, 7); + xfer += oprot->writeI64(this->total_compressed_size); + xfer += oprot->writeFieldEnd(); + + if (this->__isset.key_value_metadata) { + xfer += oprot->writeFieldBegin("key_value_metadata", ::apache::thrift::protocol::T_LIST, 8); + { + xfer += oprot->writeListBegin(::apache::thrift::protocol::T_STRUCT, static_cast(this->key_value_metadata.size())); + std::vector ::const_iterator _iter90; + for (_iter90 = this->key_value_metadata.begin(); _iter90 != this->key_value_metadata.end(); ++_iter90) + { + xfer += (*_iter90).write(oprot); + } + xfer += oprot->writeListEnd(); + } + xfer += oprot->writeFieldEnd(); + } + xfer += oprot->writeFieldBegin("data_page_offset", ::apache::thrift::protocol::T_I64, 9); + xfer += oprot->writeI64(this->data_page_offset); + xfer += oprot->writeFieldEnd(); + + if (this->__isset.index_page_offset) { + xfer += oprot->writeFieldBegin("index_page_offset", ::apache::thrift::protocol::T_I64, 10); + xfer += oprot->writeI64(this->index_page_offset); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.dictionary_page_offset) { + xfer += oprot->writeFieldBegin("dictionary_page_offset", ::apache::thrift::protocol::T_I64, 11); + xfer += oprot->writeI64(this->dictionary_page_offset); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.statistics) { + xfer += oprot->writeFieldBegin("statistics", ::apache::thrift::protocol::T_STRUCT, 12); + xfer += this->statistics.write(oprot); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.encoding_stats) { + xfer += oprot->writeFieldBegin("encoding_stats", ::apache::thrift::protocol::T_LIST, 13); + { + xfer += oprot->writeListBegin(::apache::thrift::protocol::T_STRUCT, static_cast(this->encoding_stats.size())); + std::vector ::const_iterator _iter91; + for (_iter91 = this->encoding_stats.begin(); _iter91 != this->encoding_stats.end(); ++_iter91) + { + xfer += (*_iter91).write(oprot); + } + xfer += oprot->writeListEnd(); + } + xfer += oprot->writeFieldEnd(); + } + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(ColumnMetaData &a, ColumnMetaData &b) { + using ::std::swap; + swap(a.type, b.type); + swap(a.encodings, b.encodings); + swap(a.path_in_schema, b.path_in_schema); + swap(a.codec, b.codec); + swap(a.num_values, b.num_values); + swap(a.total_uncompressed_size, b.total_uncompressed_size); + swap(a.total_compressed_size, b.total_compressed_size); + swap(a.key_value_metadata, b.key_value_metadata); + swap(a.data_page_offset, b.data_page_offset); + swap(a.index_page_offset, b.index_page_offset); + swap(a.dictionary_page_offset, b.dictionary_page_offset); + swap(a.statistics, b.statistics); + swap(a.encoding_stats, b.encoding_stats); + swap(a.__isset, b.__isset); +} + +ColumnMetaData::ColumnMetaData(const ColumnMetaData& other92) { + type = other92.type; + encodings = other92.encodings; + path_in_schema = other92.path_in_schema; + codec = other92.codec; + num_values = other92.num_values; + total_uncompressed_size = other92.total_uncompressed_size; + total_compressed_size = other92.total_compressed_size; + key_value_metadata = other92.key_value_metadata; + data_page_offset = other92.data_page_offset; + index_page_offset = other92.index_page_offset; + dictionary_page_offset = other92.dictionary_page_offset; + statistics = other92.statistics; + encoding_stats = other92.encoding_stats; + __isset = other92.__isset; +} +ColumnMetaData& ColumnMetaData::operator=(const ColumnMetaData& other93) { + type = other93.type; + encodings = other93.encodings; + path_in_schema = other93.path_in_schema; + codec = other93.codec; + num_values = other93.num_values; + total_uncompressed_size = other93.total_uncompressed_size; + total_compressed_size = other93.total_compressed_size; + key_value_metadata = other93.key_value_metadata; + data_page_offset = other93.data_page_offset; + index_page_offset = other93.index_page_offset; + dictionary_page_offset = other93.dictionary_page_offset; + statistics = other93.statistics; + encoding_stats = other93.encoding_stats; + __isset = other93.__isset; + return *this; +} +void ColumnMetaData::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "ColumnMetaData("; + out << "type=" << to_string(type); + out << ", " << "encodings=" << to_string(encodings); + out << ", " << "path_in_schema=" << to_string(path_in_schema); + out << ", " << "codec=" << to_string(codec); + out << ", " << "num_values=" << to_string(num_values); + out << ", " << "total_uncompressed_size=" << to_string(total_uncompressed_size); + out << ", " << "total_compressed_size=" << to_string(total_compressed_size); + out << ", " << "key_value_metadata="; (__isset.key_value_metadata ? (out << to_string(key_value_metadata)) : (out << "")); + out << ", " << "data_page_offset=" << to_string(data_page_offset); + out << ", " << "index_page_offset="; (__isset.index_page_offset ? (out << to_string(index_page_offset)) : (out << "")); + out << ", " << "dictionary_page_offset="; (__isset.dictionary_page_offset ? (out << to_string(dictionary_page_offset)) : (out << "")); + out << ", " << "statistics="; (__isset.statistics ? (out << to_string(statistics)) : (out << "")); + out << ", " << "encoding_stats="; (__isset.encoding_stats ? (out << to_string(encoding_stats)) : (out << "")); + out << ")"; +} + + +EncryptionWithFooterKey::~EncryptionWithFooterKey() throw() { +} + +std::ostream& operator<<(std::ostream& out, const EncryptionWithFooterKey& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t EncryptionWithFooterKey::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t EncryptionWithFooterKey::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("EncryptionWithFooterKey"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(EncryptionWithFooterKey &a, EncryptionWithFooterKey &b) { + using ::std::swap; + (void) a; + (void) b; +} + +EncryptionWithFooterKey::EncryptionWithFooterKey(const EncryptionWithFooterKey& other94) { + (void) other94; +} +EncryptionWithFooterKey& EncryptionWithFooterKey::operator=(const EncryptionWithFooterKey& other95) { + (void) other95; + return *this; +} +void EncryptionWithFooterKey::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "EncryptionWithFooterKey("; + out << ")"; +} + + +EncryptionWithColumnKey::~EncryptionWithColumnKey() throw() { +} + + +void EncryptionWithColumnKey::__set_path_in_schema(const std::vector & val) { + this->path_in_schema = val; +} + +void EncryptionWithColumnKey::__set_column_key_metadata(const std::string& val) { + this->column_key_metadata = val; +__isset.column_key_metadata = true; +} +std::ostream& operator<<(std::ostream& out, const EncryptionWithColumnKey& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t EncryptionWithColumnKey::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + bool isset_path_in_schema = false; + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_LIST) { + { + this->path_in_schema.clear(); + uint32_t _size96; + ::apache::thrift::protocol::TType _etype99; + xfer += iprot->readListBegin(_etype99, _size96); + this->path_in_schema.resize(_size96); + uint32_t _i100; + for (_i100 = 0; _i100 < _size96; ++_i100) + { + xfer += iprot->readString(this->path_in_schema[_i100]); + } + xfer += iprot->readListEnd(); + } + isset_path_in_schema = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 2: + if (ftype == ::apache::thrift::protocol::T_STRING) { + xfer += iprot->readBinary(this->column_key_metadata); + this->__isset.column_key_metadata = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + if (!isset_path_in_schema) + throw TProtocolException(TProtocolException::INVALID_DATA); + return xfer; +} + +uint32_t EncryptionWithColumnKey::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("EncryptionWithColumnKey"); + + xfer += oprot->writeFieldBegin("path_in_schema", ::apache::thrift::protocol::T_LIST, 1); + { + xfer += oprot->writeListBegin(::apache::thrift::protocol::T_STRING, static_cast(this->path_in_schema.size())); + std::vector ::const_iterator _iter101; + for (_iter101 = this->path_in_schema.begin(); _iter101 != this->path_in_schema.end(); ++_iter101) + { + xfer += oprot->writeString((*_iter101)); + } + xfer += oprot->writeListEnd(); + } + xfer += oprot->writeFieldEnd(); + + if (this->__isset.column_key_metadata) { + xfer += oprot->writeFieldBegin("column_key_metadata", ::apache::thrift::protocol::T_STRING, 2); + xfer += oprot->writeBinary(this->column_key_metadata); + xfer += oprot->writeFieldEnd(); + } + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(EncryptionWithColumnKey &a, EncryptionWithColumnKey &b) { + using ::std::swap; + swap(a.path_in_schema, b.path_in_schema); + swap(a.column_key_metadata, b.column_key_metadata); + swap(a.__isset, b.__isset); +} + +EncryptionWithColumnKey::EncryptionWithColumnKey(const EncryptionWithColumnKey& other102) { + path_in_schema = other102.path_in_schema; + column_key_metadata = other102.column_key_metadata; + __isset = other102.__isset; +} +EncryptionWithColumnKey& EncryptionWithColumnKey::operator=(const EncryptionWithColumnKey& other103) { + path_in_schema = other103.path_in_schema; + column_key_metadata = other103.column_key_metadata; + __isset = other103.__isset; + return *this; +} +void EncryptionWithColumnKey::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "EncryptionWithColumnKey("; + out << "path_in_schema=" << to_string(path_in_schema); + out << ", " << "column_key_metadata="; (__isset.column_key_metadata ? (out << to_string(column_key_metadata)) : (out << "")); + out << ")"; +} + + +ColumnCryptoMetaData::~ColumnCryptoMetaData() throw() { +} + + +void ColumnCryptoMetaData::__set_ENCRYPTION_WITH_FOOTER_KEY(const EncryptionWithFooterKey& val) { + this->ENCRYPTION_WITH_FOOTER_KEY = val; +__isset.ENCRYPTION_WITH_FOOTER_KEY = true; +} + +void ColumnCryptoMetaData::__set_ENCRYPTION_WITH_COLUMN_KEY(const EncryptionWithColumnKey& val) { + this->ENCRYPTION_WITH_COLUMN_KEY = val; +__isset.ENCRYPTION_WITH_COLUMN_KEY = true; +} +std::ostream& operator<<(std::ostream& out, const ColumnCryptoMetaData& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t ColumnCryptoMetaData::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->ENCRYPTION_WITH_FOOTER_KEY.read(iprot); + this->__isset.ENCRYPTION_WITH_FOOTER_KEY = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 2: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->ENCRYPTION_WITH_COLUMN_KEY.read(iprot); + this->__isset.ENCRYPTION_WITH_COLUMN_KEY = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t ColumnCryptoMetaData::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("ColumnCryptoMetaData"); + + if (this->__isset.ENCRYPTION_WITH_FOOTER_KEY) { + xfer += oprot->writeFieldBegin("ENCRYPTION_WITH_FOOTER_KEY", ::apache::thrift::protocol::T_STRUCT, 1); + xfer += this->ENCRYPTION_WITH_FOOTER_KEY.write(oprot); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.ENCRYPTION_WITH_COLUMN_KEY) { + xfer += oprot->writeFieldBegin("ENCRYPTION_WITH_COLUMN_KEY", ::apache::thrift::protocol::T_STRUCT, 2); + xfer += this->ENCRYPTION_WITH_COLUMN_KEY.write(oprot); + xfer += oprot->writeFieldEnd(); + } + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(ColumnCryptoMetaData &a, ColumnCryptoMetaData &b) { + using ::std::swap; + swap(a.ENCRYPTION_WITH_FOOTER_KEY, b.ENCRYPTION_WITH_FOOTER_KEY); + swap(a.ENCRYPTION_WITH_COLUMN_KEY, b.ENCRYPTION_WITH_COLUMN_KEY); + swap(a.__isset, b.__isset); +} + +ColumnCryptoMetaData::ColumnCryptoMetaData(const ColumnCryptoMetaData& other104) { + ENCRYPTION_WITH_FOOTER_KEY = other104.ENCRYPTION_WITH_FOOTER_KEY; + ENCRYPTION_WITH_COLUMN_KEY = other104.ENCRYPTION_WITH_COLUMN_KEY; + __isset = other104.__isset; +} +ColumnCryptoMetaData& ColumnCryptoMetaData::operator=(const ColumnCryptoMetaData& other105) { + ENCRYPTION_WITH_FOOTER_KEY = other105.ENCRYPTION_WITH_FOOTER_KEY; + ENCRYPTION_WITH_COLUMN_KEY = other105.ENCRYPTION_WITH_COLUMN_KEY; + __isset = other105.__isset; + return *this; +} +void ColumnCryptoMetaData::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "ColumnCryptoMetaData("; + out << "ENCRYPTION_WITH_FOOTER_KEY="; (__isset.ENCRYPTION_WITH_FOOTER_KEY ? (out << to_string(ENCRYPTION_WITH_FOOTER_KEY)) : (out << "")); + out << ", " << "ENCRYPTION_WITH_COLUMN_KEY="; (__isset.ENCRYPTION_WITH_COLUMN_KEY ? (out << to_string(ENCRYPTION_WITH_COLUMN_KEY)) : (out << "")); + out << ")"; +} + + +ColumnChunk::~ColumnChunk() throw() { +} + + +void ColumnChunk::__set_file_path(const std::string& val) { + this->file_path = val; +__isset.file_path = true; +} + +void ColumnChunk::__set_file_offset(const int64_t val) { + this->file_offset = val; +} + +void ColumnChunk::__set_meta_data(const ColumnMetaData& val) { + this->meta_data = val; +__isset.meta_data = true; +} + +void ColumnChunk::__set_offset_index_offset(const int64_t val) { + this->offset_index_offset = val; +__isset.offset_index_offset = true; +} + +void ColumnChunk::__set_offset_index_length(const int32_t val) { + this->offset_index_length = val; +__isset.offset_index_length = true; +} + +void ColumnChunk::__set_column_index_offset(const int64_t val) { + this->column_index_offset = val; +__isset.column_index_offset = true; +} + +void ColumnChunk::__set_column_index_length(const int32_t val) { + this->column_index_length = val; +__isset.column_index_length = true; +} + +void ColumnChunk::__set_crypto_meta_data(const ColumnCryptoMetaData& val) { + this->crypto_meta_data = val; +__isset.crypto_meta_data = true; +} +std::ostream& operator<<(std::ostream& out, const ColumnChunk& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t ColumnChunk::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + bool isset_file_offset = false; + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_STRING) { + xfer += iprot->readString(this->file_path); + this->__isset.file_path = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 2: + if (ftype == ::apache::thrift::protocol::T_I64) { + xfer += iprot->readI64(this->file_offset); + isset_file_offset = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 3: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->meta_data.read(iprot); + this->__isset.meta_data = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 4: + if (ftype == ::apache::thrift::protocol::T_I64) { + xfer += iprot->readI64(this->offset_index_offset); + this->__isset.offset_index_offset = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 5: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->offset_index_length); + this->__isset.offset_index_length = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 6: + if (ftype == ::apache::thrift::protocol::T_I64) { + xfer += iprot->readI64(this->column_index_offset); + this->__isset.column_index_offset = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 7: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->column_index_length); + this->__isset.column_index_length = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 8: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->crypto_meta_data.read(iprot); + this->__isset.crypto_meta_data = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + if (!isset_file_offset) + throw TProtocolException(TProtocolException::INVALID_DATA); + return xfer; +} + +uint32_t ColumnChunk::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("ColumnChunk"); + + if (this->__isset.file_path) { + xfer += oprot->writeFieldBegin("file_path", ::apache::thrift::protocol::T_STRING, 1); + xfer += oprot->writeString(this->file_path); + xfer += oprot->writeFieldEnd(); + } + xfer += oprot->writeFieldBegin("file_offset", ::apache::thrift::protocol::T_I64, 2); + xfer += oprot->writeI64(this->file_offset); + xfer += oprot->writeFieldEnd(); + + if (this->__isset.meta_data) { + xfer += oprot->writeFieldBegin("meta_data", ::apache::thrift::protocol::T_STRUCT, 3); + xfer += this->meta_data.write(oprot); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.offset_index_offset) { + xfer += oprot->writeFieldBegin("offset_index_offset", ::apache::thrift::protocol::T_I64, 4); + xfer += oprot->writeI64(this->offset_index_offset); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.offset_index_length) { + xfer += oprot->writeFieldBegin("offset_index_length", ::apache::thrift::protocol::T_I32, 5); + xfer += oprot->writeI32(this->offset_index_length); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.column_index_offset) { + xfer += oprot->writeFieldBegin("column_index_offset", ::apache::thrift::protocol::T_I64, 6); + xfer += oprot->writeI64(this->column_index_offset); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.column_index_length) { + xfer += oprot->writeFieldBegin("column_index_length", ::apache::thrift::protocol::T_I32, 7); + xfer += oprot->writeI32(this->column_index_length); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.crypto_meta_data) { + xfer += oprot->writeFieldBegin("crypto_meta_data", ::apache::thrift::protocol::T_STRUCT, 8); + xfer += this->crypto_meta_data.write(oprot); + xfer += oprot->writeFieldEnd(); + } + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(ColumnChunk &a, ColumnChunk &b) { + using ::std::swap; + swap(a.file_path, b.file_path); + swap(a.file_offset, b.file_offset); + swap(a.meta_data, b.meta_data); + swap(a.offset_index_offset, b.offset_index_offset); + swap(a.offset_index_length, b.offset_index_length); + swap(a.column_index_offset, b.column_index_offset); + swap(a.column_index_length, b.column_index_length); + swap(a.crypto_meta_data, b.crypto_meta_data); + swap(a.__isset, b.__isset); +} + +ColumnChunk::ColumnChunk(const ColumnChunk& other106) { + file_path = other106.file_path; + file_offset = other106.file_offset; + meta_data = other106.meta_data; + offset_index_offset = other106.offset_index_offset; + offset_index_length = other106.offset_index_length; + column_index_offset = other106.column_index_offset; + column_index_length = other106.column_index_length; + crypto_meta_data = other106.crypto_meta_data; + __isset = other106.__isset; +} +ColumnChunk& ColumnChunk::operator=(const ColumnChunk& other107) { + file_path = other107.file_path; + file_offset = other107.file_offset; + meta_data = other107.meta_data; + offset_index_offset = other107.offset_index_offset; + offset_index_length = other107.offset_index_length; + column_index_offset = other107.column_index_offset; + column_index_length = other107.column_index_length; + crypto_meta_data = other107.crypto_meta_data; + __isset = other107.__isset; + return *this; +} +void ColumnChunk::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "ColumnChunk("; + out << "file_path="; (__isset.file_path ? (out << to_string(file_path)) : (out << "")); + out << ", " << "file_offset=" << to_string(file_offset); + out << ", " << "meta_data="; (__isset.meta_data ? (out << to_string(meta_data)) : (out << "")); + out << ", " << "offset_index_offset="; (__isset.offset_index_offset ? (out << to_string(offset_index_offset)) : (out << "")); + out << ", " << "offset_index_length="; (__isset.offset_index_length ? (out << to_string(offset_index_length)) : (out << "")); + out << ", " << "column_index_offset="; (__isset.column_index_offset ? (out << to_string(column_index_offset)) : (out << "")); + out << ", " << "column_index_length="; (__isset.column_index_length ? (out << to_string(column_index_length)) : (out << "")); + out << ", " << "crypto_meta_data="; (__isset.crypto_meta_data ? (out << to_string(crypto_meta_data)) : (out << "")); + out << ")"; +} + + +RowGroup::~RowGroup() throw() { +} + + +void RowGroup::__set_columns(const std::vector & val) { + this->columns = val; +} + +void RowGroup::__set_total_byte_size(const int64_t val) { + this->total_byte_size = val; +} + +void RowGroup::__set_num_rows(const int64_t val) { + this->num_rows = val; +} + +void RowGroup::__set_sorting_columns(const std::vector & val) { + this->sorting_columns = val; +__isset.sorting_columns = true; +} + +void RowGroup::__set_file_offset(const int64_t val) { + this->file_offset = val; +__isset.file_offset = true; +} + +void RowGroup::__set_total_compressed_size(const int64_t val) { + this->total_compressed_size = val; +__isset.total_compressed_size = true; +} +std::ostream& operator<<(std::ostream& out, const RowGroup& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t RowGroup::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + bool isset_columns = false; + bool isset_total_byte_size = false; + bool isset_num_rows = false; + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_LIST) { + { + this->columns.clear(); + uint32_t _size108; + ::apache::thrift::protocol::TType _etype111; + xfer += iprot->readListBegin(_etype111, _size108); + this->columns.resize(_size108); + uint32_t _i112; + for (_i112 = 0; _i112 < _size108; ++_i112) + { + xfer += this->columns[_i112].read(iprot); + } + xfer += iprot->readListEnd(); + } + isset_columns = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 2: + if (ftype == ::apache::thrift::protocol::T_I64) { + xfer += iprot->readI64(this->total_byte_size); + isset_total_byte_size = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 3: + if (ftype == ::apache::thrift::protocol::T_I64) { + xfer += iprot->readI64(this->num_rows); + isset_num_rows = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 4: + if (ftype == ::apache::thrift::protocol::T_LIST) { + { + this->sorting_columns.clear(); + uint32_t _size113; + ::apache::thrift::protocol::TType _etype116; + xfer += iprot->readListBegin(_etype116, _size113); + this->sorting_columns.resize(_size113); + uint32_t _i117; + for (_i117 = 0; _i117 < _size113; ++_i117) + { + xfer += this->sorting_columns[_i117].read(iprot); + } + xfer += iprot->readListEnd(); + } + this->__isset.sorting_columns = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 5: + if (ftype == ::apache::thrift::protocol::T_I64) { + xfer += iprot->readI64(this->file_offset); + this->__isset.file_offset = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 6: + if (ftype == ::apache::thrift::protocol::T_I64) { + xfer += iprot->readI64(this->total_compressed_size); + this->__isset.total_compressed_size = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + if (!isset_columns) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_total_byte_size) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_num_rows) + throw TProtocolException(TProtocolException::INVALID_DATA); + return xfer; +} + +uint32_t RowGroup::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("RowGroup"); + + xfer += oprot->writeFieldBegin("columns", ::apache::thrift::protocol::T_LIST, 1); + { + xfer += oprot->writeListBegin(::apache::thrift::protocol::T_STRUCT, static_cast(this->columns.size())); + std::vector ::const_iterator _iter118; + for (_iter118 = this->columns.begin(); _iter118 != this->columns.end(); ++_iter118) + { + xfer += (*_iter118).write(oprot); + } + xfer += oprot->writeListEnd(); + } + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("total_byte_size", ::apache::thrift::protocol::T_I64, 2); + xfer += oprot->writeI64(this->total_byte_size); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("num_rows", ::apache::thrift::protocol::T_I64, 3); + xfer += oprot->writeI64(this->num_rows); + xfer += oprot->writeFieldEnd(); + + if (this->__isset.sorting_columns) { + xfer += oprot->writeFieldBegin("sorting_columns", ::apache::thrift::protocol::T_LIST, 4); + { + xfer += oprot->writeListBegin(::apache::thrift::protocol::T_STRUCT, static_cast(this->sorting_columns.size())); + std::vector ::const_iterator _iter119; + for (_iter119 = this->sorting_columns.begin(); _iter119 != this->sorting_columns.end(); ++_iter119) + { + xfer += (*_iter119).write(oprot); + } + xfer += oprot->writeListEnd(); + } + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.file_offset) { + xfer += oprot->writeFieldBegin("file_offset", ::apache::thrift::protocol::T_I64, 5); + xfer += oprot->writeI64(this->file_offset); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.total_compressed_size) { + xfer += oprot->writeFieldBegin("total_compressed_size", ::apache::thrift::protocol::T_I64, 6); + xfer += oprot->writeI64(this->total_compressed_size); + xfer += oprot->writeFieldEnd(); + } + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(RowGroup &a, RowGroup &b) { + using ::std::swap; + swap(a.columns, b.columns); + swap(a.total_byte_size, b.total_byte_size); + swap(a.num_rows, b.num_rows); + swap(a.sorting_columns, b.sorting_columns); + swap(a.file_offset, b.file_offset); + swap(a.total_compressed_size, b.total_compressed_size); + swap(a.__isset, b.__isset); +} + +RowGroup::RowGroup(const RowGroup& other120) { + columns = other120.columns; + total_byte_size = other120.total_byte_size; + num_rows = other120.num_rows; + sorting_columns = other120.sorting_columns; + file_offset = other120.file_offset; + total_compressed_size = other120.total_compressed_size; + __isset = other120.__isset; +} +RowGroup& RowGroup::operator=(const RowGroup& other121) { + columns = other121.columns; + total_byte_size = other121.total_byte_size; + num_rows = other121.num_rows; + sorting_columns = other121.sorting_columns; + file_offset = other121.file_offset; + total_compressed_size = other121.total_compressed_size; + __isset = other121.__isset; + return *this; +} +void RowGroup::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "RowGroup("; + out << "columns=" << to_string(columns); + out << ", " << "total_byte_size=" << to_string(total_byte_size); + out << ", " << "num_rows=" << to_string(num_rows); + out << ", " << "sorting_columns="; (__isset.sorting_columns ? (out << to_string(sorting_columns)) : (out << "")); + out << ", " << "file_offset="; (__isset.file_offset ? (out << to_string(file_offset)) : (out << "")); + out << ", " << "total_compressed_size="; (__isset.total_compressed_size ? (out << to_string(total_compressed_size)) : (out << "")); + out << ")"; +} + + +TypeDefinedOrder::~TypeDefinedOrder() throw() { +} + +std::ostream& operator<<(std::ostream& out, const TypeDefinedOrder& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t TypeDefinedOrder::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + xfer += iprot->skip(ftype); + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t TypeDefinedOrder::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("TypeDefinedOrder"); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(TypeDefinedOrder &a, TypeDefinedOrder &b) { + using ::std::swap; + (void) a; + (void) b; +} + +TypeDefinedOrder::TypeDefinedOrder(const TypeDefinedOrder& other122) { + (void) other122; +} +TypeDefinedOrder& TypeDefinedOrder::operator=(const TypeDefinedOrder& other123) { + (void) other123; + return *this; +} +void TypeDefinedOrder::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "TypeDefinedOrder("; + out << ")"; +} + + +ColumnOrder::~ColumnOrder() throw() { +} + + +void ColumnOrder::__set_TYPE_ORDER(const TypeDefinedOrder& val) { + this->TYPE_ORDER = val; +__isset.TYPE_ORDER = true; +} +std::ostream& operator<<(std::ostream& out, const ColumnOrder& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t ColumnOrder::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->TYPE_ORDER.read(iprot); + this->__isset.TYPE_ORDER = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t ColumnOrder::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("ColumnOrder"); + + if (this->__isset.TYPE_ORDER) { + xfer += oprot->writeFieldBegin("TYPE_ORDER", ::apache::thrift::protocol::T_STRUCT, 1); + xfer += this->TYPE_ORDER.write(oprot); + xfer += oprot->writeFieldEnd(); + } + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(ColumnOrder &a, ColumnOrder &b) { + using ::std::swap; + swap(a.TYPE_ORDER, b.TYPE_ORDER); + swap(a.__isset, b.__isset); +} + +ColumnOrder::ColumnOrder(const ColumnOrder& other124) { + TYPE_ORDER = other124.TYPE_ORDER; + __isset = other124.__isset; +} +ColumnOrder& ColumnOrder::operator=(const ColumnOrder& other125) { + TYPE_ORDER = other125.TYPE_ORDER; + __isset = other125.__isset; + return *this; +} +void ColumnOrder::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "ColumnOrder("; + out << "TYPE_ORDER="; (__isset.TYPE_ORDER ? (out << to_string(TYPE_ORDER)) : (out << "")); + out << ")"; +} + + +PageLocation::~PageLocation() throw() { +} + + +void PageLocation::__set_offset(const int64_t val) { + this->offset = val; +} + +void PageLocation::__set_compressed_page_size(const int32_t val) { + this->compressed_page_size = val; +} + +void PageLocation::__set_first_row_index(const int64_t val) { + this->first_row_index = val; +} +std::ostream& operator<<(std::ostream& out, const PageLocation& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t PageLocation::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + bool isset_offset = false; + bool isset_compressed_page_size = false; + bool isset_first_row_index = false; + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_I64) { + xfer += iprot->readI64(this->offset); + isset_offset = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 2: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->compressed_page_size); + isset_compressed_page_size = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 3: + if (ftype == ::apache::thrift::protocol::T_I64) { + xfer += iprot->readI64(this->first_row_index); + isset_first_row_index = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + if (!isset_offset) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_compressed_page_size) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_first_row_index) + throw TProtocolException(TProtocolException::INVALID_DATA); + return xfer; +} + +uint32_t PageLocation::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("PageLocation"); + + xfer += oprot->writeFieldBegin("offset", ::apache::thrift::protocol::T_I64, 1); + xfer += oprot->writeI64(this->offset); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("compressed_page_size", ::apache::thrift::protocol::T_I32, 2); + xfer += oprot->writeI32(this->compressed_page_size); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("first_row_index", ::apache::thrift::protocol::T_I64, 3); + xfer += oprot->writeI64(this->first_row_index); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(PageLocation &a, PageLocation &b) { + using ::std::swap; + swap(a.offset, b.offset); + swap(a.compressed_page_size, b.compressed_page_size); + swap(a.first_row_index, b.first_row_index); +} + +PageLocation::PageLocation(const PageLocation& other126) { + offset = other126.offset; + compressed_page_size = other126.compressed_page_size; + first_row_index = other126.first_row_index; +} +PageLocation& PageLocation::operator=(const PageLocation& other127) { + offset = other127.offset; + compressed_page_size = other127.compressed_page_size; + first_row_index = other127.first_row_index; + return *this; +} +void PageLocation::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "PageLocation("; + out << "offset=" << to_string(offset); + out << ", " << "compressed_page_size=" << to_string(compressed_page_size); + out << ", " << "first_row_index=" << to_string(first_row_index); + out << ")"; +} + + +OffsetIndex::~OffsetIndex() throw() { +} + + +void OffsetIndex::__set_page_locations(const std::vector & val) { + this->page_locations = val; +} +std::ostream& operator<<(std::ostream& out, const OffsetIndex& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t OffsetIndex::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + bool isset_page_locations = false; + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_LIST) { + { + this->page_locations.clear(); + uint32_t _size128; + ::apache::thrift::protocol::TType _etype131; + xfer += iprot->readListBegin(_etype131, _size128); + this->page_locations.resize(_size128); + uint32_t _i132; + for (_i132 = 0; _i132 < _size128; ++_i132) + { + xfer += this->page_locations[_i132].read(iprot); + } + xfer += iprot->readListEnd(); + } + isset_page_locations = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + if (!isset_page_locations) + throw TProtocolException(TProtocolException::INVALID_DATA); + return xfer; +} + +uint32_t OffsetIndex::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("OffsetIndex"); + + xfer += oprot->writeFieldBegin("page_locations", ::apache::thrift::protocol::T_LIST, 1); + { + xfer += oprot->writeListBegin(::apache::thrift::protocol::T_STRUCT, static_cast(this->page_locations.size())); + std::vector ::const_iterator _iter133; + for (_iter133 = this->page_locations.begin(); _iter133 != this->page_locations.end(); ++_iter133) + { + xfer += (*_iter133).write(oprot); + } + xfer += oprot->writeListEnd(); + } + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(OffsetIndex &a, OffsetIndex &b) { + using ::std::swap; + swap(a.page_locations, b.page_locations); +} + +OffsetIndex::OffsetIndex(const OffsetIndex& other134) { + page_locations = other134.page_locations; +} +OffsetIndex& OffsetIndex::operator=(const OffsetIndex& other135) { + page_locations = other135.page_locations; + return *this; +} +void OffsetIndex::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "OffsetIndex("; + out << "page_locations=" << to_string(page_locations); + out << ")"; +} + + +ColumnIndex::~ColumnIndex() throw() { +} + + +void ColumnIndex::__set_null_pages(const std::vector & val) { + this->null_pages = val; +} + +void ColumnIndex::__set_min_values(const std::vector & val) { + this->min_values = val; +} + +void ColumnIndex::__set_max_values(const std::vector & val) { + this->max_values = val; +} + +void ColumnIndex::__set_boundary_order(const BoundaryOrder::type val) { + this->boundary_order = val; +} + +void ColumnIndex::__set_null_counts(const std::vector & val) { + this->null_counts = val; +__isset.null_counts = true; +} +std::ostream& operator<<(std::ostream& out, const ColumnIndex& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t ColumnIndex::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + bool isset_null_pages = false; + bool isset_min_values = false; + bool isset_max_values = false; + bool isset_boundary_order = false; + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_LIST) { + { + this->null_pages.clear(); + uint32_t _size136; + ::apache::thrift::protocol::TType _etype139; + xfer += iprot->readListBegin(_etype139, _size136); + this->null_pages.resize(_size136); + uint32_t _i140; + for (_i140 = 0; _i140 < _size136; ++_i140) + { + xfer += iprot->readBool(this->null_pages[_i140]); + } + xfer += iprot->readListEnd(); + } + isset_null_pages = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 2: + if (ftype == ::apache::thrift::protocol::T_LIST) { + { + this->min_values.clear(); + uint32_t _size141; + ::apache::thrift::protocol::TType _etype144; + xfer += iprot->readListBegin(_etype144, _size141); + this->min_values.resize(_size141); + uint32_t _i145; + for (_i145 = 0; _i145 < _size141; ++_i145) + { + xfer += iprot->readBinary(this->min_values[_i145]); + } + xfer += iprot->readListEnd(); + } + isset_min_values = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 3: + if (ftype == ::apache::thrift::protocol::T_LIST) { + { + this->max_values.clear(); + uint32_t _size146; + ::apache::thrift::protocol::TType _etype149; + xfer += iprot->readListBegin(_etype149, _size146); + this->max_values.resize(_size146); + uint32_t _i150; + for (_i150 = 0; _i150 < _size146; ++_i150) + { + xfer += iprot->readBinary(this->max_values[_i150]); + } + xfer += iprot->readListEnd(); + } + isset_max_values = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 4: + if (ftype == ::apache::thrift::protocol::T_I32) { + int32_t ecast151; + xfer += iprot->readI32(ecast151); + this->boundary_order = (BoundaryOrder::type)ecast151; + isset_boundary_order = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 5: + if (ftype == ::apache::thrift::protocol::T_LIST) { + { + this->null_counts.clear(); + uint32_t _size152; + ::apache::thrift::protocol::TType _etype155; + xfer += iprot->readListBegin(_etype155, _size152); + this->null_counts.resize(_size152); + uint32_t _i156; + for (_i156 = 0; _i156 < _size152; ++_i156) + { + xfer += iprot->readI64(this->null_counts[_i156]); + } + xfer += iprot->readListEnd(); + } + this->__isset.null_counts = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + if (!isset_null_pages) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_min_values) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_max_values) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_boundary_order) + throw TProtocolException(TProtocolException::INVALID_DATA); + return xfer; +} + +uint32_t ColumnIndex::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("ColumnIndex"); + + xfer += oprot->writeFieldBegin("null_pages", ::apache::thrift::protocol::T_LIST, 1); + { + xfer += oprot->writeListBegin(::apache::thrift::protocol::T_BOOL, static_cast(this->null_pages.size())); + std::vector ::const_iterator _iter157; + for (_iter157 = this->null_pages.begin(); _iter157 != this->null_pages.end(); ++_iter157) + { + xfer += oprot->writeBool((*_iter157)); + } + xfer += oprot->writeListEnd(); + } + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("min_values", ::apache::thrift::protocol::T_LIST, 2); + { + xfer += oprot->writeListBegin(::apache::thrift::protocol::T_STRING, static_cast(this->min_values.size())); + std::vector ::const_iterator _iter158; + for (_iter158 = this->min_values.begin(); _iter158 != this->min_values.end(); ++_iter158) + { + xfer += oprot->writeBinary((*_iter158)); + } + xfer += oprot->writeListEnd(); + } + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("max_values", ::apache::thrift::protocol::T_LIST, 3); + { + xfer += oprot->writeListBegin(::apache::thrift::protocol::T_STRING, static_cast(this->max_values.size())); + std::vector ::const_iterator _iter159; + for (_iter159 = this->max_values.begin(); _iter159 != this->max_values.end(); ++_iter159) + { + xfer += oprot->writeBinary((*_iter159)); + } + xfer += oprot->writeListEnd(); + } + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("boundary_order", ::apache::thrift::protocol::T_I32, 4); + xfer += oprot->writeI32((int32_t)this->boundary_order); + xfer += oprot->writeFieldEnd(); + + if (this->__isset.null_counts) { + xfer += oprot->writeFieldBegin("null_counts", ::apache::thrift::protocol::T_LIST, 5); + { + xfer += oprot->writeListBegin(::apache::thrift::protocol::T_I64, static_cast(this->null_counts.size())); + std::vector ::const_iterator _iter160; + for (_iter160 = this->null_counts.begin(); _iter160 != this->null_counts.end(); ++_iter160) + { + xfer += oprot->writeI64((*_iter160)); + } + xfer += oprot->writeListEnd(); + } + xfer += oprot->writeFieldEnd(); + } + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(ColumnIndex &a, ColumnIndex &b) { + using ::std::swap; + swap(a.null_pages, b.null_pages); + swap(a.min_values, b.min_values); + swap(a.max_values, b.max_values); + swap(a.boundary_order, b.boundary_order); + swap(a.null_counts, b.null_counts); + swap(a.__isset, b.__isset); +} + +ColumnIndex::ColumnIndex(const ColumnIndex& other161) { + null_pages = other161.null_pages; + min_values = other161.min_values; + max_values = other161.max_values; + boundary_order = other161.boundary_order; + null_counts = other161.null_counts; + __isset = other161.__isset; +} +ColumnIndex& ColumnIndex::operator=(const ColumnIndex& other162) { + null_pages = other162.null_pages; + min_values = other162.min_values; + max_values = other162.max_values; + boundary_order = other162.boundary_order; + null_counts = other162.null_counts; + __isset = other162.__isset; + return *this; +} +void ColumnIndex::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "ColumnIndex("; + out << "null_pages=" << to_string(null_pages); + out << ", " << "min_values=" << to_string(min_values); + out << ", " << "max_values=" << to_string(max_values); + out << ", " << "boundary_order=" << to_string(boundary_order); + out << ", " << "null_counts="; (__isset.null_counts ? (out << to_string(null_counts)) : (out << "")); + out << ")"; +} + + +FileMetaData::~FileMetaData() throw() { +} + + +void FileMetaData::__set_version(const int32_t val) { + this->version = val; +} + +void FileMetaData::__set_schema(const std::vector & val) { + this->schema = val; +} + +void FileMetaData::__set_num_rows(const int64_t val) { + this->num_rows = val; +} + +void FileMetaData::__set_row_groups(const std::vector & val) { + this->row_groups = val; +} + +void FileMetaData::__set_key_value_metadata(const std::vector & val) { + this->key_value_metadata = val; +__isset.key_value_metadata = true; +} + +void FileMetaData::__set_created_by(const std::string& val) { + this->created_by = val; +__isset.created_by = true; +} + +void FileMetaData::__set_column_orders(const std::vector & val) { + this->column_orders = val; +__isset.column_orders = true; +} +std::ostream& operator<<(std::ostream& out, const FileMetaData& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t FileMetaData::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + bool isset_version = false; + bool isset_schema = false; + bool isset_num_rows = false; + bool isset_row_groups = false; + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_I32) { + xfer += iprot->readI32(this->version); + isset_version = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 2: + if (ftype == ::apache::thrift::protocol::T_LIST) { + { + this->schema.clear(); + uint32_t _size163; + ::apache::thrift::protocol::TType _etype166; + xfer += iprot->readListBegin(_etype166, _size163); + this->schema.resize(_size163); + uint32_t _i167; + for (_i167 = 0; _i167 < _size163; ++_i167) + { + xfer += this->schema[_i167].read(iprot); + } + xfer += iprot->readListEnd(); + } + isset_schema = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 3: + if (ftype == ::apache::thrift::protocol::T_I64) { + xfer += iprot->readI64(this->num_rows); + isset_num_rows = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 4: + if (ftype == ::apache::thrift::protocol::T_LIST) { + { + this->row_groups.clear(); + uint32_t _size168; + ::apache::thrift::protocol::TType _etype171; + xfer += iprot->readListBegin(_etype171, _size168); + this->row_groups.resize(_size168); + uint32_t _i172; + for (_i172 = 0; _i172 < _size168; ++_i172) + { + xfer += this->row_groups[_i172].read(iprot); + } + xfer += iprot->readListEnd(); + } + isset_row_groups = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 5: + if (ftype == ::apache::thrift::protocol::T_LIST) { + { + this->key_value_metadata.clear(); + uint32_t _size173; + ::apache::thrift::protocol::TType _etype176; + xfer += iprot->readListBegin(_etype176, _size173); + this->key_value_metadata.resize(_size173); + uint32_t _i177; + for (_i177 = 0; _i177 < _size173; ++_i177) + { + xfer += this->key_value_metadata[_i177].read(iprot); + } + xfer += iprot->readListEnd(); + } + this->__isset.key_value_metadata = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 6: + if (ftype == ::apache::thrift::protocol::T_STRING) { + xfer += iprot->readString(this->created_by); + this->__isset.created_by = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 7: + if (ftype == ::apache::thrift::protocol::T_LIST) { + { + this->column_orders.clear(); + uint32_t _size178; + ::apache::thrift::protocol::TType _etype181; + xfer += iprot->readListBegin(_etype181, _size178); + this->column_orders.resize(_size178); + uint32_t _i182; + for (_i182 = 0; _i182 < _size178; ++_i182) + { + xfer += this->column_orders[_i182].read(iprot); + } + xfer += iprot->readListEnd(); + } + this->__isset.column_orders = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + if (!isset_version) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_schema) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_num_rows) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_row_groups) + throw TProtocolException(TProtocolException::INVALID_DATA); + return xfer; +} + +uint32_t FileMetaData::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("FileMetaData"); + + xfer += oprot->writeFieldBegin("version", ::apache::thrift::protocol::T_I32, 1); + xfer += oprot->writeI32(this->version); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("schema", ::apache::thrift::protocol::T_LIST, 2); + { + xfer += oprot->writeListBegin(::apache::thrift::protocol::T_STRUCT, static_cast(this->schema.size())); + std::vector ::const_iterator _iter183; + for (_iter183 = this->schema.begin(); _iter183 != this->schema.end(); ++_iter183) + { + xfer += (*_iter183).write(oprot); + } + xfer += oprot->writeListEnd(); + } + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("num_rows", ::apache::thrift::protocol::T_I64, 3); + xfer += oprot->writeI64(this->num_rows); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("row_groups", ::apache::thrift::protocol::T_LIST, 4); + { + xfer += oprot->writeListBegin(::apache::thrift::protocol::T_STRUCT, static_cast(this->row_groups.size())); + std::vector ::const_iterator _iter184; + for (_iter184 = this->row_groups.begin(); _iter184 != this->row_groups.end(); ++_iter184) + { + xfer += (*_iter184).write(oprot); + } + xfer += oprot->writeListEnd(); + } + xfer += oprot->writeFieldEnd(); + + if (this->__isset.key_value_metadata) { + xfer += oprot->writeFieldBegin("key_value_metadata", ::apache::thrift::protocol::T_LIST, 5); + { + xfer += oprot->writeListBegin(::apache::thrift::protocol::T_STRUCT, static_cast(this->key_value_metadata.size())); + std::vector ::const_iterator _iter185; + for (_iter185 = this->key_value_metadata.begin(); _iter185 != this->key_value_metadata.end(); ++_iter185) + { + xfer += (*_iter185).write(oprot); + } + xfer += oprot->writeListEnd(); + } + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.created_by) { + xfer += oprot->writeFieldBegin("created_by", ::apache::thrift::protocol::T_STRING, 6); + xfer += oprot->writeString(this->created_by); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.column_orders) { + xfer += oprot->writeFieldBegin("column_orders", ::apache::thrift::protocol::T_LIST, 7); + { + xfer += oprot->writeListBegin(::apache::thrift::protocol::T_STRUCT, static_cast(this->column_orders.size())); + std::vector ::const_iterator _iter186; + for (_iter186 = this->column_orders.begin(); _iter186 != this->column_orders.end(); ++_iter186) + { + xfer += (*_iter186).write(oprot); + } + xfer += oprot->writeListEnd(); + } + xfer += oprot->writeFieldEnd(); + } + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(FileMetaData &a, FileMetaData &b) { + using ::std::swap; + swap(a.version, b.version); + swap(a.schema, b.schema); + swap(a.num_rows, b.num_rows); + swap(a.row_groups, b.row_groups); + swap(a.key_value_metadata, b.key_value_metadata); + swap(a.created_by, b.created_by); + swap(a.column_orders, b.column_orders); + swap(a.__isset, b.__isset); +} + +FileMetaData::FileMetaData(const FileMetaData& other187) { + version = other187.version; + schema = other187.schema; + num_rows = other187.num_rows; + row_groups = other187.row_groups; + key_value_metadata = other187.key_value_metadata; + created_by = other187.created_by; + column_orders = other187.column_orders; + __isset = other187.__isset; +} +FileMetaData& FileMetaData::operator=(const FileMetaData& other188) { + version = other188.version; + schema = other188.schema; + num_rows = other188.num_rows; + row_groups = other188.row_groups; + key_value_metadata = other188.key_value_metadata; + created_by = other188.created_by; + column_orders = other188.column_orders; + __isset = other188.__isset; + return *this; +} +void FileMetaData::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "FileMetaData("; + out << "version=" << to_string(version); + out << ", " << "schema=" << to_string(schema); + out << ", " << "num_rows=" << to_string(num_rows); + out << ", " << "row_groups=" << to_string(row_groups); + out << ", " << "key_value_metadata="; (__isset.key_value_metadata ? (out << to_string(key_value_metadata)) : (out << "")); + out << ", " << "created_by="; (__isset.created_by ? (out << to_string(created_by)) : (out << "")); + out << ", " << "column_orders="; (__isset.column_orders ? (out << to_string(column_orders)) : (out << "")); + out << ")"; +} + + +AesGcmV1::~AesGcmV1() throw() { +} + + +void AesGcmV1::__set_aad_metadata(const std::string& val) { + this->aad_metadata = val; +__isset.aad_metadata = true; +} + +void AesGcmV1::__set_iv_prefix(const std::string& val) { + this->iv_prefix = val; +__isset.iv_prefix = true; +} +std::ostream& operator<<(std::ostream& out, const AesGcmV1& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t AesGcmV1::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_STRING) { + xfer += iprot->readBinary(this->aad_metadata); + this->__isset.aad_metadata = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 2: + if (ftype == ::apache::thrift::protocol::T_STRING) { + xfer += iprot->readBinary(this->iv_prefix); + this->__isset.iv_prefix = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t AesGcmV1::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("AesGcmV1"); + + if (this->__isset.aad_metadata) { + xfer += oprot->writeFieldBegin("aad_metadata", ::apache::thrift::protocol::T_STRING, 1); + xfer += oprot->writeBinary(this->aad_metadata); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.iv_prefix) { + xfer += oprot->writeFieldBegin("iv_prefix", ::apache::thrift::protocol::T_STRING, 2); + xfer += oprot->writeBinary(this->iv_prefix); + xfer += oprot->writeFieldEnd(); + } + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(AesGcmV1 &a, AesGcmV1 &b) { + using ::std::swap; + swap(a.aad_metadata, b.aad_metadata); + swap(a.iv_prefix, b.iv_prefix); + swap(a.__isset, b.__isset); +} + +AesGcmV1::AesGcmV1(const AesGcmV1& other189) { + aad_metadata = other189.aad_metadata; + iv_prefix = other189.iv_prefix; + __isset = other189.__isset; +} +AesGcmV1& AesGcmV1::operator=(const AesGcmV1& other190) { + aad_metadata = other190.aad_metadata; + iv_prefix = other190.iv_prefix; + __isset = other190.__isset; + return *this; +} +void AesGcmV1::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "AesGcmV1("; + out << "aad_metadata="; (__isset.aad_metadata ? (out << to_string(aad_metadata)) : (out << "")); + out << ", " << "iv_prefix="; (__isset.iv_prefix ? (out << to_string(iv_prefix)) : (out << "")); + out << ")"; +} + + +AesGcmCtrV1::~AesGcmCtrV1() throw() { +} + + +void AesGcmCtrV1::__set_aad_metadata(const std::string& val) { + this->aad_metadata = val; +__isset.aad_metadata = true; +} + +void AesGcmCtrV1::__set_gcm_iv_prefix(const std::string& val) { + this->gcm_iv_prefix = val; +__isset.gcm_iv_prefix = true; +} + +void AesGcmCtrV1::__set_ctr_iv_prefix(const std::string& val) { + this->ctr_iv_prefix = val; +__isset.ctr_iv_prefix = true; +} +std::ostream& operator<<(std::ostream& out, const AesGcmCtrV1& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t AesGcmCtrV1::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_STRING) { + xfer += iprot->readBinary(this->aad_metadata); + this->__isset.aad_metadata = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 2: + if (ftype == ::apache::thrift::protocol::T_STRING) { + xfer += iprot->readBinary(this->gcm_iv_prefix); + this->__isset.gcm_iv_prefix = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 3: + if (ftype == ::apache::thrift::protocol::T_STRING) { + xfer += iprot->readBinary(this->ctr_iv_prefix); + this->__isset.ctr_iv_prefix = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t AesGcmCtrV1::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("AesGcmCtrV1"); + + if (this->__isset.aad_metadata) { + xfer += oprot->writeFieldBegin("aad_metadata", ::apache::thrift::protocol::T_STRING, 1); + xfer += oprot->writeBinary(this->aad_metadata); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.gcm_iv_prefix) { + xfer += oprot->writeFieldBegin("gcm_iv_prefix", ::apache::thrift::protocol::T_STRING, 2); + xfer += oprot->writeBinary(this->gcm_iv_prefix); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.ctr_iv_prefix) { + xfer += oprot->writeFieldBegin("ctr_iv_prefix", ::apache::thrift::protocol::T_STRING, 3); + xfer += oprot->writeBinary(this->ctr_iv_prefix); + xfer += oprot->writeFieldEnd(); + } + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(AesGcmCtrV1 &a, AesGcmCtrV1 &b) { + using ::std::swap; + swap(a.aad_metadata, b.aad_metadata); + swap(a.gcm_iv_prefix, b.gcm_iv_prefix); + swap(a.ctr_iv_prefix, b.ctr_iv_prefix); + swap(a.__isset, b.__isset); +} + +AesGcmCtrV1::AesGcmCtrV1(const AesGcmCtrV1& other191) { + aad_metadata = other191.aad_metadata; + gcm_iv_prefix = other191.gcm_iv_prefix; + ctr_iv_prefix = other191.ctr_iv_prefix; + __isset = other191.__isset; +} +AesGcmCtrV1& AesGcmCtrV1::operator=(const AesGcmCtrV1& other192) { + aad_metadata = other192.aad_metadata; + gcm_iv_prefix = other192.gcm_iv_prefix; + ctr_iv_prefix = other192.ctr_iv_prefix; + __isset = other192.__isset; + return *this; +} +void AesGcmCtrV1::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "AesGcmCtrV1("; + out << "aad_metadata="; (__isset.aad_metadata ? (out << to_string(aad_metadata)) : (out << "")); + out << ", " << "gcm_iv_prefix="; (__isset.gcm_iv_prefix ? (out << to_string(gcm_iv_prefix)) : (out << "")); + out << ", " << "ctr_iv_prefix="; (__isset.ctr_iv_prefix ? (out << to_string(ctr_iv_prefix)) : (out << "")); + out << ")"; +} + + +EncryptionAlgorithm::~EncryptionAlgorithm() throw() { +} + + +void EncryptionAlgorithm::__set_AES_GCM_V1(const AesGcmV1& val) { + this->AES_GCM_V1 = val; +__isset.AES_GCM_V1 = true; +} + +void EncryptionAlgorithm::__set_AES_GCM_CTR_V1(const AesGcmCtrV1& val) { + this->AES_GCM_CTR_V1 = val; +__isset.AES_GCM_CTR_V1 = true; +} +std::ostream& operator<<(std::ostream& out, const EncryptionAlgorithm& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t EncryptionAlgorithm::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->AES_GCM_V1.read(iprot); + this->__isset.AES_GCM_V1 = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 2: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->AES_GCM_CTR_V1.read(iprot); + this->__isset.AES_GCM_CTR_V1 = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + return xfer; +} + +uint32_t EncryptionAlgorithm::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("EncryptionAlgorithm"); + + if (this->__isset.AES_GCM_V1) { + xfer += oprot->writeFieldBegin("AES_GCM_V1", ::apache::thrift::protocol::T_STRUCT, 1); + xfer += this->AES_GCM_V1.write(oprot); + xfer += oprot->writeFieldEnd(); + } + if (this->__isset.AES_GCM_CTR_V1) { + xfer += oprot->writeFieldBegin("AES_GCM_CTR_V1", ::apache::thrift::protocol::T_STRUCT, 2); + xfer += this->AES_GCM_CTR_V1.write(oprot); + xfer += oprot->writeFieldEnd(); + } + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(EncryptionAlgorithm &a, EncryptionAlgorithm &b) { + using ::std::swap; + swap(a.AES_GCM_V1, b.AES_GCM_V1); + swap(a.AES_GCM_CTR_V1, b.AES_GCM_CTR_V1); + swap(a.__isset, b.__isset); +} + +EncryptionAlgorithm::EncryptionAlgorithm(const EncryptionAlgorithm& other193) { + AES_GCM_V1 = other193.AES_GCM_V1; + AES_GCM_CTR_V1 = other193.AES_GCM_CTR_V1; + __isset = other193.__isset; +} +EncryptionAlgorithm& EncryptionAlgorithm::operator=(const EncryptionAlgorithm& other194) { + AES_GCM_V1 = other194.AES_GCM_V1; + AES_GCM_CTR_V1 = other194.AES_GCM_CTR_V1; + __isset = other194.__isset; + return *this; +} +void EncryptionAlgorithm::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "EncryptionAlgorithm("; + out << "AES_GCM_V1="; (__isset.AES_GCM_V1 ? (out << to_string(AES_GCM_V1)) : (out << "")); + out << ", " << "AES_GCM_CTR_V1="; (__isset.AES_GCM_CTR_V1 ? (out << to_string(AES_GCM_CTR_V1)) : (out << "")); + out << ")"; +} + + +FileCryptoMetaData::~FileCryptoMetaData() throw() { +} + + +void FileCryptoMetaData::__set_encryption_algorithm(const EncryptionAlgorithm& val) { + this->encryption_algorithm = val; +} + +void FileCryptoMetaData::__set_encrypted_footer(const bool val) { + this->encrypted_footer = val; +} + +void FileCryptoMetaData::__set_footer_key_metadata(const std::string& val) { + this->footer_key_metadata = val; +__isset.footer_key_metadata = true; +} + +void FileCryptoMetaData::__set_footer_offset(const int64_t val) { + this->footer_offset = val; +} +std::ostream& operator<<(std::ostream& out, const FileCryptoMetaData& obj) +{ + obj.printTo(out); + return out; +} + + +uint32_t FileCryptoMetaData::read(::apache::thrift::protocol::TProtocol* iprot) { + + ::apache::thrift::protocol::TInputRecursionTracker tracker(*iprot); + uint32_t xfer = 0; + std::string fname; + ::apache::thrift::protocol::TType ftype; + int16_t fid; + + xfer += iprot->readStructBegin(fname); + + using ::apache::thrift::protocol::TProtocolException; + + bool isset_encryption_algorithm = false; + bool isset_encrypted_footer = false; + bool isset_footer_offset = false; + + while (true) + { + xfer += iprot->readFieldBegin(fname, ftype, fid); + if (ftype == ::apache::thrift::protocol::T_STOP) { + break; + } + switch (fid) + { + case 1: + if (ftype == ::apache::thrift::protocol::T_STRUCT) { + xfer += this->encryption_algorithm.read(iprot); + isset_encryption_algorithm = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 2: + if (ftype == ::apache::thrift::protocol::T_BOOL) { + xfer += iprot->readBool(this->encrypted_footer); + isset_encrypted_footer = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 3: + if (ftype == ::apache::thrift::protocol::T_STRING) { + xfer += iprot->readBinary(this->footer_key_metadata); + this->__isset.footer_key_metadata = true; + } else { + xfer += iprot->skip(ftype); + } + break; + case 4: + if (ftype == ::apache::thrift::protocol::T_I64) { + xfer += iprot->readI64(this->footer_offset); + isset_footer_offset = true; + } else { + xfer += iprot->skip(ftype); + } + break; + default: + xfer += iprot->skip(ftype); + break; + } + xfer += iprot->readFieldEnd(); + } + + xfer += iprot->readStructEnd(); + + if (!isset_encryption_algorithm) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_encrypted_footer) + throw TProtocolException(TProtocolException::INVALID_DATA); + if (!isset_footer_offset) + throw TProtocolException(TProtocolException::INVALID_DATA); + return xfer; +} + +uint32_t FileCryptoMetaData::write(::apache::thrift::protocol::TProtocol* oprot) const { + uint32_t xfer = 0; + ::apache::thrift::protocol::TOutputRecursionTracker tracker(*oprot); + xfer += oprot->writeStructBegin("FileCryptoMetaData"); + + xfer += oprot->writeFieldBegin("encryption_algorithm", ::apache::thrift::protocol::T_STRUCT, 1); + xfer += this->encryption_algorithm.write(oprot); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldBegin("encrypted_footer", ::apache::thrift::protocol::T_BOOL, 2); + xfer += oprot->writeBool(this->encrypted_footer); + xfer += oprot->writeFieldEnd(); + + if (this->__isset.footer_key_metadata) { + xfer += oprot->writeFieldBegin("footer_key_metadata", ::apache::thrift::protocol::T_STRING, 3); + xfer += oprot->writeBinary(this->footer_key_metadata); + xfer += oprot->writeFieldEnd(); + } + xfer += oprot->writeFieldBegin("footer_offset", ::apache::thrift::protocol::T_I64, 4); + xfer += oprot->writeI64(this->footer_offset); + xfer += oprot->writeFieldEnd(); + + xfer += oprot->writeFieldStop(); + xfer += oprot->writeStructEnd(); + return xfer; +} + +void swap(FileCryptoMetaData &a, FileCryptoMetaData &b) { + using ::std::swap; + swap(a.encryption_algorithm, b.encryption_algorithm); + swap(a.encrypted_footer, b.encrypted_footer); + swap(a.footer_key_metadata, b.footer_key_metadata); + swap(a.footer_offset, b.footer_offset); + swap(a.__isset, b.__isset); +} + +FileCryptoMetaData::FileCryptoMetaData(const FileCryptoMetaData& other195) { + encryption_algorithm = other195.encryption_algorithm; + encrypted_footer = other195.encrypted_footer; + footer_key_metadata = other195.footer_key_metadata; + footer_offset = other195.footer_offset; + __isset = other195.__isset; +} +FileCryptoMetaData& FileCryptoMetaData::operator=(const FileCryptoMetaData& other196) { + encryption_algorithm = other196.encryption_algorithm; + encrypted_footer = other196.encrypted_footer; + footer_key_metadata = other196.footer_key_metadata; + footer_offset = other196.footer_offset; + __isset = other196.__isset; + return *this; +} +void FileCryptoMetaData::printTo(std::ostream& out) const { + using ::apache::thrift::to_string; + out << "FileCryptoMetaData("; + out << "encryption_algorithm=" << to_string(encryption_algorithm); + out << ", " << "encrypted_footer=" << to_string(encrypted_footer); + out << ", " << "footer_key_metadata="; (__isset.footer_key_metadata ? (out << to_string(footer_key_metadata)) : (out << "")); + out << ", " << "footer_offset=" << to_string(footer_offset); + out << ")"; +} + +}} // namespace diff --git a/contrib/arrow-cmake/cpp/src/parquet/parquet_types.h b/contrib/arrow-cmake/cpp/src/parquet/parquet_types.h new file mode 100644 index 00000000000..a10e49be826 --- /dev/null +++ b/contrib/arrow-cmake/cpp/src/parquet/parquet_types.h @@ -0,0 +1,2523 @@ +/** + * Autogenerated by Thrift Compiler (0.11.0) + * + * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING + * @generated + */ +#ifndef parquet_TYPES_H +#define parquet_TYPES_H + +#include + +#include +#include +#include +#include +#include + +#include + +#include "parquet/util/windows_compatibility.h" + +namespace parquet { namespace format { + +struct Type { + enum type { + BOOLEAN = 0, + INT32 = 1, + INT64 = 2, + INT96 = 3, + FLOAT = 4, + DOUBLE = 5, + BYTE_ARRAY = 6, + FIXED_LEN_BYTE_ARRAY = 7 + }; +}; + +extern const std::map _Type_VALUES_TO_NAMES; + +std::ostream& operator<<(std::ostream& out, const Type::type& val); + +struct ConvertedType { + enum type { + UTF8 = 0, + MAP = 1, + MAP_KEY_VALUE = 2, + LIST = 3, + ENUM = 4, + DECIMAL = 5, + DATE = 6, + TIME_MILLIS = 7, + TIME_MICROS = 8, + TIMESTAMP_MILLIS = 9, + TIMESTAMP_MICROS = 10, + UINT_8 = 11, + UINT_16 = 12, + UINT_32 = 13, + UINT_64 = 14, + INT_8 = 15, + INT_16 = 16, + INT_32 = 17, + INT_64 = 18, + JSON = 19, + BSON = 20, + INTERVAL = 21 + }; +}; + +extern const std::map _ConvertedType_VALUES_TO_NAMES; + +std::ostream& operator<<(std::ostream& out, const ConvertedType::type& val); + +struct FieldRepetitionType { + enum type { + REQUIRED = 0, + OPTIONAL = 1, + REPEATED = 2 + }; +}; + +extern const std::map _FieldRepetitionType_VALUES_TO_NAMES; + +std::ostream& operator<<(std::ostream& out, const FieldRepetitionType::type& val); + +struct Encoding { + enum type { + PLAIN = 0, + PLAIN_DICTIONARY = 2, + RLE = 3, + BIT_PACKED = 4, + DELTA_BINARY_PACKED = 5, + DELTA_LENGTH_BYTE_ARRAY = 6, + DELTA_BYTE_ARRAY = 7, + RLE_DICTIONARY = 8 + }; +}; + +extern const std::map _Encoding_VALUES_TO_NAMES; + +std::ostream& operator<<(std::ostream& out, const Encoding::type& val); + +struct CompressionCodec { + enum type { + UNCOMPRESSED = 0, + SNAPPY = 1, + GZIP = 2, + LZO = 3, + BROTLI = 4, + LZ4 = 5, + ZSTD = 6 + }; +}; + +extern const std::map _CompressionCodec_VALUES_TO_NAMES; + +std::ostream& operator<<(std::ostream& out, const CompressionCodec::type& val); + +struct PageType { + enum type { + DATA_PAGE = 0, + INDEX_PAGE = 1, + DICTIONARY_PAGE = 2, + DATA_PAGE_V2 = 3 + }; +}; + +extern const std::map _PageType_VALUES_TO_NAMES; + +std::ostream& operator<<(std::ostream& out, const PageType::type& val); + +struct BoundaryOrder { + enum type { + UNORDERED = 0, + ASCENDING = 1, + DESCENDING = 2 + }; +}; + +extern const std::map _BoundaryOrder_VALUES_TO_NAMES; + +std::ostream& operator<<(std::ostream& out, const BoundaryOrder::type& val); + +class Statistics; + +class StringType; + +class UUIDType; + +class MapType; + +class ListType; + +class EnumType; + +class DateType; + +class NullType; + +class DecimalType; + +class MilliSeconds; + +class MicroSeconds; + +class TimeUnit; + +class TimestampType; + +class TimeType; + +class IntType; + +class JsonType; + +class BsonType; + +class LogicalType; + +class SchemaElement; + +class DataPageHeader; + +class IndexPageHeader; + +class DictionaryPageHeader; + +class DataPageHeaderV2; + +class PageHeader; + +class KeyValue; + +class SortingColumn; + +class PageEncodingStats; + +class ColumnMetaData; + +class EncryptionWithFooterKey; + +class EncryptionWithColumnKey; + +class ColumnCryptoMetaData; + +class ColumnChunk; + +class RowGroup; + +class TypeDefinedOrder; + +class ColumnOrder; + +class PageLocation; + +class OffsetIndex; + +class ColumnIndex; + +class FileMetaData; + +class AesGcmV1; + +class AesGcmCtrV1; + +class EncryptionAlgorithm; + +class FileCryptoMetaData; + +typedef struct _Statistics__isset { + _Statistics__isset() : max(false), min(false), null_count(false), distinct_count(false), max_value(false), min_value(false) {} + bool max :1; + bool min :1; + bool null_count :1; + bool distinct_count :1; + bool max_value :1; + bool min_value :1; +} _Statistics__isset; + +class Statistics : public virtual ::apache::thrift::TBase { + public: + + Statistics(const Statistics&); + Statistics& operator=(const Statistics&); + Statistics() : max(), min(), null_count(0), distinct_count(0), max_value(), min_value() { + } + + virtual ~Statistics() throw(); + std::string max; + std::string min; + int64_t null_count; + int64_t distinct_count; + std::string max_value; + std::string min_value; + + _Statistics__isset __isset; + + void __set_max(const std::string& val); + + void __set_min(const std::string& val); + + void __set_null_count(const int64_t val); + + void __set_distinct_count(const int64_t val); + + void __set_max_value(const std::string& val); + + void __set_min_value(const std::string& val); + + bool operator == (const Statistics & rhs) const + { + if (__isset.max != rhs.__isset.max) + return false; + else if (__isset.max && !(max == rhs.max)) + return false; + if (__isset.min != rhs.__isset.min) + return false; + else if (__isset.min && !(min == rhs.min)) + return false; + if (__isset.null_count != rhs.__isset.null_count) + return false; + else if (__isset.null_count && !(null_count == rhs.null_count)) + return false; + if (__isset.distinct_count != rhs.__isset.distinct_count) + return false; + else if (__isset.distinct_count && !(distinct_count == rhs.distinct_count)) + return false; + if (__isset.max_value != rhs.__isset.max_value) + return false; + else if (__isset.max_value && !(max_value == rhs.max_value)) + return false; + if (__isset.min_value != rhs.__isset.min_value) + return false; + else if (__isset.min_value && !(min_value == rhs.min_value)) + return false; + return true; + } + bool operator != (const Statistics &rhs) const { + return !(*this == rhs); + } + + bool operator < (const Statistics & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(Statistics &a, Statistics &b); + +std::ostream& operator<<(std::ostream& out, const Statistics& obj); + + +class StringType : public virtual ::apache::thrift::TBase { + public: + + StringType(const StringType&); + StringType& operator=(const StringType&); + StringType() { + } + + virtual ~StringType() throw(); + + bool operator == (const StringType & /* rhs */) const + { + return true; + } + bool operator != (const StringType &rhs) const { + return !(*this == rhs); + } + + bool operator < (const StringType & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(StringType &a, StringType &b); + +std::ostream& operator<<(std::ostream& out, const StringType& obj); + + +class UUIDType : public virtual ::apache::thrift::TBase { + public: + + UUIDType(const UUIDType&); + UUIDType& operator=(const UUIDType&); + UUIDType() { + } + + virtual ~UUIDType() throw(); + + bool operator == (const UUIDType & /* rhs */) const + { + return true; + } + bool operator != (const UUIDType &rhs) const { + return !(*this == rhs); + } + + bool operator < (const UUIDType & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(UUIDType &a, UUIDType &b); + +std::ostream& operator<<(std::ostream& out, const UUIDType& obj); + + +class MapType : public virtual ::apache::thrift::TBase { + public: + + MapType(const MapType&); + MapType& operator=(const MapType&); + MapType() { + } + + virtual ~MapType() throw(); + + bool operator == (const MapType & /* rhs */) const + { + return true; + } + bool operator != (const MapType &rhs) const { + return !(*this == rhs); + } + + bool operator < (const MapType & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(MapType &a, MapType &b); + +std::ostream& operator<<(std::ostream& out, const MapType& obj); + + +class ListType : public virtual ::apache::thrift::TBase { + public: + + ListType(const ListType&); + ListType& operator=(const ListType&); + ListType() { + } + + virtual ~ListType() throw(); + + bool operator == (const ListType & /* rhs */) const + { + return true; + } + bool operator != (const ListType &rhs) const { + return !(*this == rhs); + } + + bool operator < (const ListType & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(ListType &a, ListType &b); + +std::ostream& operator<<(std::ostream& out, const ListType& obj); + + +class EnumType : public virtual ::apache::thrift::TBase { + public: + + EnumType(const EnumType&); + EnumType& operator=(const EnumType&); + EnumType() { + } + + virtual ~EnumType() throw(); + + bool operator == (const EnumType & /* rhs */) const + { + return true; + } + bool operator != (const EnumType &rhs) const { + return !(*this == rhs); + } + + bool operator < (const EnumType & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(EnumType &a, EnumType &b); + +std::ostream& operator<<(std::ostream& out, const EnumType& obj); + + +class DateType : public virtual ::apache::thrift::TBase { + public: + + DateType(const DateType&); + DateType& operator=(const DateType&); + DateType() { + } + + virtual ~DateType() throw(); + + bool operator == (const DateType & /* rhs */) const + { + return true; + } + bool operator != (const DateType &rhs) const { + return !(*this == rhs); + } + + bool operator < (const DateType & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(DateType &a, DateType &b); + +std::ostream& operator<<(std::ostream& out, const DateType& obj); + + +class NullType : public virtual ::apache::thrift::TBase { + public: + + NullType(const NullType&); + NullType& operator=(const NullType&); + NullType() { + } + + virtual ~NullType() throw(); + + bool operator == (const NullType & /* rhs */) const + { + return true; + } + bool operator != (const NullType &rhs) const { + return !(*this == rhs); + } + + bool operator < (const NullType & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(NullType &a, NullType &b); + +std::ostream& operator<<(std::ostream& out, const NullType& obj); + + +class DecimalType : public virtual ::apache::thrift::TBase { + public: + + DecimalType(const DecimalType&); + DecimalType& operator=(const DecimalType&); + DecimalType() : scale(0), precision(0) { + } + + virtual ~DecimalType() throw(); + int32_t scale; + int32_t precision; + + void __set_scale(const int32_t val); + + void __set_precision(const int32_t val); + + bool operator == (const DecimalType & rhs) const + { + if (!(scale == rhs.scale)) + return false; + if (!(precision == rhs.precision)) + return false; + return true; + } + bool operator != (const DecimalType &rhs) const { + return !(*this == rhs); + } + + bool operator < (const DecimalType & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(DecimalType &a, DecimalType &b); + +std::ostream& operator<<(std::ostream& out, const DecimalType& obj); + + +class MilliSeconds : public virtual ::apache::thrift::TBase { + public: + + MilliSeconds(const MilliSeconds&); + MilliSeconds& operator=(const MilliSeconds&); + MilliSeconds() { + } + + virtual ~MilliSeconds() throw(); + + bool operator == (const MilliSeconds & /* rhs */) const + { + return true; + } + bool operator != (const MilliSeconds &rhs) const { + return !(*this == rhs); + } + + bool operator < (const MilliSeconds & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(MilliSeconds &a, MilliSeconds &b); + +std::ostream& operator<<(std::ostream& out, const MilliSeconds& obj); + + +class MicroSeconds : public virtual ::apache::thrift::TBase { + public: + + MicroSeconds(const MicroSeconds&); + MicroSeconds& operator=(const MicroSeconds&); + MicroSeconds() { + } + + virtual ~MicroSeconds() throw(); + + bool operator == (const MicroSeconds & /* rhs */) const + { + return true; + } + bool operator != (const MicroSeconds &rhs) const { + return !(*this == rhs); + } + + bool operator < (const MicroSeconds & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(MicroSeconds &a, MicroSeconds &b); + +std::ostream& operator<<(std::ostream& out, const MicroSeconds& obj); + +typedef struct _TimeUnit__isset { + _TimeUnit__isset() : MILLIS(false), MICROS(false) {} + bool MILLIS :1; + bool MICROS :1; +} _TimeUnit__isset; + +class TimeUnit : public virtual ::apache::thrift::TBase { + public: + + TimeUnit(const TimeUnit&); + TimeUnit& operator=(const TimeUnit&); + TimeUnit() { + } + + virtual ~TimeUnit() throw(); + MilliSeconds MILLIS; + MicroSeconds MICROS; + + _TimeUnit__isset __isset; + + void __set_MILLIS(const MilliSeconds& val); + + void __set_MICROS(const MicroSeconds& val); + + bool operator == (const TimeUnit & rhs) const + { + if (__isset.MILLIS != rhs.__isset.MILLIS) + return false; + else if (__isset.MILLIS && !(MILLIS == rhs.MILLIS)) + return false; + if (__isset.MICROS != rhs.__isset.MICROS) + return false; + else if (__isset.MICROS && !(MICROS == rhs.MICROS)) + return false; + return true; + } + bool operator != (const TimeUnit &rhs) const { + return !(*this == rhs); + } + + bool operator < (const TimeUnit & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(TimeUnit &a, TimeUnit &b); + +std::ostream& operator<<(std::ostream& out, const TimeUnit& obj); + + +class TimestampType : public virtual ::apache::thrift::TBase { + public: + + TimestampType(const TimestampType&); + TimestampType& operator=(const TimestampType&); + TimestampType() : isAdjustedToUTC(0) { + } + + virtual ~TimestampType() throw(); + bool isAdjustedToUTC; + TimeUnit unit; + + void __set_isAdjustedToUTC(const bool val); + + void __set_unit(const TimeUnit& val); + + bool operator == (const TimestampType & rhs) const + { + if (!(isAdjustedToUTC == rhs.isAdjustedToUTC)) + return false; + if (!(unit == rhs.unit)) + return false; + return true; + } + bool operator != (const TimestampType &rhs) const { + return !(*this == rhs); + } + + bool operator < (const TimestampType & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(TimestampType &a, TimestampType &b); + +std::ostream& operator<<(std::ostream& out, const TimestampType& obj); + + +class TimeType : public virtual ::apache::thrift::TBase { + public: + + TimeType(const TimeType&); + TimeType& operator=(const TimeType&); + TimeType() : isAdjustedToUTC(0) { + } + + virtual ~TimeType() throw(); + bool isAdjustedToUTC; + TimeUnit unit; + + void __set_isAdjustedToUTC(const bool val); + + void __set_unit(const TimeUnit& val); + + bool operator == (const TimeType & rhs) const + { + if (!(isAdjustedToUTC == rhs.isAdjustedToUTC)) + return false; + if (!(unit == rhs.unit)) + return false; + return true; + } + bool operator != (const TimeType &rhs) const { + return !(*this == rhs); + } + + bool operator < (const TimeType & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(TimeType &a, TimeType &b); + +std::ostream& operator<<(std::ostream& out, const TimeType& obj); + + +class IntType : public virtual ::apache::thrift::TBase { + public: + + IntType(const IntType&); + IntType& operator=(const IntType&); + IntType() : bitWidth(0), isSigned(0) { + } + + virtual ~IntType() throw(); + int8_t bitWidth; + bool isSigned; + + void __set_bitWidth(const int8_t val); + + void __set_isSigned(const bool val); + + bool operator == (const IntType & rhs) const + { + if (!(bitWidth == rhs.bitWidth)) + return false; + if (!(isSigned == rhs.isSigned)) + return false; + return true; + } + bool operator != (const IntType &rhs) const { + return !(*this == rhs); + } + + bool operator < (const IntType & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(IntType &a, IntType &b); + +std::ostream& operator<<(std::ostream& out, const IntType& obj); + + +class JsonType : public virtual ::apache::thrift::TBase { + public: + + JsonType(const JsonType&); + JsonType& operator=(const JsonType&); + JsonType() { + } + + virtual ~JsonType() throw(); + + bool operator == (const JsonType & /* rhs */) const + { + return true; + } + bool operator != (const JsonType &rhs) const { + return !(*this == rhs); + } + + bool operator < (const JsonType & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(JsonType &a, JsonType &b); + +std::ostream& operator<<(std::ostream& out, const JsonType& obj); + + +class BsonType : public virtual ::apache::thrift::TBase { + public: + + BsonType(const BsonType&); + BsonType& operator=(const BsonType&); + BsonType() { + } + + virtual ~BsonType() throw(); + + bool operator == (const BsonType & /* rhs */) const + { + return true; + } + bool operator != (const BsonType &rhs) const { + return !(*this == rhs); + } + + bool operator < (const BsonType & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(BsonType &a, BsonType &b); + +std::ostream& operator<<(std::ostream& out, const BsonType& obj); + +typedef struct _LogicalType__isset { + _LogicalType__isset() : STRING(false), MAP(false), LIST(false), ENUM(false), DECIMAL(false), DATE(false), TIME(false), TIMESTAMP(false), INTEGER(false), UNKNOWN(false), JSON(false), BSON(false) {} + bool STRING :1; + bool MAP :1; + bool LIST :1; + bool ENUM :1; + bool DECIMAL :1; + bool DATE :1; + bool TIME :1; + bool TIMESTAMP :1; + bool INTEGER :1; + bool UNKNOWN :1; + bool JSON :1; + bool BSON :1; +} _LogicalType__isset; + +class LogicalType : public virtual ::apache::thrift::TBase { + public: + + LogicalType(const LogicalType&); + LogicalType& operator=(const LogicalType&); + LogicalType() { + } + + virtual ~LogicalType() throw(); + StringType STRING; + MapType MAP; + ListType LIST; + EnumType ENUM; + DecimalType DECIMAL; + DateType DATE; + TimeType TIME; + TimestampType TIMESTAMP; + IntType INTEGER; + NullType UNKNOWN; + JsonType JSON; + BsonType BSON; + + _LogicalType__isset __isset; + + void __set_STRING(const StringType& val); + + void __set_MAP(const MapType& val); + + void __set_LIST(const ListType& val); + + void __set_ENUM(const EnumType& val); + + void __set_DECIMAL(const DecimalType& val); + + void __set_DATE(const DateType& val); + + void __set_TIME(const TimeType& val); + + void __set_TIMESTAMP(const TimestampType& val); + + void __set_INTEGER(const IntType& val); + + void __set_UNKNOWN(const NullType& val); + + void __set_JSON(const JsonType& val); + + void __set_BSON(const BsonType& val); + + bool operator == (const LogicalType & rhs) const + { + if (__isset.STRING != rhs.__isset.STRING) + return false; + else if (__isset.STRING && !(STRING == rhs.STRING)) + return false; + if (__isset.MAP != rhs.__isset.MAP) + return false; + else if (__isset.MAP && !(MAP == rhs.MAP)) + return false; + if (__isset.LIST != rhs.__isset.LIST) + return false; + else if (__isset.LIST && !(LIST == rhs.LIST)) + return false; + if (__isset.ENUM != rhs.__isset.ENUM) + return false; + else if (__isset.ENUM && !(ENUM == rhs.ENUM)) + return false; + if (__isset.DECIMAL != rhs.__isset.DECIMAL) + return false; + else if (__isset.DECIMAL && !(DECIMAL == rhs.DECIMAL)) + return false; + if (__isset.DATE != rhs.__isset.DATE) + return false; + else if (__isset.DATE && !(DATE == rhs.DATE)) + return false; + if (__isset.TIME != rhs.__isset.TIME) + return false; + else if (__isset.TIME && !(TIME == rhs.TIME)) + return false; + if (__isset.TIMESTAMP != rhs.__isset.TIMESTAMP) + return false; + else if (__isset.TIMESTAMP && !(TIMESTAMP == rhs.TIMESTAMP)) + return false; + if (__isset.INTEGER != rhs.__isset.INTEGER) + return false; + else if (__isset.INTEGER && !(INTEGER == rhs.INTEGER)) + return false; + if (__isset.UNKNOWN != rhs.__isset.UNKNOWN) + return false; + else if (__isset.UNKNOWN && !(UNKNOWN == rhs.UNKNOWN)) + return false; + if (__isset.JSON != rhs.__isset.JSON) + return false; + else if (__isset.JSON && !(JSON == rhs.JSON)) + return false; + if (__isset.BSON != rhs.__isset.BSON) + return false; + else if (__isset.BSON && !(BSON == rhs.BSON)) + return false; + return true; + } + bool operator != (const LogicalType &rhs) const { + return !(*this == rhs); + } + + bool operator < (const LogicalType & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(LogicalType &a, LogicalType &b); + +std::ostream& operator<<(std::ostream& out, const LogicalType& obj); + +typedef struct _SchemaElement__isset { + _SchemaElement__isset() : type(false), type_length(false), repetition_type(false), num_children(false), converted_type(false), scale(false), precision(false), field_id(false), logicalType(false) {} + bool type :1; + bool type_length :1; + bool repetition_type :1; + bool num_children :1; + bool converted_type :1; + bool scale :1; + bool precision :1; + bool field_id :1; + bool logicalType :1; +} _SchemaElement__isset; + +class SchemaElement : public virtual ::apache::thrift::TBase { + public: + + SchemaElement(const SchemaElement&); + SchemaElement& operator=(const SchemaElement&); + SchemaElement() : type((Type::type)0), type_length(0), repetition_type((FieldRepetitionType::type)0), name(), num_children(0), converted_type((ConvertedType::type)0), scale(0), precision(0), field_id(0) { + } + + virtual ~SchemaElement() throw(); + Type::type type; + int32_t type_length; + FieldRepetitionType::type repetition_type; + std::string name; + int32_t num_children; + ConvertedType::type converted_type; + int32_t scale; + int32_t precision; + int32_t field_id; + LogicalType logicalType; + + _SchemaElement__isset __isset; + + void __set_type(const Type::type val); + + void __set_type_length(const int32_t val); + + void __set_repetition_type(const FieldRepetitionType::type val); + + void __set_name(const std::string& val); + + void __set_num_children(const int32_t val); + + void __set_converted_type(const ConvertedType::type val); + + void __set_scale(const int32_t val); + + void __set_precision(const int32_t val); + + void __set_field_id(const int32_t val); + + void __set_logicalType(const LogicalType& val); + + bool operator == (const SchemaElement & rhs) const + { + if (__isset.type != rhs.__isset.type) + return false; + else if (__isset.type && !(type == rhs.type)) + return false; + if (__isset.type_length != rhs.__isset.type_length) + return false; + else if (__isset.type_length && !(type_length == rhs.type_length)) + return false; + if (__isset.repetition_type != rhs.__isset.repetition_type) + return false; + else if (__isset.repetition_type && !(repetition_type == rhs.repetition_type)) + return false; + if (!(name == rhs.name)) + return false; + if (__isset.num_children != rhs.__isset.num_children) + return false; + else if (__isset.num_children && !(num_children == rhs.num_children)) + return false; + if (__isset.converted_type != rhs.__isset.converted_type) + return false; + else if (__isset.converted_type && !(converted_type == rhs.converted_type)) + return false; + if (__isset.scale != rhs.__isset.scale) + return false; + else if (__isset.scale && !(scale == rhs.scale)) + return false; + if (__isset.precision != rhs.__isset.precision) + return false; + else if (__isset.precision && !(precision == rhs.precision)) + return false; + if (__isset.field_id != rhs.__isset.field_id) + return false; + else if (__isset.field_id && !(field_id == rhs.field_id)) + return false; + if (__isset.logicalType != rhs.__isset.logicalType) + return false; + else if (__isset.logicalType && !(logicalType == rhs.logicalType)) + return false; + return true; + } + bool operator != (const SchemaElement &rhs) const { + return !(*this == rhs); + } + + bool operator < (const SchemaElement & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(SchemaElement &a, SchemaElement &b); + +std::ostream& operator<<(std::ostream& out, const SchemaElement& obj); + +typedef struct _DataPageHeader__isset { + _DataPageHeader__isset() : statistics(false) {} + bool statistics :1; +} _DataPageHeader__isset; + +class DataPageHeader : public virtual ::apache::thrift::TBase { + public: + + DataPageHeader(const DataPageHeader&); + DataPageHeader& operator=(const DataPageHeader&); + DataPageHeader() : num_values(0), encoding((Encoding::type)0), definition_level_encoding((Encoding::type)0), repetition_level_encoding((Encoding::type)0) { + } + + virtual ~DataPageHeader() throw(); + int32_t num_values; + Encoding::type encoding; + Encoding::type definition_level_encoding; + Encoding::type repetition_level_encoding; + Statistics statistics; + + _DataPageHeader__isset __isset; + + void __set_num_values(const int32_t val); + + void __set_encoding(const Encoding::type val); + + void __set_definition_level_encoding(const Encoding::type val); + + void __set_repetition_level_encoding(const Encoding::type val); + + void __set_statistics(const Statistics& val); + + bool operator == (const DataPageHeader & rhs) const + { + if (!(num_values == rhs.num_values)) + return false; + if (!(encoding == rhs.encoding)) + return false; + if (!(definition_level_encoding == rhs.definition_level_encoding)) + return false; + if (!(repetition_level_encoding == rhs.repetition_level_encoding)) + return false; + if (__isset.statistics != rhs.__isset.statistics) + return false; + else if (__isset.statistics && !(statistics == rhs.statistics)) + return false; + return true; + } + bool operator != (const DataPageHeader &rhs) const { + return !(*this == rhs); + } + + bool operator < (const DataPageHeader & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(DataPageHeader &a, DataPageHeader &b); + +std::ostream& operator<<(std::ostream& out, const DataPageHeader& obj); + + +class IndexPageHeader : public virtual ::apache::thrift::TBase { + public: + + IndexPageHeader(const IndexPageHeader&); + IndexPageHeader& operator=(const IndexPageHeader&); + IndexPageHeader() { + } + + virtual ~IndexPageHeader() throw(); + + bool operator == (const IndexPageHeader & /* rhs */) const + { + return true; + } + bool operator != (const IndexPageHeader &rhs) const { + return !(*this == rhs); + } + + bool operator < (const IndexPageHeader & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(IndexPageHeader &a, IndexPageHeader &b); + +std::ostream& operator<<(std::ostream& out, const IndexPageHeader& obj); + +typedef struct _DictionaryPageHeader__isset { + _DictionaryPageHeader__isset() : is_sorted(false) {} + bool is_sorted :1; +} _DictionaryPageHeader__isset; + +class DictionaryPageHeader : public virtual ::apache::thrift::TBase { + public: + + DictionaryPageHeader(const DictionaryPageHeader&); + DictionaryPageHeader& operator=(const DictionaryPageHeader&); + DictionaryPageHeader() : num_values(0), encoding((Encoding::type)0), is_sorted(0) { + } + + virtual ~DictionaryPageHeader() throw(); + int32_t num_values; + Encoding::type encoding; + bool is_sorted; + + _DictionaryPageHeader__isset __isset; + + void __set_num_values(const int32_t val); + + void __set_encoding(const Encoding::type val); + + void __set_is_sorted(const bool val); + + bool operator == (const DictionaryPageHeader & rhs) const + { + if (!(num_values == rhs.num_values)) + return false; + if (!(encoding == rhs.encoding)) + return false; + if (__isset.is_sorted != rhs.__isset.is_sorted) + return false; + else if (__isset.is_sorted && !(is_sorted == rhs.is_sorted)) + return false; + return true; + } + bool operator != (const DictionaryPageHeader &rhs) const { + return !(*this == rhs); + } + + bool operator < (const DictionaryPageHeader & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(DictionaryPageHeader &a, DictionaryPageHeader &b); + +std::ostream& operator<<(std::ostream& out, const DictionaryPageHeader& obj); + +typedef struct _DataPageHeaderV2__isset { + _DataPageHeaderV2__isset() : is_compressed(true), statistics(false) {} + bool is_compressed :1; + bool statistics :1; +} _DataPageHeaderV2__isset; + +class DataPageHeaderV2 : public virtual ::apache::thrift::TBase { + public: + + DataPageHeaderV2(const DataPageHeaderV2&); + DataPageHeaderV2& operator=(const DataPageHeaderV2&); + DataPageHeaderV2() : num_values(0), num_nulls(0), num_rows(0), encoding((Encoding::type)0), definition_levels_byte_length(0), repetition_levels_byte_length(0), is_compressed(true) { + } + + virtual ~DataPageHeaderV2() throw(); + int32_t num_values; + int32_t num_nulls; + int32_t num_rows; + Encoding::type encoding; + int32_t definition_levels_byte_length; + int32_t repetition_levels_byte_length; + bool is_compressed; + Statistics statistics; + + _DataPageHeaderV2__isset __isset; + + void __set_num_values(const int32_t val); + + void __set_num_nulls(const int32_t val); + + void __set_num_rows(const int32_t val); + + void __set_encoding(const Encoding::type val); + + void __set_definition_levels_byte_length(const int32_t val); + + void __set_repetition_levels_byte_length(const int32_t val); + + void __set_is_compressed(const bool val); + + void __set_statistics(const Statistics& val); + + bool operator == (const DataPageHeaderV2 & rhs) const + { + if (!(num_values == rhs.num_values)) + return false; + if (!(num_nulls == rhs.num_nulls)) + return false; + if (!(num_rows == rhs.num_rows)) + return false; + if (!(encoding == rhs.encoding)) + return false; + if (!(definition_levels_byte_length == rhs.definition_levels_byte_length)) + return false; + if (!(repetition_levels_byte_length == rhs.repetition_levels_byte_length)) + return false; + if (__isset.is_compressed != rhs.__isset.is_compressed) + return false; + else if (__isset.is_compressed && !(is_compressed == rhs.is_compressed)) + return false; + if (__isset.statistics != rhs.__isset.statistics) + return false; + else if (__isset.statistics && !(statistics == rhs.statistics)) + return false; + return true; + } + bool operator != (const DataPageHeaderV2 &rhs) const { + return !(*this == rhs); + } + + bool operator < (const DataPageHeaderV2 & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(DataPageHeaderV2 &a, DataPageHeaderV2 &b); + +std::ostream& operator<<(std::ostream& out, const DataPageHeaderV2& obj); + +typedef struct _PageHeader__isset { + _PageHeader__isset() : crc(false), data_page_header(false), index_page_header(false), dictionary_page_header(false), data_page_header_v2(false) {} + bool crc :1; + bool data_page_header :1; + bool index_page_header :1; + bool dictionary_page_header :1; + bool data_page_header_v2 :1; +} _PageHeader__isset; + +class PageHeader : public virtual ::apache::thrift::TBase { + public: + + PageHeader(const PageHeader&); + PageHeader& operator=(const PageHeader&); + PageHeader() : type((PageType::type)0), uncompressed_page_size(0), compressed_page_size(0), crc(0) { + } + + virtual ~PageHeader() throw(); + PageType::type type; + int32_t uncompressed_page_size; + int32_t compressed_page_size; + int32_t crc; + DataPageHeader data_page_header; + IndexPageHeader index_page_header; + DictionaryPageHeader dictionary_page_header; + DataPageHeaderV2 data_page_header_v2; + + _PageHeader__isset __isset; + + void __set_type(const PageType::type val); + + void __set_uncompressed_page_size(const int32_t val); + + void __set_compressed_page_size(const int32_t val); + + void __set_crc(const int32_t val); + + void __set_data_page_header(const DataPageHeader& val); + + void __set_index_page_header(const IndexPageHeader& val); + + void __set_dictionary_page_header(const DictionaryPageHeader& val); + + void __set_data_page_header_v2(const DataPageHeaderV2& val); + + bool operator == (const PageHeader & rhs) const + { + if (!(type == rhs.type)) + return false; + if (!(uncompressed_page_size == rhs.uncompressed_page_size)) + return false; + if (!(compressed_page_size == rhs.compressed_page_size)) + return false; + if (__isset.crc != rhs.__isset.crc) + return false; + else if (__isset.crc && !(crc == rhs.crc)) + return false; + if (__isset.data_page_header != rhs.__isset.data_page_header) + return false; + else if (__isset.data_page_header && !(data_page_header == rhs.data_page_header)) + return false; + if (__isset.index_page_header != rhs.__isset.index_page_header) + return false; + else if (__isset.index_page_header && !(index_page_header == rhs.index_page_header)) + return false; + if (__isset.dictionary_page_header != rhs.__isset.dictionary_page_header) + return false; + else if (__isset.dictionary_page_header && !(dictionary_page_header == rhs.dictionary_page_header)) + return false; + if (__isset.data_page_header_v2 != rhs.__isset.data_page_header_v2) + return false; + else if (__isset.data_page_header_v2 && !(data_page_header_v2 == rhs.data_page_header_v2)) + return false; + return true; + } + bool operator != (const PageHeader &rhs) const { + return !(*this == rhs); + } + + bool operator < (const PageHeader & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(PageHeader &a, PageHeader &b); + +std::ostream& operator<<(std::ostream& out, const PageHeader& obj); + +typedef struct _KeyValue__isset { + _KeyValue__isset() : value(false) {} + bool value :1; +} _KeyValue__isset; + +class KeyValue : public virtual ::apache::thrift::TBase { + public: + + KeyValue(const KeyValue&); + KeyValue& operator=(const KeyValue&); + KeyValue() : key(), value() { + } + + virtual ~KeyValue() throw(); + std::string key; + std::string value; + + _KeyValue__isset __isset; + + void __set_key(const std::string& val); + + void __set_value(const std::string& val); + + bool operator == (const KeyValue & rhs) const + { + if (!(key == rhs.key)) + return false; + if (__isset.value != rhs.__isset.value) + return false; + else if (__isset.value && !(value == rhs.value)) + return false; + return true; + } + bool operator != (const KeyValue &rhs) const { + return !(*this == rhs); + } + + bool operator < (const KeyValue & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(KeyValue &a, KeyValue &b); + +std::ostream& operator<<(std::ostream& out, const KeyValue& obj); + + +class SortingColumn : public virtual ::apache::thrift::TBase { + public: + + SortingColumn(const SortingColumn&); + SortingColumn& operator=(const SortingColumn&); + SortingColumn() : column_idx(0), descending(0), nulls_first(0) { + } + + virtual ~SortingColumn() throw(); + int32_t column_idx; + bool descending; + bool nulls_first; + + void __set_column_idx(const int32_t val); + + void __set_descending(const bool val); + + void __set_nulls_first(const bool val); + + bool operator == (const SortingColumn & rhs) const + { + if (!(column_idx == rhs.column_idx)) + return false; + if (!(descending == rhs.descending)) + return false; + if (!(nulls_first == rhs.nulls_first)) + return false; + return true; + } + bool operator != (const SortingColumn &rhs) const { + return !(*this == rhs); + } + + bool operator < (const SortingColumn & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(SortingColumn &a, SortingColumn &b); + +std::ostream& operator<<(std::ostream& out, const SortingColumn& obj); + + +class PageEncodingStats : public virtual ::apache::thrift::TBase { + public: + + PageEncodingStats(const PageEncodingStats&); + PageEncodingStats& operator=(const PageEncodingStats&); + PageEncodingStats() : page_type((PageType::type)0), encoding((Encoding::type)0), count(0) { + } + + virtual ~PageEncodingStats() throw(); + PageType::type page_type; + Encoding::type encoding; + int32_t count; + + void __set_page_type(const PageType::type val); + + void __set_encoding(const Encoding::type val); + + void __set_count(const int32_t val); + + bool operator == (const PageEncodingStats & rhs) const + { + if (!(page_type == rhs.page_type)) + return false; + if (!(encoding == rhs.encoding)) + return false; + if (!(count == rhs.count)) + return false; + return true; + } + bool operator != (const PageEncodingStats &rhs) const { + return !(*this == rhs); + } + + bool operator < (const PageEncodingStats & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(PageEncodingStats &a, PageEncodingStats &b); + +std::ostream& operator<<(std::ostream& out, const PageEncodingStats& obj); + +typedef struct _ColumnMetaData__isset { + _ColumnMetaData__isset() : key_value_metadata(false), index_page_offset(false), dictionary_page_offset(false), statistics(false), encoding_stats(false) {} + bool key_value_metadata :1; + bool index_page_offset :1; + bool dictionary_page_offset :1; + bool statistics :1; + bool encoding_stats :1; +} _ColumnMetaData__isset; + +class ColumnMetaData : public virtual ::apache::thrift::TBase { + public: + + ColumnMetaData(const ColumnMetaData&); + ColumnMetaData& operator=(const ColumnMetaData&); + ColumnMetaData() : type((Type::type)0), codec((CompressionCodec::type)0), num_values(0), total_uncompressed_size(0), total_compressed_size(0), data_page_offset(0), index_page_offset(0), dictionary_page_offset(0) { + } + + virtual ~ColumnMetaData() throw(); + Type::type type; + std::vector encodings; + std::vector path_in_schema; + CompressionCodec::type codec; + int64_t num_values; + int64_t total_uncompressed_size; + int64_t total_compressed_size; + std::vector key_value_metadata; + int64_t data_page_offset; + int64_t index_page_offset; + int64_t dictionary_page_offset; + Statistics statistics; + std::vector encoding_stats; + + _ColumnMetaData__isset __isset; + + void __set_type(const Type::type val); + + void __set_encodings(const std::vector & val); + + void __set_path_in_schema(const std::vector & val); + + void __set_codec(const CompressionCodec::type val); + + void __set_num_values(const int64_t val); + + void __set_total_uncompressed_size(const int64_t val); + + void __set_total_compressed_size(const int64_t val); + + void __set_key_value_metadata(const std::vector & val); + + void __set_data_page_offset(const int64_t val); + + void __set_index_page_offset(const int64_t val); + + void __set_dictionary_page_offset(const int64_t val); + + void __set_statistics(const Statistics& val); + + void __set_encoding_stats(const std::vector & val); + + bool operator == (const ColumnMetaData & rhs) const + { + if (!(type == rhs.type)) + return false; + if (!(encodings == rhs.encodings)) + return false; + if (!(path_in_schema == rhs.path_in_schema)) + return false; + if (!(codec == rhs.codec)) + return false; + if (!(num_values == rhs.num_values)) + return false; + if (!(total_uncompressed_size == rhs.total_uncompressed_size)) + return false; + if (!(total_compressed_size == rhs.total_compressed_size)) + return false; + if (__isset.key_value_metadata != rhs.__isset.key_value_metadata) + return false; + else if (__isset.key_value_metadata && !(key_value_metadata == rhs.key_value_metadata)) + return false; + if (!(data_page_offset == rhs.data_page_offset)) + return false; + if (__isset.index_page_offset != rhs.__isset.index_page_offset) + return false; + else if (__isset.index_page_offset && !(index_page_offset == rhs.index_page_offset)) + return false; + if (__isset.dictionary_page_offset != rhs.__isset.dictionary_page_offset) + return false; + else if (__isset.dictionary_page_offset && !(dictionary_page_offset == rhs.dictionary_page_offset)) + return false; + if (__isset.statistics != rhs.__isset.statistics) + return false; + else if (__isset.statistics && !(statistics == rhs.statistics)) + return false; + if (__isset.encoding_stats != rhs.__isset.encoding_stats) + return false; + else if (__isset.encoding_stats && !(encoding_stats == rhs.encoding_stats)) + return false; + return true; + } + bool operator != (const ColumnMetaData &rhs) const { + return !(*this == rhs); + } + + bool operator < (const ColumnMetaData & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(ColumnMetaData &a, ColumnMetaData &b); + +std::ostream& operator<<(std::ostream& out, const ColumnMetaData& obj); + + +class EncryptionWithFooterKey : public virtual ::apache::thrift::TBase { + public: + + EncryptionWithFooterKey(const EncryptionWithFooterKey&); + EncryptionWithFooterKey& operator=(const EncryptionWithFooterKey&); + EncryptionWithFooterKey() { + } + + virtual ~EncryptionWithFooterKey() throw(); + + bool operator == (const EncryptionWithFooterKey & /* rhs */) const + { + return true; + } + bool operator != (const EncryptionWithFooterKey &rhs) const { + return !(*this == rhs); + } + + bool operator < (const EncryptionWithFooterKey & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(EncryptionWithFooterKey &a, EncryptionWithFooterKey &b); + +std::ostream& operator<<(std::ostream& out, const EncryptionWithFooterKey& obj); + +typedef struct _EncryptionWithColumnKey__isset { + _EncryptionWithColumnKey__isset() : column_key_metadata(false) {} + bool column_key_metadata :1; +} _EncryptionWithColumnKey__isset; + +class EncryptionWithColumnKey : public virtual ::apache::thrift::TBase { + public: + + EncryptionWithColumnKey(const EncryptionWithColumnKey&); + EncryptionWithColumnKey& operator=(const EncryptionWithColumnKey&); + EncryptionWithColumnKey() : column_key_metadata() { + } + + virtual ~EncryptionWithColumnKey() throw(); + std::vector path_in_schema; + std::string column_key_metadata; + + _EncryptionWithColumnKey__isset __isset; + + void __set_path_in_schema(const std::vector & val); + + void __set_column_key_metadata(const std::string& val); + + bool operator == (const EncryptionWithColumnKey & rhs) const + { + if (!(path_in_schema == rhs.path_in_schema)) + return false; + if (__isset.column_key_metadata != rhs.__isset.column_key_metadata) + return false; + else if (__isset.column_key_metadata && !(column_key_metadata == rhs.column_key_metadata)) + return false; + return true; + } + bool operator != (const EncryptionWithColumnKey &rhs) const { + return !(*this == rhs); + } + + bool operator < (const EncryptionWithColumnKey & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(EncryptionWithColumnKey &a, EncryptionWithColumnKey &b); + +std::ostream& operator<<(std::ostream& out, const EncryptionWithColumnKey& obj); + +typedef struct _ColumnCryptoMetaData__isset { + _ColumnCryptoMetaData__isset() : ENCRYPTION_WITH_FOOTER_KEY(false), ENCRYPTION_WITH_COLUMN_KEY(false) {} + bool ENCRYPTION_WITH_FOOTER_KEY :1; + bool ENCRYPTION_WITH_COLUMN_KEY :1; +} _ColumnCryptoMetaData__isset; + +class ColumnCryptoMetaData : public virtual ::apache::thrift::TBase { + public: + + ColumnCryptoMetaData(const ColumnCryptoMetaData&); + ColumnCryptoMetaData& operator=(const ColumnCryptoMetaData&); + ColumnCryptoMetaData() { + } + + virtual ~ColumnCryptoMetaData() throw(); + EncryptionWithFooterKey ENCRYPTION_WITH_FOOTER_KEY; + EncryptionWithColumnKey ENCRYPTION_WITH_COLUMN_KEY; + + _ColumnCryptoMetaData__isset __isset; + + void __set_ENCRYPTION_WITH_FOOTER_KEY(const EncryptionWithFooterKey& val); + + void __set_ENCRYPTION_WITH_COLUMN_KEY(const EncryptionWithColumnKey& val); + + bool operator == (const ColumnCryptoMetaData & rhs) const + { + if (__isset.ENCRYPTION_WITH_FOOTER_KEY != rhs.__isset.ENCRYPTION_WITH_FOOTER_KEY) + return false; + else if (__isset.ENCRYPTION_WITH_FOOTER_KEY && !(ENCRYPTION_WITH_FOOTER_KEY == rhs.ENCRYPTION_WITH_FOOTER_KEY)) + return false; + if (__isset.ENCRYPTION_WITH_COLUMN_KEY != rhs.__isset.ENCRYPTION_WITH_COLUMN_KEY) + return false; + else if (__isset.ENCRYPTION_WITH_COLUMN_KEY && !(ENCRYPTION_WITH_COLUMN_KEY == rhs.ENCRYPTION_WITH_COLUMN_KEY)) + return false; + return true; + } + bool operator != (const ColumnCryptoMetaData &rhs) const { + return !(*this == rhs); + } + + bool operator < (const ColumnCryptoMetaData & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(ColumnCryptoMetaData &a, ColumnCryptoMetaData &b); + +std::ostream& operator<<(std::ostream& out, const ColumnCryptoMetaData& obj); + +typedef struct _ColumnChunk__isset { + _ColumnChunk__isset() : file_path(false), meta_data(false), offset_index_offset(false), offset_index_length(false), column_index_offset(false), column_index_length(false), crypto_meta_data(false) {} + bool file_path :1; + bool meta_data :1; + bool offset_index_offset :1; + bool offset_index_length :1; + bool column_index_offset :1; + bool column_index_length :1; + bool crypto_meta_data :1; +} _ColumnChunk__isset; + +class ColumnChunk : public virtual ::apache::thrift::TBase { + public: + + ColumnChunk(const ColumnChunk&); + ColumnChunk& operator=(const ColumnChunk&); + ColumnChunk() : file_path(), file_offset(0), offset_index_offset(0), offset_index_length(0), column_index_offset(0), column_index_length(0) { + } + + virtual ~ColumnChunk() throw(); + std::string file_path; + int64_t file_offset; + ColumnMetaData meta_data; + int64_t offset_index_offset; + int32_t offset_index_length; + int64_t column_index_offset; + int32_t column_index_length; + ColumnCryptoMetaData crypto_meta_data; + + _ColumnChunk__isset __isset; + + void __set_file_path(const std::string& val); + + void __set_file_offset(const int64_t val); + + void __set_meta_data(const ColumnMetaData& val); + + void __set_offset_index_offset(const int64_t val); + + void __set_offset_index_length(const int32_t val); + + void __set_column_index_offset(const int64_t val); + + void __set_column_index_length(const int32_t val); + + void __set_crypto_meta_data(const ColumnCryptoMetaData& val); + + bool operator == (const ColumnChunk & rhs) const + { + if (__isset.file_path != rhs.__isset.file_path) + return false; + else if (__isset.file_path && !(file_path == rhs.file_path)) + return false; + if (!(file_offset == rhs.file_offset)) + return false; + if (__isset.meta_data != rhs.__isset.meta_data) + return false; + else if (__isset.meta_data && !(meta_data == rhs.meta_data)) + return false; + if (__isset.offset_index_offset != rhs.__isset.offset_index_offset) + return false; + else if (__isset.offset_index_offset && !(offset_index_offset == rhs.offset_index_offset)) + return false; + if (__isset.offset_index_length != rhs.__isset.offset_index_length) + return false; + else if (__isset.offset_index_length && !(offset_index_length == rhs.offset_index_length)) + return false; + if (__isset.column_index_offset != rhs.__isset.column_index_offset) + return false; + else if (__isset.column_index_offset && !(column_index_offset == rhs.column_index_offset)) + return false; + if (__isset.column_index_length != rhs.__isset.column_index_length) + return false; + else if (__isset.column_index_length && !(column_index_length == rhs.column_index_length)) + return false; + if (__isset.crypto_meta_data != rhs.__isset.crypto_meta_data) + return false; + else if (__isset.crypto_meta_data && !(crypto_meta_data == rhs.crypto_meta_data)) + return false; + return true; + } + bool operator != (const ColumnChunk &rhs) const { + return !(*this == rhs); + } + + bool operator < (const ColumnChunk & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(ColumnChunk &a, ColumnChunk &b); + +std::ostream& operator<<(std::ostream& out, const ColumnChunk& obj); + +typedef struct _RowGroup__isset { + _RowGroup__isset() : sorting_columns(false), file_offset(false), total_compressed_size(false) {} + bool sorting_columns :1; + bool file_offset :1; + bool total_compressed_size :1; +} _RowGroup__isset; + +class RowGroup : public virtual ::apache::thrift::TBase { + public: + + RowGroup(const RowGroup&); + RowGroup& operator=(const RowGroup&); + RowGroup() : total_byte_size(0), num_rows(0), file_offset(0), total_compressed_size(0) { + } + + virtual ~RowGroup() throw(); + std::vector columns; + int64_t total_byte_size; + int64_t num_rows; + std::vector sorting_columns; + int64_t file_offset; + int64_t total_compressed_size; + + _RowGroup__isset __isset; + + void __set_columns(const std::vector & val); + + void __set_total_byte_size(const int64_t val); + + void __set_num_rows(const int64_t val); + + void __set_sorting_columns(const std::vector & val); + + void __set_file_offset(const int64_t val); + + void __set_total_compressed_size(const int64_t val); + + bool operator == (const RowGroup & rhs) const + { + if (!(columns == rhs.columns)) + return false; + if (!(total_byte_size == rhs.total_byte_size)) + return false; + if (!(num_rows == rhs.num_rows)) + return false; + if (__isset.sorting_columns != rhs.__isset.sorting_columns) + return false; + else if (__isset.sorting_columns && !(sorting_columns == rhs.sorting_columns)) + return false; + if (__isset.file_offset != rhs.__isset.file_offset) + return false; + else if (__isset.file_offset && !(file_offset == rhs.file_offset)) + return false; + if (__isset.total_compressed_size != rhs.__isset.total_compressed_size) + return false; + else if (__isset.total_compressed_size && !(total_compressed_size == rhs.total_compressed_size)) + return false; + return true; + } + bool operator != (const RowGroup &rhs) const { + return !(*this == rhs); + } + + bool operator < (const RowGroup & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(RowGroup &a, RowGroup &b); + +std::ostream& operator<<(std::ostream& out, const RowGroup& obj); + + +class TypeDefinedOrder : public virtual ::apache::thrift::TBase { + public: + + TypeDefinedOrder(const TypeDefinedOrder&); + TypeDefinedOrder& operator=(const TypeDefinedOrder&); + TypeDefinedOrder() { + } + + virtual ~TypeDefinedOrder() throw(); + + bool operator == (const TypeDefinedOrder & /* rhs */) const + { + return true; + } + bool operator != (const TypeDefinedOrder &rhs) const { + return !(*this == rhs); + } + + bool operator < (const TypeDefinedOrder & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(TypeDefinedOrder &a, TypeDefinedOrder &b); + +std::ostream& operator<<(std::ostream& out, const TypeDefinedOrder& obj); + +typedef struct _ColumnOrder__isset { + _ColumnOrder__isset() : TYPE_ORDER(false) {} + bool TYPE_ORDER :1; +} _ColumnOrder__isset; + +class ColumnOrder : public virtual ::apache::thrift::TBase { + public: + + ColumnOrder(const ColumnOrder&); + ColumnOrder& operator=(const ColumnOrder&); + ColumnOrder() { + } + + virtual ~ColumnOrder() throw(); + TypeDefinedOrder TYPE_ORDER; + + _ColumnOrder__isset __isset; + + void __set_TYPE_ORDER(const TypeDefinedOrder& val); + + bool operator == (const ColumnOrder & rhs) const + { + if (__isset.TYPE_ORDER != rhs.__isset.TYPE_ORDER) + return false; + else if (__isset.TYPE_ORDER && !(TYPE_ORDER == rhs.TYPE_ORDER)) + return false; + return true; + } + bool operator != (const ColumnOrder &rhs) const { + return !(*this == rhs); + } + + bool operator < (const ColumnOrder & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(ColumnOrder &a, ColumnOrder &b); + +std::ostream& operator<<(std::ostream& out, const ColumnOrder& obj); + + +class PageLocation : public virtual ::apache::thrift::TBase { + public: + + PageLocation(const PageLocation&); + PageLocation& operator=(const PageLocation&); + PageLocation() : offset(0), compressed_page_size(0), first_row_index(0) { + } + + virtual ~PageLocation() throw(); + int64_t offset; + int32_t compressed_page_size; + int64_t first_row_index; + + void __set_offset(const int64_t val); + + void __set_compressed_page_size(const int32_t val); + + void __set_first_row_index(const int64_t val); + + bool operator == (const PageLocation & rhs) const + { + if (!(offset == rhs.offset)) + return false; + if (!(compressed_page_size == rhs.compressed_page_size)) + return false; + if (!(first_row_index == rhs.first_row_index)) + return false; + return true; + } + bool operator != (const PageLocation &rhs) const { + return !(*this == rhs); + } + + bool operator < (const PageLocation & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(PageLocation &a, PageLocation &b); + +std::ostream& operator<<(std::ostream& out, const PageLocation& obj); + + +class OffsetIndex : public virtual ::apache::thrift::TBase { + public: + + OffsetIndex(const OffsetIndex&); + OffsetIndex& operator=(const OffsetIndex&); + OffsetIndex() { + } + + virtual ~OffsetIndex() throw(); + std::vector page_locations; + + void __set_page_locations(const std::vector & val); + + bool operator == (const OffsetIndex & rhs) const + { + if (!(page_locations == rhs.page_locations)) + return false; + return true; + } + bool operator != (const OffsetIndex &rhs) const { + return !(*this == rhs); + } + + bool operator < (const OffsetIndex & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(OffsetIndex &a, OffsetIndex &b); + +std::ostream& operator<<(std::ostream& out, const OffsetIndex& obj); + +typedef struct _ColumnIndex__isset { + _ColumnIndex__isset() : null_counts(false) {} + bool null_counts :1; +} _ColumnIndex__isset; + +class ColumnIndex : public virtual ::apache::thrift::TBase { + public: + + ColumnIndex(const ColumnIndex&); + ColumnIndex& operator=(const ColumnIndex&); + ColumnIndex() : boundary_order((BoundaryOrder::type)0) { + } + + virtual ~ColumnIndex() throw(); + std::vector null_pages; + std::vector min_values; + std::vector max_values; + BoundaryOrder::type boundary_order; + std::vector null_counts; + + _ColumnIndex__isset __isset; + + void __set_null_pages(const std::vector & val); + + void __set_min_values(const std::vector & val); + + void __set_max_values(const std::vector & val); + + void __set_boundary_order(const BoundaryOrder::type val); + + void __set_null_counts(const std::vector & val); + + bool operator == (const ColumnIndex & rhs) const + { + if (!(null_pages == rhs.null_pages)) + return false; + if (!(min_values == rhs.min_values)) + return false; + if (!(max_values == rhs.max_values)) + return false; + if (!(boundary_order == rhs.boundary_order)) + return false; + if (__isset.null_counts != rhs.__isset.null_counts) + return false; + else if (__isset.null_counts && !(null_counts == rhs.null_counts)) + return false; + return true; + } + bool operator != (const ColumnIndex &rhs) const { + return !(*this == rhs); + } + + bool operator < (const ColumnIndex & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(ColumnIndex &a, ColumnIndex &b); + +std::ostream& operator<<(std::ostream& out, const ColumnIndex& obj); + +typedef struct _FileMetaData__isset { + _FileMetaData__isset() : key_value_metadata(false), created_by(false), column_orders(false) {} + bool key_value_metadata :1; + bool created_by :1; + bool column_orders :1; +} _FileMetaData__isset; + +class FileMetaData : public virtual ::apache::thrift::TBase { + public: + + FileMetaData(const FileMetaData&); + FileMetaData& operator=(const FileMetaData&); + FileMetaData() : version(0), num_rows(0), created_by() { + } + + virtual ~FileMetaData() throw(); + int32_t version; + std::vector schema; + int64_t num_rows; + std::vector row_groups; + std::vector key_value_metadata; + std::string created_by; + std::vector column_orders; + + _FileMetaData__isset __isset; + + void __set_version(const int32_t val); + + void __set_schema(const std::vector & val); + + void __set_num_rows(const int64_t val); + + void __set_row_groups(const std::vector & val); + + void __set_key_value_metadata(const std::vector & val); + + void __set_created_by(const std::string& val); + + void __set_column_orders(const std::vector & val); + + bool operator == (const FileMetaData & rhs) const + { + if (!(version == rhs.version)) + return false; + if (!(schema == rhs.schema)) + return false; + if (!(num_rows == rhs.num_rows)) + return false; + if (!(row_groups == rhs.row_groups)) + return false; + if (__isset.key_value_metadata != rhs.__isset.key_value_metadata) + return false; + else if (__isset.key_value_metadata && !(key_value_metadata == rhs.key_value_metadata)) + return false; + if (__isset.created_by != rhs.__isset.created_by) + return false; + else if (__isset.created_by && !(created_by == rhs.created_by)) + return false; + if (__isset.column_orders != rhs.__isset.column_orders) + return false; + else if (__isset.column_orders && !(column_orders == rhs.column_orders)) + return false; + return true; + } + bool operator != (const FileMetaData &rhs) const { + return !(*this == rhs); + } + + bool operator < (const FileMetaData & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(FileMetaData &a, FileMetaData &b); + +std::ostream& operator<<(std::ostream& out, const FileMetaData& obj); + +typedef struct _AesGcmV1__isset { + _AesGcmV1__isset() : aad_metadata(false), iv_prefix(false) {} + bool aad_metadata :1; + bool iv_prefix :1; +} _AesGcmV1__isset; + +class AesGcmV1 : public virtual ::apache::thrift::TBase { + public: + + AesGcmV1(const AesGcmV1&); + AesGcmV1& operator=(const AesGcmV1&); + AesGcmV1() : aad_metadata(), iv_prefix() { + } + + virtual ~AesGcmV1() throw(); + std::string aad_metadata; + std::string iv_prefix; + + _AesGcmV1__isset __isset; + + void __set_aad_metadata(const std::string& val); + + void __set_iv_prefix(const std::string& val); + + bool operator == (const AesGcmV1 & rhs) const + { + if (__isset.aad_metadata != rhs.__isset.aad_metadata) + return false; + else if (__isset.aad_metadata && !(aad_metadata == rhs.aad_metadata)) + return false; + if (__isset.iv_prefix != rhs.__isset.iv_prefix) + return false; + else if (__isset.iv_prefix && !(iv_prefix == rhs.iv_prefix)) + return false; + return true; + } + bool operator != (const AesGcmV1 &rhs) const { + return !(*this == rhs); + } + + bool operator < (const AesGcmV1 & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(AesGcmV1 &a, AesGcmV1 &b); + +std::ostream& operator<<(std::ostream& out, const AesGcmV1& obj); + +typedef struct _AesGcmCtrV1__isset { + _AesGcmCtrV1__isset() : aad_metadata(false), gcm_iv_prefix(false), ctr_iv_prefix(false) {} + bool aad_metadata :1; + bool gcm_iv_prefix :1; + bool ctr_iv_prefix :1; +} _AesGcmCtrV1__isset; + +class AesGcmCtrV1 : public virtual ::apache::thrift::TBase { + public: + + AesGcmCtrV1(const AesGcmCtrV1&); + AesGcmCtrV1& operator=(const AesGcmCtrV1&); + AesGcmCtrV1() : aad_metadata(), gcm_iv_prefix(), ctr_iv_prefix() { + } + + virtual ~AesGcmCtrV1() throw(); + std::string aad_metadata; + std::string gcm_iv_prefix; + std::string ctr_iv_prefix; + + _AesGcmCtrV1__isset __isset; + + void __set_aad_metadata(const std::string& val); + + void __set_gcm_iv_prefix(const std::string& val); + + void __set_ctr_iv_prefix(const std::string& val); + + bool operator == (const AesGcmCtrV1 & rhs) const + { + if (__isset.aad_metadata != rhs.__isset.aad_metadata) + return false; + else if (__isset.aad_metadata && !(aad_metadata == rhs.aad_metadata)) + return false; + if (__isset.gcm_iv_prefix != rhs.__isset.gcm_iv_prefix) + return false; + else if (__isset.gcm_iv_prefix && !(gcm_iv_prefix == rhs.gcm_iv_prefix)) + return false; + if (__isset.ctr_iv_prefix != rhs.__isset.ctr_iv_prefix) + return false; + else if (__isset.ctr_iv_prefix && !(ctr_iv_prefix == rhs.ctr_iv_prefix)) + return false; + return true; + } + bool operator != (const AesGcmCtrV1 &rhs) const { + return !(*this == rhs); + } + + bool operator < (const AesGcmCtrV1 & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(AesGcmCtrV1 &a, AesGcmCtrV1 &b); + +std::ostream& operator<<(std::ostream& out, const AesGcmCtrV1& obj); + +typedef struct _EncryptionAlgorithm__isset { + _EncryptionAlgorithm__isset() : AES_GCM_V1(false), AES_GCM_CTR_V1(false) {} + bool AES_GCM_V1 :1; + bool AES_GCM_CTR_V1 :1; +} _EncryptionAlgorithm__isset; + +class EncryptionAlgorithm : public virtual ::apache::thrift::TBase { + public: + + EncryptionAlgorithm(const EncryptionAlgorithm&); + EncryptionAlgorithm& operator=(const EncryptionAlgorithm&); + EncryptionAlgorithm() { + } + + virtual ~EncryptionAlgorithm() throw(); + AesGcmV1 AES_GCM_V1; + AesGcmCtrV1 AES_GCM_CTR_V1; + + _EncryptionAlgorithm__isset __isset; + + void __set_AES_GCM_V1(const AesGcmV1& val); + + void __set_AES_GCM_CTR_V1(const AesGcmCtrV1& val); + + bool operator == (const EncryptionAlgorithm & rhs) const + { + if (__isset.AES_GCM_V1 != rhs.__isset.AES_GCM_V1) + return false; + else if (__isset.AES_GCM_V1 && !(AES_GCM_V1 == rhs.AES_GCM_V1)) + return false; + if (__isset.AES_GCM_CTR_V1 != rhs.__isset.AES_GCM_CTR_V1) + return false; + else if (__isset.AES_GCM_CTR_V1 && !(AES_GCM_CTR_V1 == rhs.AES_GCM_CTR_V1)) + return false; + return true; + } + bool operator != (const EncryptionAlgorithm &rhs) const { + return !(*this == rhs); + } + + bool operator < (const EncryptionAlgorithm & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(EncryptionAlgorithm &a, EncryptionAlgorithm &b); + +std::ostream& operator<<(std::ostream& out, const EncryptionAlgorithm& obj); + +typedef struct _FileCryptoMetaData__isset { + _FileCryptoMetaData__isset() : footer_key_metadata(false) {} + bool footer_key_metadata :1; +} _FileCryptoMetaData__isset; + +class FileCryptoMetaData : public virtual ::apache::thrift::TBase { + public: + + FileCryptoMetaData(const FileCryptoMetaData&); + FileCryptoMetaData& operator=(const FileCryptoMetaData&); + FileCryptoMetaData() : encrypted_footer(0), footer_key_metadata(), footer_offset(0) { + } + + virtual ~FileCryptoMetaData() throw(); + EncryptionAlgorithm encryption_algorithm; + bool encrypted_footer; + std::string footer_key_metadata; + int64_t footer_offset; + + _FileCryptoMetaData__isset __isset; + + void __set_encryption_algorithm(const EncryptionAlgorithm& val); + + void __set_encrypted_footer(const bool val); + + void __set_footer_key_metadata(const std::string& val); + + void __set_footer_offset(const int64_t val); + + bool operator == (const FileCryptoMetaData & rhs) const + { + if (!(encryption_algorithm == rhs.encryption_algorithm)) + return false; + if (!(encrypted_footer == rhs.encrypted_footer)) + return false; + if (__isset.footer_key_metadata != rhs.__isset.footer_key_metadata) + return false; + else if (__isset.footer_key_metadata && !(footer_key_metadata == rhs.footer_key_metadata)) + return false; + if (!(footer_offset == rhs.footer_offset)) + return false; + return true; + } + bool operator != (const FileCryptoMetaData &rhs) const { + return !(*this == rhs); + } + + bool operator < (const FileCryptoMetaData & ) const; + + uint32_t read(::apache::thrift::protocol::TProtocol* iprot); + uint32_t write(::apache::thrift::protocol::TProtocol* oprot) const; + + virtual void printTo(std::ostream& out) const; +}; + +void swap(FileCryptoMetaData &a, FileCryptoMetaData &b); + +std::ostream& operator<<(std::ostream& out, const FileCryptoMetaData& obj); + +}} // namespace + +#endif diff --git a/contrib/arrow-cmake/cpp/src/parquet/parquet_version.h b/contrib/arrow-cmake/cpp/src/parquet/parquet_version.h new file mode 100644 index 00000000000..dd83e45028d --- /dev/null +++ b/contrib/arrow-cmake/cpp/src/parquet/parquet_version.h @@ -0,0 +1,24 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +#ifndef PARQUET_VERSION_H +#define PARQUET_VERSION_H + +// define the parquet created by version +#define CREATED_BY_VERSION "parquet-cpp version 1.5.1-SNAPSHOT" + +#endif // PARQUET_VERSION_H diff --git a/contrib/arrow-cmake/cpp/src/thrift/stdcxx.h b/contrib/arrow-cmake/cpp/src/thrift/stdcxx.h new file mode 100644 index 00000000000..b7f211ee4c6 --- /dev/null +++ b/contrib/arrow-cmake/cpp/src/thrift/stdcxx.h @@ -0,0 +1,11 @@ +/* + +Temporary hack caused by 17355425 - THRIFT-4735: Remove Qt4 build support + +Fixes +../contrib/arrow-cmake/cpp/src/parquet/parquet_types.h:18:10: fatal error: thrift/stdcxx.h: No such file or directory +#include + +Delete me. + +*/ diff --git a/contrib/boost b/contrib/boost index 6883b40449f..6a96e8b59f7 160000 --- a/contrib/boost +++ b/contrib/boost @@ -1 +1 @@ -Subproject commit 6883b40449f378019aec792f9983ce3afc7ff16e +Subproject commit 6a96e8b59f76148eb8ad54a9d15259f8ce84c606 diff --git a/contrib/boost-cmake/CMakeLists.txt b/contrib/boost-cmake/CMakeLists.txt index acb76ad0328..ee6721616ae 100644 --- a/contrib/boost-cmake/CMakeLists.txt +++ b/contrib/boost-cmake/CMakeLists.txt @@ -10,49 +10,30 @@ # Important boost patch: 094c18b # -set (LIBRARY_DIR ${ClickHouse_SOURCE_DIR}/contrib/boost) +include(${ClickHouse_SOURCE_DIR}/cmake/dbms_glob_sources.cmake) -if (NOT MSVC) +set(LIBRARY_DIR ${ClickHouse_SOURCE_DIR}/contrib/boost) + +if(NOT MSVC) add_definitions(-Wno-unused-variable -Wno-deprecated-declarations) -endif () +endif() -add_library(boost_program_options_internal ${LINK_MODE} -${LIBRARY_DIR}/libs/program_options/src/cmdline.cpp -${LIBRARY_DIR}/libs/program_options/src/config_file.cpp -${LIBRARY_DIR}/libs/program_options/src/convert.cpp -${LIBRARY_DIR}/libs/program_options/src/options_description.cpp -${LIBRARY_DIR}/libs/program_options/src/parsers.cpp -${LIBRARY_DIR}/libs/program_options/src/positional_options.cpp -${LIBRARY_DIR}/libs/program_options/src/split.cpp -${LIBRARY_DIR}/libs/program_options/src/utf8_codecvt_facet.cpp -${LIBRARY_DIR}/libs/program_options/src/value_semantic.cpp -${LIBRARY_DIR}/libs/program_options/src/variables_map.cpp -${LIBRARY_DIR}/libs/program_options/src/winmain.cpp) +macro(add_boost_lib lib_name) + add_headers_and_sources(boost_${lib_name} ${LIBRARY_DIR}/libs/${lib_name}/src) + add_library(boost_${lib_name}_internal ${LINK_MODE} ${boost_${lib_name}_sources}) + target_include_directories(boost_${lib_name}_internal SYSTEM BEFORE PUBLIC ${Boost_INCLUDE_DIRS}) + target_compile_definitions(boost_${lib_name}_internal PUBLIC BOOST_SYSTEM_NO_DEPRECATED) +endmacro() -add_library(boost_filesystem_internal ${LINK_MODE} -${LIBRARY_DIR}/libs/filesystem/src/codecvt_error_category.cpp -${LIBRARY_DIR}/libs/filesystem/src/operations.cpp -${LIBRARY_DIR}/libs/filesystem/src/path.cpp -${LIBRARY_DIR}/libs/filesystem/src/path_traits.cpp -${LIBRARY_DIR}/libs/filesystem/src/portability.cpp -${LIBRARY_DIR}/libs/filesystem/src/unique_path.cpp -${LIBRARY_DIR}/libs/filesystem/src/utf8_codecvt_facet.cpp -${LIBRARY_DIR}/libs/filesystem/src/windows_file_codecvt.cpp) +add_boost_lib(system) -add_library(boost_system_internal ${LINK_MODE} -${LIBRARY_DIR}/libs/system/src/error_code.cpp) +add_boost_lib(program_options) -add_library(boost_random_internal ${LINK_MODE} -${LIBRARY_DIR}/libs/random/src/random_device.cpp) +add_boost_lib(filesystem) +target_link_libraries(boost_filesystem_internal PRIVATE boost_system_internal) -target_link_libraries (boost_filesystem_internal PUBLIC boost_system_internal) +#add_boost_lib(random) -target_include_directories (boost_program_options_internal SYSTEM BEFORE PUBLIC ${Boost_INCLUDE_DIRS}) -target_include_directories (boost_filesystem_internal SYSTEM BEFORE PUBLIC ${Boost_INCLUDE_DIRS}) -target_include_directories (boost_system_internal SYSTEM BEFORE PUBLIC ${Boost_INCLUDE_DIRS}) -target_include_directories (boost_random_internal SYSTEM BEFORE PUBLIC ${Boost_INCLUDE_DIRS}) - -target_compile_definitions (boost_program_options_internal PUBLIC BOOST_SYSTEM_NO_DEPRECATED) -target_compile_definitions (boost_filesystem_internal PUBLIC BOOST_SYSTEM_NO_DEPRECATED) -target_compile_definitions (boost_system_internal PUBLIC BOOST_SYSTEM_NO_DEPRECATED) -target_compile_definitions (boost_random_internal PUBLIC BOOST_SYSTEM_NO_DEPRECATED) +if (USE_INTERNAL_PARQUET_LIBRARY) + add_boost_lib(regex) +endif() diff --git a/contrib/librdkafka-cmake/CMakeLists.txt b/contrib/librdkafka-cmake/CMakeLists.txt index 62337f60fb5..480c806d417 100644 --- a/contrib/librdkafka-cmake/CMakeLists.txt +++ b/contrib/librdkafka-cmake/CMakeLists.txt @@ -51,10 +51,10 @@ set(SRCS ${RDKAFKA_SOURCE_DIR}/snappy.c ${RDKAFKA_SOURCE_DIR}/tinycthread.c ${RDKAFKA_SOURCE_DIR}/tinycthread_extra.c - ${RDKAFKA_SOURCE_DIR}/xxhash.c - ${RDKAFKA_SOURCE_DIR}/lz4.c - ${RDKAFKA_SOURCE_DIR}/lz4frame.c - ${RDKAFKA_SOURCE_DIR}/lz4hc.c + #${RDKAFKA_SOURCE_DIR}/xxhash.c + #${RDKAFKA_SOURCE_DIR}/lz4.c + #${RDKAFKA_SOURCE_DIR}/lz4frame.c + #${RDKAFKA_SOURCE_DIR}/lz4hc.c ${RDKAFKA_SOURCE_DIR}/rdgz.c ) diff --git a/contrib/lz4-cmake/CMakeLists.txt b/contrib/lz4-cmake/CMakeLists.txt index 4a6ad38d001..382185cc339 100644 --- a/contrib/lz4-cmake/CMakeLists.txt +++ b/contrib/lz4-cmake/CMakeLists.txt @@ -3,6 +3,10 @@ SET(LIBRARY_DIR ${ClickHouse_SOURCE_DIR}/contrib/lz4/lib) add_library (lz4 ${LIBRARY_DIR}/lz4.c ${LIBRARY_DIR}/lz4hc.c + ${LIBRARY_DIR}/lz4frame.c + ${LIBRARY_DIR}/lz4frame.h + ${LIBRARY_DIR}/xxhash.c + ${LIBRARY_DIR}/xxhash.h ${LIBRARY_DIR}/lz4.h ${LIBRARY_DIR}/lz4hc.h diff --git a/contrib/snappy b/contrib/snappy new file mode 160000 index 00000000000..3f194acb57e --- /dev/null +++ b/contrib/snappy @@ -0,0 +1 @@ +Subproject commit 3f194acb57e0487531c96b97af61dcbd025a78a3 diff --git a/contrib/thrift b/contrib/thrift new file mode 160000 index 00000000000..010ccf0a0c7 --- /dev/null +++ b/contrib/thrift @@ -0,0 +1 @@ +Subproject commit 010ccf0a0c7023fea0f6bf4e4078ebdff7e61982 diff --git a/dbms/CMakeLists.txt b/dbms/CMakeLists.txt index 121fe5c4711..9eca53c82b7 100644 --- a/dbms/CMakeLists.txt +++ b/dbms/CMakeLists.txt @@ -295,9 +295,9 @@ if (USE_RDKAFKA) endif () if (USE_PARQUET) - target_link_libraries(dbms ${PARQUET_LIBRARY} ${ARROW_LIBRARY}) - if (NOT USE_INTERNAL_PARQUET_LIBRARY) - target_include_directories (dbms BEFORE PRIVATE ${PARQUET_INCLUDE_DIR} ${ARROW_INCLUDE_DIR}) + target_link_libraries(dbms PRIVATE ${PARQUET_LIBRARY}) + if (NOT USE_INTERNAL_PARQUET_LIBRARY OR USE_INTERNAL_PARQUET_LIBRARY_NATIVE_CMAKE) + target_include_directories (dbms SYSTEM BEFORE PRIVATE ${PARQUET_INCLUDE_DIR} ${ARROW_INCLUDE_DIR}) endif () endif () diff --git a/dbms/programs/server/Server.cpp b/dbms/programs/server/Server.cpp index 9c0d7d26f57..87a925594e8 100644 --- a/dbms/programs/server/Server.cpp +++ b/dbms/programs/server/Server.cpp @@ -478,7 +478,7 @@ int Server::main(const std::vector & /*args*/) global_context->setFormatSchemaPath(format_schema_path.path()); format_schema_path.createDirectories(); - LOG_INFO(log, "Loading metadata."); + LOG_INFO(log, "Loading metadata from " + path); try { loadMetadataSystem(*global_context); diff --git a/dbms/src/Common/config.h.in b/dbms/src/Common/config.h.in index 2f4f10624d4..63067fdf15e 100644 --- a/dbms/src/Common/config.h.in +++ b/dbms/src/Common/config.h.in @@ -14,6 +14,8 @@ #cmakedefine01 USE_POCO_MONGODB #cmakedefine01 USE_POCO_NETSSL #cmakedefine01 USE_BASE64 +#cmakedefine01 USE_SNAPPY +#cmakedefine01 USE_PARQUET #cmakedefine01 USE_HDFS #cmakedefine01 USE_XXHASH #cmakedefine01 USE_INTERNAL_LLVM_LIBRARY diff --git a/dbms/src/DataStreams/ParquetBlockInputStream.cpp b/dbms/src/DataStreams/ParquetBlockInputStream.cpp deleted file mode 100644 index 58aa9d5957e..00000000000 --- a/dbms/src/DataStreams/ParquetBlockInputStream.cpp +++ /dev/null @@ -1,336 +0,0 @@ -#include -#include -#include - -// TODO: clear includes -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - - -#include -#include - -namespace DB -{ - -ParquetBlockInputStream::ParquetBlockInputStream(ReadBuffer & istr_, const Block & header_) - : istr(istr_) - , header(header_) -{ -} - -Block ParquetBlockInputStream::getHeader() const -{ - return header; -} - -/// Inserts numeric data right into internal column data to reduce an overhead -template -void ParquetBlockInputStream::fillColumnWithNumericData(std::shared_ptr & arrow_column, MutableColumnPtr & internal_column) -{ - PaddedPODArray & column_data = static_cast &>(*internal_column).getData(); - column_data.reserve(arrow_column->length()); - - for (size_t chunk_i = 0; chunk_i != static_cast(arrow_column->data()->num_chunks()); ++chunk_i) - { - std::shared_ptr chunk = arrow_column->data()->chunk(chunk_i); - /// buffers[0] is a null bitmap and buffers[1] are actual values - std::shared_ptr buffer = chunk->data()->buffers[1]; - - const NumericType * raw_data = reinterpret_cast(buffer->data()); - column_data.insert_assume_reserved(raw_data, raw_data + chunk->length()); - } -} - -/// Inserts chars and offsets right into internal column data to reduce an overhead. -/// Internal offsets are shifted by one to the right in comparison with Arrow ones. So the last offset should map to the end of all chars. -/// Also internal strings are null terminated. -void ParquetBlockInputStream::fillColumnWithStringData(std::shared_ptr & arrow_column, MutableColumnPtr & internal_column) -{ - PaddedPODArray & column_chars_t = static_cast(*internal_column).getChars(); - PaddedPODArray & column_offsets = static_cast(*internal_column).getOffsets(); - - size_t chars_t_size = 0; - for (size_t chunk_i = 0; chunk_i != static_cast(arrow_column->data()->num_chunks()); ++chunk_i) - { - arrow::BinaryArray & chunk = static_cast(*(arrow_column->data()->chunk(chunk_i))); - const size_t chunk_length = chunk.length(); - - chars_t_size += chunk.value_offset(chunk_length - 1) + chunk.value_length(chunk_length - 1); - chars_t_size += chunk_length; /// additional space for null bytes - } - - column_chars_t.reserve(chars_t_size); - column_offsets.reserve(arrow_column->length()); - - for (size_t chunk_i = 0; chunk_i != static_cast(arrow_column->data()->num_chunks()); ++chunk_i) - { - arrow::BinaryArray & chunk = static_cast(*(arrow_column->data()->chunk(chunk_i))); - std::shared_ptr buffer = chunk.value_data(); - const size_t chunk_length = chunk.length(); - - for (size_t offset_i = 0; offset_i != chunk_length; ++offset_i) - { - const UInt8 * raw_data = buffer->data() + chunk.value_offset(offset_i); - column_chars_t.insert_assume_reserved(raw_data, raw_data + chunk.value_length(offset_i)); - column_chars_t.emplace_back('\0'); - - column_offsets.emplace_back(column_chars_t.size()); - } - } -} - -void ParquetBlockInputStream::fillColumnWithBooleanData(std::shared_ptr & arrow_column, MutableColumnPtr & internal_column) -{ - PaddedPODArray & column_data = static_cast &>(*internal_column).getData(); - column_data.resize(arrow_column->length()); - - for (size_t chunk_i = 0; chunk_i != static_cast(arrow_column->data()->num_chunks()); ++chunk_i) - { - arrow::BooleanArray & chunk = static_cast(*(arrow_column->data()->chunk(chunk_i))); - /// buffers[0] is a null bitmap and buffers[1] are actual values - std::shared_ptr buffer = chunk.data()->buffers[1]; - - for (size_t bool_i = 0; bool_i != static_cast(chunk.length()); ++bool_i) - column_data[bool_i] = chunk.Value(bool_i); - } -} - -/// Arrow stores Parquet::DATE in Int32, while ClickHouse stores Date in UInt16. Therefore, it should be checked before saving -void ParquetBlockInputStream::fillColumnWithDate32Data(std::shared_ptr & arrow_column, MutableColumnPtr & internal_column) -{ - PaddedPODArray & column_data = static_cast &>(*internal_column).getData(); - column_data.reserve(arrow_column->length()); - - for (size_t chunk_i = 0; chunk_i != static_cast(arrow_column->data()->num_chunks()); ++chunk_i) - { - arrow::Date32Array & chunk = static_cast(*(arrow_column->data()->chunk(chunk_i))); - - for (size_t value_i = 0; value_i != static_cast(chunk.length()); ++value_i) - { - UInt32 days_num = static_cast(chunk.Value(value_i)); - if (days_num > DATE_LUT_MAX_DAY_NUM) - { - // TODO: will it rollback correctly? - throw Exception( - "Input value " + std::to_string(days_num) + " of a column \"" + arrow_column->name() + "\" is greater than " - "max allowed Date value, which is " + std::to_string(DATE_LUT_MAX_DAY_NUM) - ); - } - - column_data.emplace_back(days_num); - } - } -} - -/// Creates a null bytemap from arrow's null bitmap -void ParquetBlockInputStream::fillByteMapFromArrowColumn(std::shared_ptr & arrow_column, MutableColumnPtr & bytemap) -{ - PaddedPODArray & bytemap_data = static_cast &>(*bytemap).getData(); - bytemap_data.reserve(arrow_column->length()); - - for (size_t chunk_i = 0; chunk_i != static_cast(arrow_column->data()->num_chunks()); ++chunk_i) - { - std::shared_ptr chunk = arrow_column->data()->chunk(chunk_i); - - for (size_t value_i = 0; value_i != static_cast(chunk->length()); ++value_i) - bytemap_data.emplace_back(chunk->IsNull(value_i)); - } -} - -#define FOR_ARROW_NUMERIC_TYPES(M) \ - M(arrow::Type::UINT8, UInt8) \ - M(arrow::Type::INT8, Int8) \ - M(arrow::Type::UINT16, UInt16) \ - M(arrow::Type::INT16, Int16) \ - M(arrow::Type::UINT32, UInt32) \ - M(arrow::Type::INT32, Int32) \ - M(arrow::Type::UINT64, UInt64) \ - M(arrow::Type::INT64, Int64) \ - M(arrow::Type::FLOAT, Float32) \ - M(arrow::Type::DOUBLE, Float64) - - -using NameToColumnPtr = std::unordered_map>; - -const std::unordered_map> ParquetBlockInputStream::arrow_type_to_internal_type = { - {arrow::Type::UINT8, std::make_shared()}, - {arrow::Type::INT8, std::make_shared()}, - {arrow::Type::UINT16, std::make_shared()}, - {arrow::Type::INT16, std::make_shared()}, - {arrow::Type::UINT32, std::make_shared()}, - {arrow::Type::INT32, std::make_shared()}, - {arrow::Type::UINT64, std::make_shared()}, - {arrow::Type::INT64, std::make_shared()}, - {arrow::Type::FLOAT, std::make_shared()}, - {arrow::Type::DOUBLE, std::make_shared()}, - - {arrow::Type::BOOL, std::make_shared()}, - {arrow::Type::DATE32, std::make_shared()}, - - {arrow::Type::STRING, std::make_shared()}//, - // TODO: add other types that are convertable to internal ones: - // 0. ENUM? - // 1. UUID -> String - // 2. JSON -> String -}; - - -Block ParquetBlockInputStream::readImpl() -{ - Block res; - - if (istr.eof()) - return res; - - std::string file_data; - - { - WriteBufferFromString file_buffer(file_data); - copyData(istr, file_buffer); - } - - arrow::Buffer buffer(file_data); - // TODO: maybe use parquet::RandomAccessSource? - auto reader = parquet::ParquetFileReader::Open(std::make_shared<::arrow::io::BufferReader>(buffer)); - parquet::arrow::FileReader filereader(::arrow::default_memory_pool(), std::move(reader)); - std::shared_ptr table; - - // TODO: also catch a ParquetException thrown by filereader? - arrow::Status read_status = filereader.ReadTable(&table); - if (!read_status.ok()) - throw Exception("Error while reading parquet data: " + read_status.ToString()/*, ErrorCodes::TODO*/); - - if (0 == table->num_rows()) - throw Exception("Empty table in input data"/*, ErrorCodes::TODO*/); - - if (header.columns() > static_cast(table->num_columns())) - // TODO: What if some columns were not presented? Insert NULLs? What if a column is not nullable? - throw Exception("Number of columns is less than the table has" /*, ErrorCodes::TODO*/); - - - NameToColumnPtr name_to_column_ptr; - for (size_t i = 0; i != static_cast(table->num_columns()); ++i) - { - std::shared_ptr arrow_column = table->column(i); - name_to_column_ptr[arrow_column->name()] = arrow_column; - } - - for (size_t column_i = 0; column_i != header.columns(); ++column_i) - { - ColumnWithTypeAndName header_column = header.getByPosition(column_i); - - if (name_to_column_ptr.find(header_column.name) == name_to_column_ptr.end()) - // TODO: What if some columns were not presented? Insert NULLs? What if a column is not nullable? - throw Exception("Column \"" + header_column.name + "\" is not presented in input data" /*, ErrorCodes::TODO*/); - - std::shared_ptr arrow_column = name_to_column_ptr[header_column.name]; - arrow::Type::type arrow_type = arrow_column->type()->id(); - - if (arrow_type_to_internal_type.find(arrow_type) == arrow_type_to_internal_type.end()) - { - throw Exception( - "The type \"" + arrow_column->type()->name() + "\" of an input column \"" + arrow_column->name() + "\"" - " is not supported for conversion from a Parquet data format" - /*, ErrorCodes::TODO*/ - ); - } - - // TODO: check if a column is const? - if (!header_column.type->isNullable() && arrow_column->null_count()) - { - throw Exception("Can not insert NULL data into non-nullable column \"" + header_column.name + "\""/*, ErrorCodes::TODO*/); - } - - const bool target_column_is_nullable = header_column.type->isNullable() || arrow_column->null_count(); - - const DataTypePtr internal_nested_type = arrow_type_to_internal_type.at(arrow_type); - const DataTypePtr internal_type = target_column_is_nullable ? makeNullable(internal_nested_type) : internal_nested_type; - const std::string internal_nested_type_name = internal_nested_type->getName(); - - const DataTypePtr column_nested_type = - header_column.type->isNullable() - ? static_cast(header_column.type.get())->getNestedType() - : header_column.type; - - - const DataTypePtr column_type = header_column.type; - const std::string column_nested_type_name = column_nested_type->getName(); - - // TODO: can it be done with typeid_cast? - if (internal_nested_type_name != column_nested_type_name) - { - throw Exception( - "Input data type \"" + internal_nested_type_name + "\" for a column \"" + header_column.name + "\"" - " is not compatible with a column type \"" + column_nested_type_name + "\""/*, ErrorCodes::TODO*/ - ); - } - - ColumnWithTypeAndName column; - column.name = header_column.name; - column.type = internal_type; - - /// Data - MutableColumnPtr read_column = internal_nested_type->createColumn(); - - switch (arrow_type) - { - case arrow::Type::STRING: - fillColumnWithStringData(arrow_column, read_column); - break; - case arrow::Type::BOOL: - fillColumnWithBooleanData(arrow_column, read_column); - break; - case arrow::Type::DATE32: - fillColumnWithDate32Data(arrow_column, read_column); - break; -#define DISPATCH(ARROW_NUMERIC_TYPE, CPP_NUMERIC_TYPE) \ - case ARROW_NUMERIC_TYPE: \ - fillColumnWithNumericData(arrow_column, read_column); \ - break; - - FOR_ARROW_NUMERIC_TYPES(DISPATCH) -#undef DISPATCH - // TODO: support TIMESTAMP_MICROS and TIMESTAMP_MILLIS with truncated micro- and milliseconds? - // TODO: read JSON as a string? - // TODO: read UUID as a string? - default: - throw Exception("Unsupported parquet type \"" + arrow_column->type()->name() + "\""/*, ErrorCodes::TODO*/); - } - - if (column.type->isNullable()) - { - MutableColumnPtr null_bytemap = DataTypeUInt8().createColumn(); - fillByteMapFromArrowColumn(arrow_column, null_bytemap); - column.column = ColumnNullable::create(std::move(read_column), std::move(null_bytemap)); - } - else - { - column.column = std::move(read_column); - } - res.insert(std::move(column)); - } - - return res; -} - -} diff --git a/dbms/src/DataStreams/ParquetBlockInputStream.h b/dbms/src/DataStreams/ParquetBlockInputStream.h deleted file mode 100644 index 77d53340f86..00000000000 --- a/dbms/src/DataStreams/ParquetBlockInputStream.h +++ /dev/null @@ -1,43 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include -// TODO: refine includes -#include - -namespace DB -{ - -class ParquetBlockInputStream : public IProfilingBlockInputStream -{ -public: - ParquetBlockInputStream(ReadBuffer & istr_, const Block & header_); - - String getName() const override { return "Parquet"; } - Block getHeader() const override; - -protected: - Block readImpl() override; - -private: - ReadBuffer & istr; - Block header; - - static void fillColumnWithStringData(std::shared_ptr & arrow_column, MutableColumnPtr & internal_column); - static void fillColumnWithBooleanData(std::shared_ptr & arrow_column, MutableColumnPtr & internal_column); - static void fillColumnWithDate32Data(std::shared_ptr & arrow_column, MutableColumnPtr & internal_column); - template - static void fillColumnWithNumericData(std::shared_ptr & arrow_column, MutableColumnPtr & internal_column); - - static void fillByteMapFromArrowColumn(std::shared_ptr & arrow_column, MutableColumnPtr & bytemap); - - static const std::unordered_map> arrow_type_to_internal_type; - - // TODO: check that this class implements every part of its parent -}; - -} diff --git a/dbms/src/DataStreams/ParquetBlockOutputStream.cpp b/dbms/src/DataStreams/ParquetBlockOutputStream.cpp deleted file mode 100644 index 416bf02552d..00000000000 --- a/dbms/src/DataStreams/ParquetBlockOutputStream.cpp +++ /dev/null @@ -1,271 +0,0 @@ -// TODO: clean includes -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include - -namespace DB -{ - -ParquetBlockOutputStream::ParquetBlockOutputStream(WriteBuffer & ostr_, const Block & header_) - : ostr(ostr_) - , header(header_) -{ -} - -void ParquetBlockOutputStream::flush() -{ - ostr.next(); -} - -void checkAppendStatus(arrow::Status & append_status, const std::string & column_name) -{ - if (!append_status.ok()) - { - throw Exception( - "Error while building a parquet column \"" + column_name + "\": " + append_status.ToString()/*, - ErrorCodes::TODO*/ - ); - } -} - -void checkFinishStatus(arrow::Status & finish_status, const std::string & column_name) -{ - if (!finish_status.ok()) - { - throw Exception( - "Error while writing a parquet column \"" + column_name + "\": " + finish_status.ToString()/*, - ErrorCodes::TODO*/ - ); - } -} - -template -void ParquetBlockOutputStream::fillArrowArrayWithNumericColumnData( - ColumnPtr write_column, - std::shared_ptr & arrow_array, - const PaddedPODArray * null_bytemap -) { - const PaddedPODArray & internal_data = static_cast &>(*write_column).getData(); - ArrowBuilderType numeric_builder; - arrow::Status append_status; - - const UInt8 * arrow_null_bytemap_raw_ptr = nullptr; - PaddedPODArray arrow_null_bytemap; - if (null_bytemap) - { - /// Invert values since Arrow interprets 1 as a non-null value, while CH as a null - arrow_null_bytemap.reserve(null_bytemap->size()); - for (size_t i = 0; i != null_bytemap->size(); ++i) - arrow_null_bytemap.emplace_back(1 ^ (*null_bytemap)[i]); - - arrow_null_bytemap_raw_ptr = arrow_null_bytemap.data(); - } - - append_status = numeric_builder.AppendValues(internal_data.data(), internal_data.size(), arrow_null_bytemap_raw_ptr); - checkAppendStatus(append_status, write_column->getName()); - - arrow::Status finish_status = numeric_builder.Finish(&arrow_array); - checkFinishStatus(finish_status, write_column->getName()); -} - -void ParquetBlockOutputStream::fillArrowArrayWithStringColumnData( - ColumnPtr write_column, - std::shared_ptr & arrow_array, - const PaddedPODArray * null_bytemap -) { - const ColumnString & internal_column = static_cast(*write_column); - arrow::StringBuilder string_builder; - arrow::Status append_status; - - for (size_t string_i = 0; string_i != internal_column.size(); ++string_i) - { - if (null_bytemap && (*null_bytemap)[string_i]) - { - append_status = string_builder.AppendNull(); - } - else - { - StringRef string_ref = internal_column.getDataAt(string_i); - append_status = string_builder.Append(string_ref.data, string_ref.size); - } - - checkAppendStatus(append_status, write_column->getName()); - } - - arrow::Status finish_status = string_builder.Finish(&arrow_array); - checkFinishStatus(finish_status, write_column->getName()); -} - -void ParquetBlockOutputStream::fillArrowArrayWithDateColumnData( - ColumnPtr write_column, - std::shared_ptr & arrow_array, - const PaddedPODArray * null_bytemap -) { - const PaddedPODArray & internal_data = static_cast &>(*write_column).getData(); - arrow::Date32Builder date32_builder; - arrow::Status append_status; - - for (size_t value_i = 0; value_i != internal_data.size(); ++value_i) - { - if (null_bytemap && (*null_bytemap)[value_i]) - append_status = date32_builder.AppendNull(); - else - /// Implicitly converts UInt16 to Int32 - append_status = date32_builder.Append(internal_data[value_i]); - - checkAppendStatus(append_status, write_column->getName()); - } - - arrow::Status finish_status = date32_builder.Finish(&arrow_array); - checkFinishStatus(finish_status, write_column->getName()); -} - -#define FOR_INTERNAL_NUMERIC_TYPES(M) \ - M(UInt8, arrow::UInt8Builder) \ - M(Int8, arrow::Int8Builder) \ - M(UInt16, arrow::UInt16Builder) \ - M(Int16, arrow::Int16Builder) \ - M(UInt32, arrow::UInt32Builder) \ - M(Int32, arrow::Int32Builder) \ - M(UInt64, arrow::UInt64Builder) \ - M(Int64, arrow::Int64Builder) \ - M(Float32, arrow::FloatBuilder) \ - M(Float64, arrow::DoubleBuilder) - -const std::unordered_map> ParquetBlockOutputStream::internal_type_to_arrow_type = { - {"UInt8", arrow::uint8()}, - {"Int8", arrow::int8()}, - {"UInt16", arrow::uint16()}, - {"Int16", arrow::int16()}, - {"UInt32", arrow::uint32()}, - {"Int32", arrow::int32()}, - {"UInt64", arrow::uint64()}, - {"Int64", arrow::int64()}, - {"Float32", arrow::float32()}, - {"Float64", arrow::float64()}, - - {"Date", arrow::date32()}, - - // TODO: ClickHouse can actually store non-utf8 strings! - {"String", arrow::utf8()}//, - // TODO: add other types: - // 1. FixedString - // 2. DateTime -}; - -const PaddedPODArray * extractNullBytemapPtr(ColumnPtr column) -{ - ColumnPtr null_column = static_cast(*column).getNullMapColumnPtr(); - const PaddedPODArray & null_bytemap = static_cast &>(*null_column).getData(); - return &null_bytemap; -} - -void ParquetBlockOutputStream::write(const Block & block) -{ - block.checkNumberOfRows(); - - const size_t columns_num = block.columns(); - - /// For arrow::Schema and arrow::Table creation - std::vector> arrow_fields; - std::vector> arrow_arrays; - arrow_fields.reserve(columns_num); - arrow_arrays.reserve(columns_num); - - for (size_t column_i = 0; column_i < columns_num; ++column_i) - { - // TODO: constructed every iteration - const ColumnWithTypeAndName & column = block.safeGetByPosition(column_i); - - const bool is_column_nullable = column.type->isNullable(); - const DataTypePtr column_nested_type = - is_column_nullable - ? static_cast(column.type.get())->getNestedType() - : column.type; - const DataTypePtr column_type = column.type; - // TODO: do not mix std::string and String - const std::string column_nested_type_name = column_nested_type->getName(); - - if (internal_type_to_arrow_type.find(column_nested_type_name) == internal_type_to_arrow_type.end()) - { - throw Exception( - "The type \"" + column_nested_type_name + "\" of a column \"" + column.name + "\"" - " is not supported for conversion into a Parquet data format" - /*, ErrorCodes::TODO*/ - ); - } - - arrow_fields.emplace_back(new arrow::Field( - column.name, - internal_type_to_arrow_type.at(column_nested_type_name), - is_column_nullable - )); - std::shared_ptr arrow_array; - - ColumnPtr nested_column = is_column_nullable ? static_cast(*column.column).getNestedColumnPtr() : column.column; - const PaddedPODArray * null_bytemap = is_column_nullable ? extractNullBytemapPtr(column.column) : nullptr; - - // TODO: use typeid_cast - if ("String" == column_nested_type_name) - { - fillArrowArrayWithStringColumnData(nested_column, arrow_array, null_bytemap); - } - else if ("Date" == column_nested_type_name) - { - fillArrowArrayWithDateColumnData(nested_column, arrow_array, null_bytemap); - } -#define DISPATCH(CPP_NUMERIC_TYPE, ARROW_BUILDER_TYPE) \ - else if (#CPP_NUMERIC_TYPE == column_nested_type_name) \ - { \ - fillArrowArrayWithNumericColumnData(nested_column, arrow_array, null_bytemap); \ - } - - FOR_INTERNAL_NUMERIC_TYPES(DISPATCH) -#undef DISPATCH - // TODO: there are also internal types that are convertable to parquet/arrow once: - // 1. FixedString(N) - // 2. DateTime - else - { - throw Exception( - "Internal type \"" + column_nested_type_name + "\" of a column \"" + column.name + "\"" - " is not supported for conversion into a Parquet data format"/*, ErrorCodes::TODO*/ - ); - } - - arrow_arrays.emplace_back(std::move(arrow_array)); - } - - std::shared_ptr arrow_schema = std::make_shared(std::move(arrow_fields)); - std::shared_ptr arrow_table = arrow::Table::Make(arrow_schema, arrow_arrays); - - // TODO: get rid of extra copying - std::shared_ptr sink = std::make_shared(); - - // TODO: calculate row_group_size depending on a number of rows and table size - - arrow::Status write_status = parquet::arrow::WriteTable( - *arrow_table, arrow::default_memory_pool(), sink, - /* row_group_size = */arrow_table->num_rows(), parquet::default_writer_properties(), - parquet::arrow::default_arrow_writer_properties() - ); - if (!write_status.ok()) - throw Exception("Error while writing a table: " + write_status.ToString()/*, ErrorCodes::TODO*/); - - std::shared_ptr table_buffer = sink->GetBuffer(); - writeString(reinterpret_cast(table_buffer->data()), table_buffer->size(), ostr); -} - -}; diff --git a/dbms/src/DataStreams/ParquetBlockOutputStream.h b/dbms/src/DataStreams/ParquetBlockOutputStream.h deleted file mode 100644 index 896b73fba03..00000000000 --- a/dbms/src/DataStreams/ParquetBlockOutputStream.h +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once - -#include -#include - -namespace DB -{ - - -class ParquetBlockOutputStream : public IBlockOutputStream -{ -public: - ParquetBlockOutputStream(WriteBuffer & ostr_, const Block & header_); - - Block getHeader() const override { return header; } - void write(const Block & block) override; - void flush() override; - - String getContentType() const override { return "application/octet-stream"; } - -private: - WriteBuffer & ostr; - Block header; - - static void fillArrowArrayWithDateColumnData(ColumnPtr write_column, std::shared_ptr & arrow_array, - const PaddedPODArray * null_bytemap); - static void fillArrowArrayWithStringColumnData(ColumnPtr write_column, std::shared_ptr & arrow_array, - const PaddedPODArray * null_bytemap); - template - static void fillArrowArrayWithNumericColumnData(ColumnPtr write_column, std::shared_ptr & arrow_array, - const PaddedPODArray * null_bytemap); - - static const std::unordered_map> internal_type_to_arrow_type; -}; - -} diff --git a/dbms/src/DataTypes/DataTypesDecimal.h b/dbms/src/DataTypes/DataTypesDecimal.h index 89841b762c1..7159750c36b 100644 --- a/dbms/src/DataTypes/DataTypesDecimal.h +++ b/dbms/src/DataTypes/DataTypesDecimal.h @@ -80,9 +80,9 @@ public: scale(scale_) { if (unlikely(precision < 1 || precision > maxPrecision())) - throw Exception("Precision is out of bounds", ErrorCodes::ARGUMENT_OUT_OF_BOUND); + throw Exception("Precision " + std::to_string(precision) + " is out of bounds", ErrorCodes::ARGUMENT_OUT_OF_BOUND); if (unlikely(scale < 0 || static_cast(scale) > maxPrecision())) - throw Exception("Scale is out of bounds", ErrorCodes::ARGUMENT_OUT_OF_BOUND); + throw Exception("Scale " + std::to_string(scale) + " is out of bounds", ErrorCodes::ARGUMENT_OUT_OF_BOUND); } const char * getFamilyName() const override { return "Decimal"; } diff --git a/dbms/src/Formats/FormatFactory.cpp b/dbms/src/Formats/FormatFactory.cpp index 9b97d8464ee..c17b9422f2d 100644 --- a/dbms/src/Formats/FormatFactory.cpp +++ b/dbms/src/Formats/FormatFactory.cpp @@ -69,6 +69,7 @@ BlockOutputStreamPtr FormatFactory::getOutput(const String & name, WriteBuffer & format_settings.pretty.max_column_pad_width = settings.output_format_pretty_max_column_pad_width; format_settings.pretty.color = settings.output_format_pretty_color; format_settings.write_statistics = settings.output_format_write_statistics; + format_settings.parquet.row_group_size = settings.output_format_parquet_row_group_size; /** Materialization is needed, because formats can use the functions `IDataType`, * which only work with full columns. @@ -111,6 +112,8 @@ void registerInputFormatTSKV(FormatFactory & factory); void registerOutputFormatTSKV(FormatFactory & factory); void registerInputFormatJSONEachRow(FormatFactory & factory); void registerOutputFormatJSONEachRow(FormatFactory & factory); +void registerInputFormatParquet(FormatFactory & factory); +void registerOutputFormatParquet(FormatFactory & factory); void registerOutputFormatProtobuf(FormatFactory & factory); /// Output only (presentational) formats. @@ -149,6 +152,8 @@ FormatFactory::FormatFactory() registerOutputFormatJSONEachRow(*this); registerOutputFormatProtobuf(*this); registerInputFormatCapnProto(*this); + registerInputFormatParquet(*this); + registerOutputFormatParquet(*this); registerOutputFormatPretty(*this); registerOutputFormatPrettyCompact(*this); diff --git a/dbms/src/Formats/FormatSettings.h b/dbms/src/Formats/FormatSettings.h index e8aaef290b4..a2d787193f5 100644 --- a/dbms/src/Formats/FormatSettings.h +++ b/dbms/src/Formats/FormatSettings.h @@ -61,6 +61,12 @@ struct FormatSettings UInt64 input_allow_errors_num = 0; Float32 input_allow_errors_ratio = 0; + + struct Parquet + { + UInt64 row_group_size = 1000000; + } parquet; + }; } diff --git a/dbms/src/Formats/ODBCDriver2BlockOutputStream.cpp b/dbms/src/Formats/ODBCDriver2BlockOutputStream.cpp index 0d2ba8b8a53..64d2216dd0e 100644 --- a/dbms/src/Formats/ODBCDriver2BlockOutputStream.cpp +++ b/dbms/src/Formats/ODBCDriver2BlockOutputStream.cpp @@ -4,10 +4,6 @@ #include #include - -#include - - namespace DB { ODBCDriver2BlockOutputStream::ODBCDriver2BlockOutputStream( diff --git a/dbms/src/Formats/ParquetBlockInputStream.cpp b/dbms/src/Formats/ParquetBlockInputStream.cpp new file mode 100644 index 00000000000..d738ca73261 --- /dev/null +++ b/dbms/src/Formats/ParquetBlockInputStream.cpp @@ -0,0 +1,497 @@ +#include + +#if USE_PARQUET +# include "ParquetBlockInputStream.h" + +# include +# include +# include +// TODO: clear includes +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +//# include +//# include +# include +//# include +//# include +# include + +# include // REMOVE ME + +namespace DB +{ +namespace ErrorCodes +{ + extern const int UNKNOWN_TYPE; + extern const int VALUE_IS_OUT_OF_RANGE_OF_DATA_TYPE; + extern const int CANNOT_READ_ALL_DATA; + extern const int EMPTY_DATA_PASSED; + extern const int SIZES_OF_COLUMNS_DOESNT_MATCH; + extern const int CANNOT_CONVERT_TYPE; + extern const int CANNOT_INSERT_NULL_IN_ORDINARY_COLUMN; + extern const int THERE_IS_NO_COLUMN; +} + +ParquetBlockInputStream::ParquetBlockInputStream(ReadBuffer & istr_, const Block & header_, const Context & context_) + : istr{istr_}, header{header_}, context{context_} +{ +} + +Block ParquetBlockInputStream::getHeader() const +{ + return header; +} + +/// Inserts numeric data right into internal column data to reduce an overhead +template > +void fillColumnWithNumericData(std::shared_ptr & arrow_column, MutableColumnPtr & internal_column) +{ + auto & column_data = static_cast(*internal_column).getData(); + column_data.reserve(arrow_column->length()); + + for (size_t chunk_i = 0, num_chunks = static_cast(arrow_column->data()->num_chunks()); chunk_i < num_chunks; ++chunk_i) + { + std::shared_ptr chunk = arrow_column->data()->chunk(chunk_i); + /// buffers[0] is a null bitmap and buffers[1] are actual values + std::shared_ptr buffer = chunk->data()->buffers[1]; + + const auto * raw_data = reinterpret_cast(buffer->data()); + column_data.insert_assume_reserved(raw_data, raw_data + chunk->length()); + } +} + +/// Inserts chars and offsets right into internal column data to reduce an overhead. +/// Internal offsets are shifted by one to the right in comparison with Arrow ones. So the last offset should map to the end of all chars. +/// Also internal strings are null terminated. +void fillColumnWithStringData(std::shared_ptr & arrow_column, MutableColumnPtr & internal_column) +{ + PaddedPODArray & column_chars_t = static_cast(*internal_column).getChars(); + PaddedPODArray & column_offsets = static_cast(*internal_column).getOffsets(); + + size_t chars_t_size = 0; + for (size_t chunk_i = 0, num_chunks = static_cast(arrow_column->data()->num_chunks()); chunk_i < num_chunks; ++chunk_i) + { + arrow::BinaryArray & chunk = static_cast(*(arrow_column->data()->chunk(chunk_i))); + const size_t chunk_length = chunk.length(); + + chars_t_size += chunk.value_offset(chunk_length - 1) + chunk.value_length(chunk_length - 1); + chars_t_size += chunk_length; /// additional space for null bytes + } + + column_chars_t.reserve(chars_t_size); + column_offsets.reserve(arrow_column->length()); + + for (size_t chunk_i = 0, num_chunks = static_cast(arrow_column->data()->num_chunks()); chunk_i < num_chunks; ++chunk_i) + { + arrow::BinaryArray & chunk = static_cast(*(arrow_column->data()->chunk(chunk_i))); + std::shared_ptr buffer = chunk.value_data(); + const size_t chunk_length = chunk.length(); + + for (size_t offset_i = 0; offset_i != chunk_length; ++offset_i) + { + if (!chunk.IsNull(offset_i) && buffer) + { + const UInt8 * raw_data = buffer->data() + chunk.value_offset(offset_i); + column_chars_t.insert_assume_reserved(raw_data, raw_data + chunk.value_length(offset_i)); + } + column_chars_t.emplace_back('\0'); + + column_offsets.emplace_back(column_chars_t.size()); + } + } +} + +void fillColumnWithBooleanData(std::shared_ptr & arrow_column, MutableColumnPtr & internal_column) +{ + auto & column_data = static_cast &>(*internal_column).getData(); + column_data.resize(arrow_column->length()); + + for (size_t chunk_i = 0, num_chunks = static_cast(arrow_column->data()->num_chunks()); chunk_i < num_chunks; ++chunk_i) + { + arrow::BooleanArray & chunk = static_cast(*(arrow_column->data()->chunk(chunk_i))); + /// buffers[0] is a null bitmap and buffers[1] are actual values + std::shared_ptr buffer = chunk.data()->buffers[1]; + + for (size_t bool_i = 0; bool_i != static_cast(chunk.length()); ++bool_i) + column_data[bool_i] = chunk.Value(bool_i); + } +} + +/// Arrow stores Parquet::DATE in Int32, while ClickHouse stores Date in UInt16. Therefore, it should be checked before saving +void fillColumnWithDate32Data(std::shared_ptr & arrow_column, MutableColumnPtr & internal_column) +{ + PaddedPODArray & column_data = static_cast &>(*internal_column).getData(); + column_data.reserve(arrow_column->length()); + + for (size_t chunk_i = 0, num_chunks = static_cast(arrow_column->data()->num_chunks()); chunk_i < num_chunks; ++chunk_i) + { + arrow::Date32Array & chunk = static_cast(*(arrow_column->data()->chunk(chunk_i))); + + for (size_t value_i = 0, length = static_cast(chunk.length()); value_i < length; ++value_i) + { + UInt32 days_num = static_cast(chunk.Value(value_i)); + if (days_num > DATE_LUT_MAX_DAY_NUM) + { + // TODO: will it rollback correctly? + throw Exception{"Input value " + std::to_string(days_num) + " of a column \"" + arrow_column->name() + + "\" is greater than " + "max allowed Date value, which is " + + std::to_string(DATE_LUT_MAX_DAY_NUM), + ErrorCodes::VALUE_IS_OUT_OF_RANGE_OF_DATA_TYPE}; + } + + column_data.emplace_back(days_num); + } + } +} + +/// Arrow stores Parquet::DATETIME in Int64, while ClickHouse stores DateTime in UInt32. Therefore, it should be checked before saving +void fillColumnWithDate64Data(std::shared_ptr & arrow_column, MutableColumnPtr & internal_column) +{ + auto & column_data = static_cast &>(*internal_column).getData(); + column_data.reserve(arrow_column->length()); + + for (size_t chunk_i = 0, num_chunks = static_cast(arrow_column->data()->num_chunks()); chunk_i < num_chunks; ++chunk_i) + { + auto & chunk = static_cast(*(arrow_column->data()->chunk(chunk_i))); + for (size_t value_i = 0, length = static_cast(chunk.length()); value_i < length; ++value_i) + { + auto timestamp = static_cast(chunk.Value(value_i) / 1000); // Always? in ms + column_data.emplace_back(timestamp); + } + } +} + +void fillColumnWithTimestampData(std::shared_ptr & arrow_column, MutableColumnPtr & internal_column) +{ + auto & column_data = static_cast &>(*internal_column).getData(); + column_data.reserve(arrow_column->length()); + + for (size_t chunk_i = 0, num_chunks = static_cast(arrow_column->data()->num_chunks()); chunk_i < num_chunks; ++chunk_i) + { + auto & chunk = static_cast(*(arrow_column->data()->chunk(chunk_i))); + const auto & type = static_cast(*chunk.type()); + + UInt32 divide = 1; + const auto unit = type.unit(); + switch (unit) + { + case arrow::TimeUnit::SECOND: + divide = 1; + break; + case arrow::TimeUnit::MILLI: + divide = 1000; + break; + case arrow::TimeUnit::MICRO: + divide = 1000000; + break; + case arrow::TimeUnit::NANO: + divide = 1000000000; + break; + } + + for (size_t value_i = 0, length = static_cast(chunk.length()); value_i < length; ++value_i) + { + auto timestamp = static_cast(chunk.Value(value_i) / divide); // ms! TODO: check other 's' 'ns' ... + column_data.emplace_back(timestamp); + } + } +} + +void fillColumnWithDecimalData(std::shared_ptr & arrow_column, MutableColumnPtr & internal_column) +{ + auto & column = static_cast &>(*internal_column); + auto & column_data = column.getData(); + column_data.reserve(arrow_column->length()); + + for (size_t chunk_i = 0, num_chunks = static_cast(arrow_column->data()->num_chunks()); chunk_i < num_chunks; ++chunk_i) + { + auto & chunk = static_cast(*(arrow_column->data()->chunk(chunk_i))); + for (size_t value_i = 0, length = static_cast(chunk.length()); value_i < length; ++value_i) + { + column_data.emplace_back(chunk.IsNull(value_i) ? Decimal128(0) : *reinterpret_cast(chunk.Value(value_i))); // TODO: copy column + } + } +} + +/// Creates a null bytemap from arrow's null bitmap +void fillByteMapFromArrowColumn(std::shared_ptr & arrow_column, MutableColumnPtr & bytemap) +{ + PaddedPODArray & bytemap_data = static_cast &>(*bytemap).getData(); + bytemap_data.reserve(arrow_column->length()); + + for (size_t chunk_i = 0; chunk_i != static_cast(arrow_column->data()->num_chunks()); ++chunk_i) + { + std::shared_ptr chunk = arrow_column->data()->chunk(chunk_i); + + for (size_t value_i = 0; value_i != static_cast(chunk->length()); ++value_i) + bytemap_data.emplace_back(chunk->IsNull(value_i)); + } +} + +# define FOR_ARROW_NUMERIC_TYPES(M) \ + M(arrow::Type::UINT8, UInt8) \ + M(arrow::Type::INT8, Int8) \ + M(arrow::Type::UINT16, UInt16) \ + M(arrow::Type::INT16, Int16) \ + M(arrow::Type::UINT32, UInt32) \ + M(arrow::Type::INT32, Int32) \ + M(arrow::Type::UINT64, UInt64) \ + M(arrow::Type::INT64, Int64) \ + M(arrow::Type::FLOAT, Float32) \ + M(arrow::Type::DOUBLE, Float64) +//M(arrow::Type::HALF_FLOAT, Float32) // TODO + + +using NameToColumnPtr = std::unordered_map>; + +const std::unordered_map> arrow_type_to_internal_type = { + //{arrow::Type::DECIMAL, std::make_shared()}, + {arrow::Type::UINT8, std::make_shared()}, + {arrow::Type::INT8, std::make_shared()}, + {arrow::Type::UINT16, std::make_shared()}, + {arrow::Type::INT16, std::make_shared()}, + {arrow::Type::UINT32, std::make_shared()}, + {arrow::Type::INT32, std::make_shared()}, + {arrow::Type::UINT64, std::make_shared()}, + {arrow::Type::INT64, std::make_shared()}, + {arrow::Type::HALF_FLOAT, std::make_shared()}, + {arrow::Type::FLOAT, std::make_shared()}, + {arrow::Type::DOUBLE, std::make_shared()}, + + {arrow::Type::BOOL, std::make_shared()}, + //{arrow::Type::DATE32, std::make_shared()}, + {arrow::Type::DATE32, std::make_shared()}, + //{arrow::Type::DATE32, std::make_shared()}, + {arrow::Type::DATE64, std::make_shared()}, + {arrow::Type::TIMESTAMP, std::make_shared()}, + //{arrow::Type::TIME32, std::make_shared()}, + + + {arrow::Type::STRING, std::make_shared()}, + {arrow::Type::BINARY, std::make_shared()}, + //{arrow::Type::FIXED_SIZE_BINARY, std::make_shared()}, + //{arrow::Type::UUID, std::make_shared()}, + + + // TODO: add other types that are convertable to internal ones: + // 0. ENUM? + // 1. UUID -> String + // 2. JSON -> String + // Full list of types: contrib/arrow/cpp/src/arrow/type.h +}; + + +Block ParquetBlockInputStream::readImpl() +{ + Block res; + + if (!istr.eof()) + { + /* + First we load whole stream into string (its very bad and limiting .parquet file size to half? of RAM) + Then producing blocks for every row_group (dont load big .parquet files with one row_group - it can eat x10+ RAM from .parquet file size) + */ + + if (row_group_current < row_group_total) + throw Exception{"Got new data, but data from previous chunks not readed " + std::to_string(row_group_current) + "/" + std::to_string(row_group_total), ErrorCodes::CANNOT_READ_ALL_DATA}; + + file_data.clear(); + { + WriteBufferFromString file_buffer(file_data); + copyData(istr, file_buffer); + } + + buffer = std::make_unique(file_data); + // TODO: maybe use parquet::RandomAccessSource? + auto reader = parquet::ParquetFileReader::Open(std::make_shared<::arrow::io::BufferReader>(*buffer)); + file_reader = std::make_unique(::arrow::default_memory_pool(), std::move(reader)); + row_group_total = file_reader->num_row_groups(); + row_group_current = 0; + } + //DUMP(row_group_current, row_group_total); + if (row_group_current >= row_group_total) + return res; + + // TODO: also catch a ParquetException thrown by filereader? + //arrow::Status read_status = filereader.ReadTable(&table); + std::shared_ptr table; + arrow::Status read_status = file_reader->ReadRowGroup(row_group_current, &table); + + if (!read_status.ok()) + throw Exception{"Error while reading parquet data: " + read_status.ToString(), ErrorCodes::CANNOT_READ_ALL_DATA}; + + if (0 == table->num_rows()) + throw Exception{"Empty table in input data", ErrorCodes::EMPTY_DATA_PASSED}; + + if (header.columns() > static_cast(table->num_columns())) + // TODO: What if some columns were not presented? Insert NULLs? What if a column is not nullable? + throw Exception{"Number of columns is less than the table has", ErrorCodes::SIZES_OF_COLUMNS_DOESNT_MATCH}; + + ++row_group_current; + + NameToColumnPtr name_to_column_ptr; + for (size_t i = 0, num_columns = static_cast(table->num_columns()); i < num_columns; ++i) + { + std::shared_ptr arrow_column = table->column(i); + name_to_column_ptr[arrow_column->name()] = arrow_column; + } + + for (size_t column_i = 0, columns = header.columns(); column_i < columns; ++column_i) + { + ColumnWithTypeAndName header_column = header.getByPosition(column_i); + + if (name_to_column_ptr.find(header_column.name) == name_to_column_ptr.end()) + // TODO: What if some columns were not presented? Insert NULLs? What if a column is not nullable? + throw Exception{"Column \"" + header_column.name + "\" is not presented in input data", ErrorCodes::THERE_IS_NO_COLUMN}; + + std::shared_ptr arrow_column = name_to_column_ptr[header_column.name]; + arrow::Type::type arrow_type = arrow_column->type()->id(); + + // TODO: check if a column is const? + if (!header_column.type->isNullable() && arrow_column->null_count()) + { + throw Exception{"Can not insert NULL data into non-nullable column \"" + header_column.name + "\"", + ErrorCodes::CANNOT_INSERT_NULL_IN_ORDINARY_COLUMN}; + } + + const bool target_column_is_nullable = header_column.type->isNullable() || arrow_column->null_count(); + + DataTypePtr internal_nested_type; + + if (arrow_type == arrow::Type::DECIMAL) + { + const auto decimal_type = static_cast(arrow_column->type().get()); + internal_nested_type = std::make_shared>(decimal_type->precision(), decimal_type->scale()); + } + else if (arrow_type_to_internal_type.find(arrow_type) != arrow_type_to_internal_type.end()) + { + internal_nested_type = arrow_type_to_internal_type.at(arrow_type); + } + else + { + throw Exception{"The type \"" + arrow_column->type()->name() + "\" of an input column \"" + arrow_column->name() + + "\" is not supported for conversion from a Parquet data format", + ErrorCodes::CANNOT_CONVERT_TYPE}; + } + + const DataTypePtr internal_type = target_column_is_nullable ? makeNullable(internal_nested_type) : internal_nested_type; + const std::string internal_nested_type_name = internal_nested_type->getName(); + + const DataTypePtr column_nested_type = header_column.type->isNullable() + ? static_cast(header_column.type.get())->getNestedType() + : header_column.type; + + const DataTypePtr column_type = header_column.type; + + const std::string column_nested_type_name = column_nested_type->getName(); + + ColumnWithTypeAndName column; + column.name = header_column.name; + column.type = internal_type; + + /// Data + MutableColumnPtr read_column = internal_nested_type->createColumn(); + switch (arrow_type) + { + case arrow::Type::STRING: + case arrow::Type::BINARY: + //case arrow::Type::FIXED_SIZE_BINARY: + fillColumnWithStringData(arrow_column, read_column); + break; + case arrow::Type::BOOL: + fillColumnWithBooleanData(arrow_column, read_column); + break; + case arrow::Type::DATE32: + fillColumnWithDate32Data(arrow_column, read_column); + break; + case arrow::Type::DATE64: + fillColumnWithDate64Data(arrow_column, read_column); + break; + case arrow::Type::TIMESTAMP: + fillColumnWithTimestampData(arrow_column, read_column); + break; + case arrow::Type::DECIMAL: + //fillColumnWithNumericData>(arrow_column, read_column); // Have problems with trash values under NULL, but faster + fillColumnWithDecimalData(arrow_column, read_column /*, internal_nested_type*/); + break; +# define DISPATCH(ARROW_NUMERIC_TYPE, CPP_NUMERIC_TYPE) \ + case ARROW_NUMERIC_TYPE: \ + fillColumnWithNumericData(arrow_column, read_column); \ + break; + + FOR_ARROW_NUMERIC_TYPES(DISPATCH) +# undef DISPATCH + // TODO: support TIMESTAMP_MICROS and TIMESTAMP_MILLIS with truncated micro- and milliseconds? + // TODO: read JSON as a string? + // TODO: read UUID as a string? + default: + throw Exception{"Unsupported parquet type \"" + arrow_column->type()->name() + "\" of an input column \"" + + arrow_column->name() + "\"", + ErrorCodes::UNKNOWN_TYPE}; + } + + if (column.type->isNullable()) + { + MutableColumnPtr null_bytemap = DataTypeUInt8().createColumn(); + fillByteMapFromArrowColumn(arrow_column, null_bytemap); + column.column = ColumnNullable::create(std::move(read_column), std::move(null_bytemap)); + } + else + { + column.column = std::move(read_column); + } + + column.column = castColumn(column, column_type, context); + column.type = column_type; + + res.insert(std::move(column)); + } + + return res; +} + +void registerInputFormatParquet(FormatFactory & factory) +{ + factory.registerInputFormat( + "Parquet", + [](ReadBuffer & buf, + const Block & sample, + const Context & context, + size_t /*max_block_size */, + const FormatSettings & /* settings */) { return std::make_shared(buf, sample, context); }); +} + +} + +#else + +namespace DB +{ +class FormatFactory; +void registerInputFormatParquet(FormatFactory &) +{ +} +} + +#endif diff --git a/dbms/src/Formats/ParquetBlockInputStream.h b/dbms/src/Formats/ParquetBlockInputStream.h new file mode 100644 index 00000000000..d628c2ad2cb --- /dev/null +++ b/dbms/src/Formats/ParquetBlockInputStream.h @@ -0,0 +1,46 @@ +#pragma once + +#include +#if USE_PARQUET +# include +//# include +//# include +//# include + + +namespace parquet { namespace arrow { class FileReader; } } +namespace arrow { class Buffer; } + +namespace DB +{ +class Context; + +class ParquetBlockInputStream : public IBlockInputStream +{ +public: + ParquetBlockInputStream(ReadBuffer & istr_, const Block & header_, const Context & context_); + + String getName() const override { return "Parquet"; } + Block getHeader() const override; + +protected: + Block readImpl() override; + +private: + ReadBuffer & istr; + Block header; + + // TODO: check that this class implements every part of its parent + + const Context & context; + + std::unique_ptr file_reader; + std::string file_data; + std::unique_ptr buffer; + int row_group_total = 0; + int row_group_current = 0; +}; + +} + +#endif diff --git a/dbms/src/Formats/ParquetBlockOutputStream.cpp b/dbms/src/Formats/ParquetBlockOutputStream.cpp new file mode 100644 index 00000000000..744a50250da --- /dev/null +++ b/dbms/src/Formats/ParquetBlockOutputStream.cpp @@ -0,0 +1,453 @@ +#include +#if USE_PARQUET +# include "ParquetBlockOutputStream.h" + +// TODO: clean includes +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include + +# include // REMOVE ME + +namespace DB +{ +namespace ErrorCodes +{ + extern const int UNKNOWN_EXCEPTION; + extern const int UNKNOWN_TYPE; +} + +ParquetBlockOutputStream::ParquetBlockOutputStream(WriteBuffer & ostr, const Block & header, const FormatSettings & format_settings) : ostr{ostr}, header{header}, format_settings{format_settings} +{ +} + +void ParquetBlockOutputStream::flush() +{ + ostr.next(); +} + +void checkStatus(arrow::Status & status, const std::string & column_name) +{ + if (!status.ok()) + throw Exception{"Error with a parquet column \"" + column_name + "\": " + status.ToString(), ErrorCodes::UNKNOWN_EXCEPTION}; +} + +template +void fillArrowArrayWithNumericColumnData( + ColumnPtr write_column, std::shared_ptr & arrow_array, const PaddedPODArray * null_bytemap) +{ + const PaddedPODArray & internal_data = static_cast &>(*write_column).getData(); + ArrowBuilderType builder; + arrow::Status status; + + const UInt8 * arrow_null_bytemap_raw_ptr = nullptr; + PaddedPODArray arrow_null_bytemap; + if (null_bytemap) + { + /// Invert values since Arrow interprets 1 as a non-null value, while CH as a null + arrow_null_bytemap.reserve(null_bytemap->size()); + for (size_t i = 0, size = null_bytemap->size(); i < size; ++i) + arrow_null_bytemap.emplace_back(1 ^ (*null_bytemap)[i]); + + arrow_null_bytemap_raw_ptr = arrow_null_bytemap.data(); + } + + status = builder.AppendValues(internal_data.data(), internal_data.size(), arrow_null_bytemap_raw_ptr); + checkStatus(status, write_column->getName()); + + status = builder.Finish(&arrow_array); + checkStatus(status, write_column->getName()); +} + +template +void fillArrowArrayWithStringColumnData( + ColumnPtr write_column, std::shared_ptr & arrow_array, const PaddedPODArray * null_bytemap) +{ + const auto & internal_column = static_cast(*write_column); + arrow::StringBuilder builder; + arrow::Status status; + + for (size_t string_i = 0, size = internal_column.size(); string_i < size; ++string_i) + { + if (null_bytemap && (*null_bytemap)[string_i]) + { + status = builder.AppendNull(); + } + else + { + StringRef string_ref = internal_column.getDataAt(string_i); + status = builder.Append(string_ref.data, string_ref.size); + } + + checkStatus(status, write_column->getName()); + } + + status = builder.Finish(&arrow_array); + checkStatus(status, write_column->getName()); +} + +void fillArrowArrayWithDateColumnData( + ColumnPtr write_column, std::shared_ptr & arrow_array, const PaddedPODArray * null_bytemap) +{ + const PaddedPODArray & internal_data = static_cast &>(*write_column).getData(); + //arrow::Date32Builder date_builder; + arrow::UInt16Builder builder; + arrow::Status status; + + for (size_t value_i = 0, size = internal_data.size(); value_i < size; ++value_i) + { + if (null_bytemap && (*null_bytemap)[value_i]) + status = builder.AppendNull(); + else + /// Implicitly converts UInt16 to Int32 + status = builder.Append(internal_data[value_i]); + checkStatus(status, write_column->getName()); + } + + status = builder.Finish(&arrow_array); + checkStatus(status, write_column->getName()); +} + +void fillArrowArrayWithDateTimeColumnData( + ColumnPtr write_column, std::shared_ptr & arrow_array, const PaddedPODArray * null_bytemap) +{ + auto & internal_data = static_cast &>(*write_column).getData(); + //arrow::Date64Builder builder; + arrow::UInt32Builder builder; + arrow::Status status; + + for (size_t value_i = 0, size = internal_data.size(); value_i < size; ++value_i) + { + if (null_bytemap && (*null_bytemap)[value_i]) + status = builder.AppendNull(); + else + /// Implicitly converts UInt16 to Int32 + //status = date_builder.Append(static_cast(internal_data[value_i]) * 1000); // now ms. TODO check other units + status = builder.Append(internal_data[value_i]); + + checkStatus(status, write_column->getName()); + } + + status = builder.Finish(&arrow_array); + checkStatus(status, write_column->getName()); +} + +template +void fillArrowArrayWithDecimalColumnData( + ColumnPtr write_column, + std::shared_ptr & arrow_array, + const PaddedPODArray * null_bytemap, + const DataType * decimal_type) +{ + const auto & column = static_cast(*write_column); + arrow::DecimalBuilder builder(arrow::decimal(decimal_type->getPrecision(), decimal_type->getScale())); + arrow::Status status; + + for (size_t value_i = 0, size = column.size(); value_i < size; ++value_i) + { + if (null_bytemap && (*null_bytemap)[value_i]) + status = builder.AppendNull(); + else + status = builder.Append( + arrow::Decimal128(reinterpret_cast(&column.getElement(value_i).value))); // TODO: try copy column + + checkStatus(status, write_column->getName()); + } + status = builder.Finish(&arrow_array); + checkStatus(status, write_column->getName()); + +/* TODO column copy + const auto & internal_data = static_cast(*write_column).getData(); + //ArrowBuilderType numeric_builder; + arrow::DecimalBuilder builder(arrow::decimal(decimal_type->getPrecision(), decimal_type->getScale())); + arrow::Status status; + + const uint8_t * arrow_null_bytemap_raw_ptr = nullptr; + PaddedPODArray arrow_null_bytemap; + if (null_bytemap) + { + /// Invert values since Arrow interprets 1 as a non-null value, while CH as a null + arrow_null_bytemap.reserve(null_bytemap->size()); + for (size_t i = 0, size = null_bytemap->size(); i < size; ++i) + arrow_null_bytemap.emplace_back(1 ^ (*null_bytemap)[i]); + + arrow_null_bytemap_raw_ptr = arrow_null_bytemap.data(); + } + + status = builder.AppendValues(reinterpret_cast(internal_data.data()), internal_data.size(), arrow_null_bytemap_raw_ptr); + checkStatus(status, write_column->getName()); + + status = builder.Finish(&arrow_array); + checkStatus(status, write_column->getName()); +*/ +} + +# define FOR_INTERNAL_NUMERIC_TYPES(M) \ + M(UInt8, arrow::UInt8Builder) \ + M(Int8, arrow::Int8Builder) \ + M(UInt16, arrow::UInt16Builder) \ + M(Int16, arrow::Int16Builder) \ + M(UInt32, arrow::UInt32Builder) \ + M(Int32, arrow::Int32Builder) \ + M(UInt64, arrow::UInt64Builder) \ + M(Int64, arrow::Int64Builder) \ + M(Float32, arrow::FloatBuilder) \ + M(Float64, arrow::DoubleBuilder) + +const std::unordered_map> internal_type_to_arrow_type = { + {"UInt8", arrow::uint8()}, + {"Int8", arrow::int8()}, + {"UInt16", arrow::uint16()}, + {"Int16", arrow::int16()}, + {"UInt32", arrow::uint32()}, + {"Int32", arrow::int32()}, + {"UInt64", arrow::uint64()}, + {"Int64", arrow::int64()}, + {"Float32", arrow::float32()}, + {"Float64", arrow::float64()}, + + //{"Date", arrow::date64()}, + //{"Date", arrow::date32()}, + {"Date", arrow::uint16()}, // CHECK + //{"DateTime", arrow::date64()}, // BUG! saves as date32 + {"DateTime", arrow::uint32()}, + + // TODO: ClickHouse can actually store non-utf8 strings! + {"String", arrow::utf8()}, + {"FixedString", arrow::utf8()}, +}; + +const PaddedPODArray * extractNullBytemapPtr(ColumnPtr column) +{ + ColumnPtr null_column = static_cast(*column).getNullMapColumnPtr(); + const PaddedPODArray & null_bytemap = static_cast &>(*null_column).getData(); + return &null_bytemap; +} + + +class OstreamOutputStream : public parquet::OutputStream +{ +public: + explicit OstreamOutputStream(WriteBuffer & ostr_) : ostr(ostr_) {} + virtual ~OstreamOutputStream() {} + virtual void Close() {} + virtual int64_t Tell() { return total_length; } + virtual void Write(const uint8_t * data, int64_t length) + { + ostr.write(reinterpret_cast(data), length); + total_length += length; + } + +private: + WriteBuffer & ostr; + int64_t total_length = 0; + + PARQUET_DISALLOW_COPY_AND_ASSIGN(OstreamOutputStream); +}; + + +void ParquetBlockOutputStream::write(const Block & block) +{ + block.checkNumberOfRows(); + + const size_t columns_num = block.columns(); + + /// For arrow::Schema and arrow::Table creation + std::vector> arrow_fields; + std::vector> arrow_arrays; + arrow_fields.reserve(columns_num); + arrow_arrays.reserve(columns_num); + + for (size_t column_i = 0; column_i < columns_num; ++column_i) + { + // TODO: constructed every iteration + const ColumnWithTypeAndName & column = block.safeGetByPosition(column_i); + + const bool is_column_nullable = column.type->isNullable(); + const auto & column_nested_type + = is_column_nullable ? static_cast(column.type.get())->getNestedType() : column.type; + const std::string column_nested_type_name = column_nested_type->getFamilyName(); + + if (isDecimal(column_nested_type)) + { + const auto add_decimal_field = [&](const auto & types) -> bool { + using Types = std::decay_t; + using ToDataType = typename Types::LeftType; + + if constexpr ( + std::is_same_v< + ToDataType, + DataTypeDecimal< + Decimal32>> || std::is_same_v> || std::is_same_v>) + { + const auto & decimal_type = static_cast(column_nested_type.get()); + arrow_fields.emplace_back(std::make_shared( + column.name, arrow::decimal(decimal_type->getPrecision(), decimal_type->getScale()), is_column_nullable)); + } + + return false; + }; + callOnIndexAndDataType(column_nested_type->getTypeId(), add_decimal_field); + } + else + { + if (internal_type_to_arrow_type.find(column_nested_type_name) == internal_type_to_arrow_type.end()) + { + throw Exception{"The type \"" + column_nested_type_name + "\" of a column \"" + column.name + + "\"" + " is not supported for conversion into a Parquet data format", + ErrorCodes::UNKNOWN_TYPE}; + } + + arrow_fields.emplace_back(std::make_shared(column.name, internal_type_to_arrow_type.at(column_nested_type_name), is_column_nullable)); + } + + std::shared_ptr arrow_array; + + ColumnPtr nested_column + = is_column_nullable ? static_cast(*column.column).getNestedColumnPtr() : column.column; + const PaddedPODArray * null_bytemap = is_column_nullable ? extractNullBytemapPtr(column.column) : nullptr; + + if ("String" == column_nested_type_name) + { + fillArrowArrayWithStringColumnData(nested_column, arrow_array, null_bytemap); + } + else if ("FixedString" == column_nested_type_name) + { + fillArrowArrayWithStringColumnData(nested_column, arrow_array, null_bytemap); + } + else if ("Date" == column_nested_type_name) + { + fillArrowArrayWithDateColumnData(nested_column, arrow_array, null_bytemap); + } + else if ("DateTime" == column_nested_type_name) + { + fillArrowArrayWithDateTimeColumnData(nested_column, arrow_array, null_bytemap); + } + + else if (isDecimal(column_nested_type)) + { + auto fill_decimal = [&](const auto & types) -> bool + { + using Types = std::decay_t; + using ToDataType = typename Types::LeftType; + if constexpr ( + std::is_same_v< + ToDataType, + DataTypeDecimal< + Decimal32>> || std::is_same_v> || std::is_same_v>) + { + const auto & decimal_type = static_cast(column_nested_type.get()); + fillArrowArrayWithDecimalColumnData(nested_column, arrow_array, null_bytemap, decimal_type); + } + return false; + }; + callOnIndexAndDataType(column_nested_type->getTypeId(), fill_decimal); + } +# define DISPATCH(CPP_NUMERIC_TYPE, ARROW_BUILDER_TYPE) \ + else if (#CPP_NUMERIC_TYPE == column_nested_type_name) \ + { \ + fillArrowArrayWithNumericColumnData(nested_column, arrow_array, null_bytemap); \ + } + + FOR_INTERNAL_NUMERIC_TYPES(DISPATCH) +# undef DISPATCH + else + { + throw Exception{"Internal type \"" + column_nested_type_name + "\" of a column \"" + column.name + + "\"" + " is not supported for conversion into a Parquet data format", + ErrorCodes::UNKNOWN_TYPE}; + } + + + arrow_arrays.emplace_back(std::move(arrow_array)); + } + + std::shared_ptr arrow_schema = std::make_shared(std::move(arrow_fields)); + + std::shared_ptr arrow_table = arrow::Table::Make(arrow_schema, arrow_arrays); + + auto sink = std::make_shared(ostr); + + if (!file_writer) + { + + parquet::WriterProperties::Builder builder; +#if USE_SNAPPY + builder.compression(parquet::Compression::SNAPPY); +#endif + auto props = builder.build(); + auto status = parquet::arrow::FileWriter::Open( + *arrow_table->schema(), + arrow::default_memory_pool(), + sink, + props, /*parquet::default_writer_properties(),*/ + parquet::arrow::default_arrow_writer_properties(), + &file_writer); + if (!status.ok()) + throw Exception{"Error while opening a table: " + status.ToString(), ErrorCodes::UNKNOWN_EXCEPTION}; + } + + // TODO: calculate row_group_size depending on a number of rows and table size + auto status = file_writer->WriteTable(*arrow_table, format_settings.parquet.row_group_size); + + if (!status.ok()) + throw Exception{"Error while writing a table: " + status.ToString(), ErrorCodes::UNKNOWN_EXCEPTION}; +} + +void ParquetBlockOutputStream::writeSuffix() +{ + if (file_writer) + { + auto status = file_writer->Close(); + if (!status.ok()) + throw Exception{"Error while closing a table: " + status.ToString(), ErrorCodes::UNKNOWN_EXCEPTION}; + } +} + + +void registerOutputFormatParquet(FormatFactory & factory) +{ + factory.registerOutputFormat( + "Parquet", [](WriteBuffer & buf, const Block & sample, const Context & /*context*/, const FormatSettings & format_settings) + { + BlockOutputStreamPtr impl = std::make_shared(buf, sample, format_settings); + auto res = std::make_shared(impl, impl->getHeader(), format_settings.parquet.row_group_size, 0); + res->disableFlush(); + return res; + }); +} + +} + + +#else + +namespace DB +{ +class FormatFactory; +void registerOutputFormatParquet(FormatFactory &) +{ +} +} + + +#endif diff --git a/dbms/src/Formats/ParquetBlockOutputStream.h b/dbms/src/Formats/ParquetBlockOutputStream.h new file mode 100644 index 00000000000..059113ae134 --- /dev/null +++ b/dbms/src/Formats/ParquetBlockOutputStream.h @@ -0,0 +1,46 @@ +#pragma once + +#include +#if USE_PARQUET +# include +# include + +namespace arrow +{ +class Array; +class DataType; +} + +namespace parquet +{ +namespace arrow +{ + class FileWriter; +} +} + +namespace DB +{ +class ParquetBlockOutputStream : public IBlockOutputStream +{ +public: + ParquetBlockOutputStream(WriteBuffer & ostr_, const Block & header_, const FormatSettings & format_settings); + + Block getHeader() const override { return header; } + void write(const Block & block) override; + void writeSuffix() override; + void flush() override; + + String getContentType() const override { return "application/octet-stream"; } + +private: + WriteBuffer & ostr; + Block header; + const FormatSettings format_settings; + + std::unique_ptr file_writer; +}; + +} + +#endif diff --git a/dbms/src/Formats/TabSeparatedRawRowOutputStream.h b/dbms/src/Formats/TabSeparatedRawRowOutputStream.h index 4be0c0d2445..86eaa2bbb58 100644 --- a/dbms/src/Formats/TabSeparatedRawRowOutputStream.h +++ b/dbms/src/Formats/TabSeparatedRawRowOutputStream.h @@ -1,11 +1,10 @@ #pragma once -#include #include - namespace DB { +struct FormatSettings; /** A stream for outputting data in tsv format, but without escaping individual values. * (That is, the output is irreversible.) diff --git a/dbms/src/IO/readFloatText.h b/dbms/src/IO/readFloatText.h index 9bcf49906ca..7dea367d924 100644 --- a/dbms/src/IO/readFloatText.h +++ b/dbms/src/IO/readFloatText.h @@ -618,7 +618,7 @@ inline void readDigits(ReadBuffer & buf, T & x, unsigned int & digits, int & exp ++places; // num zeroes before + current digit if (digits + places > max_digits) - throw Exception("Too many digits in decimal value", ErrorCodes::ARGUMENT_OUT_OF_BOUND); + throw Exception("Too many digits (" + std::to_string(digits + places) + " > " + std::to_string(max_digits) + ") in decimal value", ErrorCodes::ARGUMENT_OUT_OF_BOUND); digits += places; if (after_point) diff --git a/dbms/src/Interpreters/Settings.h b/dbms/src/Interpreters/Settings.h index 4261b75ae01..12f759f6c82 100644 --- a/dbms/src/Interpreters/Settings.h +++ b/dbms/src/Interpreters/Settings.h @@ -165,6 +165,7 @@ struct Settings M(SettingUInt64, output_format_pretty_max_rows, 10000, "Rows limit for Pretty formats.") \ M(SettingUInt64, output_format_pretty_max_column_pad_width, 250, "Maximum width to pad all values in a column in Pretty formats.") \ M(SettingBool, output_format_pretty_color, true, "Use ANSI escape sequences to paint colors in Pretty formats") \ + M(SettingUInt64, output_format_parquet_row_group_size, 1000000, "Row group size in rows.") \ \ M(SettingBool, use_client_time_zone, false, "Use client timezone for interpreting DateTime string values, instead of adopting server timezone.") \ \ diff --git a/dbms/src/Storages/System/StorageSystemBuildOptions.generated.cpp.in b/dbms/src/Storages/System/StorageSystemBuildOptions.generated.cpp.in index a8e796f20fc..83364bf8645 100644 --- a/dbms/src/Storages/System/StorageSystemBuildOptions.generated.cpp.in +++ b/dbms/src/Storages/System/StorageSystemBuildOptions.generated.cpp.in @@ -31,6 +31,7 @@ const char * auto_config_build[] "BUILD_COMPILE_DEFINITIONS", "@BUILD_COMPILE_DEFINITIONS@", "BUILD_INCLUDE_DIRECTORIES", "@BUILD_INCLUDE_DIRECTORIES@", "STATIC", "@USE_STATIC_LIBRARIES@", + "SPLIT_BINARY", "@CLICKHOUSE_SPLIT_BINARY@", "USE_EMBEDDED_COMPILER", "@USE_EMBEDDED_COMPILER@", "USE_INTERNAL_MEMCPY", "@USE_INTERNAL_MEMCPY@", "USE_GLIBC_COMPATIBILITY", "@GLIBC_COMPATIBILITY@", @@ -48,6 +49,10 @@ const char * auto_config_build[] "USE_POCO_MONGODB", "@USE_POCO_MONGODB@", "USE_POCO_NETSSL", "@USE_POCO_NETSSL@", "USE_BASE64", "@USE_BASE64@", + "USE_XXHASH", "@USE_XXHASH@", + "USE_HDFS", "@USE_HDFS@", + "USE_SNAPPY", "@USE_SNAPPY@", + "USE_PARQUET", "@USE_PARQUET@", "USE_PROTOBUF", "@USE_PROTOBUF@", "USE_BROTLI", "@USE_BROTLI@", diff --git a/dbms/tests/queries/0_stateless/00700_decimal_casts.sql b/dbms/tests/queries/0_stateless/00700_decimal_casts.sql index b1bb0c62d78..242a244a7fa 100644 --- a/dbms/tests/queries/0_stateless/00700_decimal_casts.sql +++ b/dbms/tests/queries/0_stateless/00700_decimal_casts.sql @@ -240,5 +240,3 @@ SELECT toUInt64('9223372036854775809') AS x, toDecimal64(x, 0); -- { serverError SELECT toDecimal32(0, rowNumberInBlock()); -- { serverError 44 } SELECT toDecimal64(0, rowNumberInBlock()); -- { serverError 44 } SELECT toDecimal128(0, rowNumberInBlock()); -- { serverError 44 } - -DROP TABLE IF EXISTS test.decimal; diff --git a/dbms/tests/queries/0_stateless/00900_parquet.reference b/dbms/tests/queries/0_stateless/00900_parquet.reference new file mode 100644 index 00000000000..43c04bc70a6 --- /dev/null +++ b/dbms/tests/queries/0_stateless/00900_parquet.reference @@ -0,0 +1,62 @@ +9999 +9998 +9997 +9996 +9995 +9994 +9993 +9992 +9991 +9990 +99999 +99998 +99997 +99996 +99995 +99994 +99993 +99992 +99991 +99990 +2 +1 +0 +999 +998 +997 +996 +995 +994 +993 +992 +991 +990 +ContextLock Number of times the lock of Context was acquired or tried to acquire. This is global lock. +Query Number of queries started to be interpreted and maybe executed. Does not include queries that are failed to parse, that are rejected due to AST size limits; rejected due to quota limits or limits on number of simultaneously running queries. May include internal queries initiated by ClickHouse itself. Does not count subqueries. +original: +-128 0 -32768 0 -2147483648 0 -9223372036854775808 0 -1.032 -1.064 string-1 fixedstring-1\0\0 2003-04-05 2003-02-03 04:05:06 +-108 108 -1016 1116 -1032 1132 -1064 1164 -1.032 -1.064 string-0 fixedstring\0\0\0\0 2001-02-03 2002-02-03 04:05:06 +127 255 32767 65535 2147483647 4294967295 9223372036854775807 9223372036854775807 -1.032 -1.064 string-2 fixedstring-2\0\0 2004-06-07 2004-02-03 04:05:06 +converted: +-128 0 -32768 0 -2147483648 0 -9223372036854775808 0 -1.032 -1.064 string-1 fixedstring-1\0\0 2003-04-05 2003-02-03 04:05:06 +-108 108 -1016 1116 -1032 1132 -1064 1164 -1.032 -1.064 string-0 fixedstring\0\0\0\0 2001-02-03 2002-02-03 04:05:06 +127 255 32767 65535 2147483647 4294967295 9223372036854775807 9223372036854775807 -1.032 -1.064 string-2 fixedstring-2\0\0 2004-06-07 2004-02-03 04:05:06 +diff: +dest: +79 81 82 83 84 85 86 87 88 89 str01\0\0\0\0\0\0\0\0\0\0 fstr1\0\0\0\0\0\0\0\0\0\0 2003-03-04 1970-01-01 06:29:04 +80 81 82 83 84 85 86 87 88 89 str02 fstr2\0\0\0\0\0\0\0\0\0\0 2005-03-04 2006-08-09 10:11:12 +min: +-128 0 0 0 0 0 0 0 -1 -1 string-1\0\0\0\0\0\0\0 fixedstring-1\0\0 2003-04-05 2003-02-03 +-108 108 8 92 -8 108 -40 -116 -1 -1 string-0\0\0\0\0\0\0\0 fixedstring\0\0\0\0 2001-02-03 2002-02-03 +79 81 82 83 84 85 86 87 88 89 str01\0\0\0\0\0\0\0\0\0\0 fstr1\0\0\0\0\0\0\0\0\0\0 2003-03-04 2004-05-06 +127 -1 -1 -1 -1 -1 -1 -1 -1 -1 string-2\0\0\0\0\0\0\0 fixedstring-2\0\0 2004-06-07 2004-02-03 +max: +-128 0 -32768 0 -2147483648 0 -9223372036854775808 0 -1 -1 string-1 fixedstring-1\0\0 1970-01-01 06:22:27 2003-02-03 04:05:06 +-108 108 -1016 1116 -1032 1132 -1064 1164 -1 -1 string-0 fixedstring\0\0\0\0 1970-01-01 06:09:16 2002-02-03 04:05:06 +80 81 82 83 84 85 86 87 88 89 str02 fstr2 2005-03-04 05:06:07 2006-08-09 10:11:12 +127 255 32767 65535 2147483647 4294967295 9223372036854775807 9223372036854775807 -1 -1 string-2 fixedstring-2\0\0 1970-01-01 06:29:36 2004-02-03 04:05:06 +dest from null: +-128 0 -32768 0 -2147483648 0 -9223372036854775808 0 -1.032 -1.064 string-1 fixedstring-1\0\0 2003-04-05 2003-02-03 04:05:06 +-108 108 -1016 1116 -1032 1132 -1064 1164 -1.032 -1.064 string-0 fixedstring\0\0\0\0 2001-02-03 2002-02-03 04:05:06 +127 255 32767 65535 2147483647 4294967295 9223372036854775807 9223372036854775807 -1.032 -1.064 string-2 fixedstring-2\0\0 2004-06-07 2004-02-03 04:05:06 +\N \N \N \N \N \N \N \N \N \N \N \N \N \N diff --git a/dbms/tests/queries/0_stateless/00900_parquet.sh b/dbms/tests/queries/0_stateless/00900_parquet.sh new file mode 100755 index 00000000000..aa479e7d03c --- /dev/null +++ b/dbms/tests/queries/0_stateless/00900_parquet.sh @@ -0,0 +1,136 @@ +#!/usr/bin/env bash + +set -e + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +. $CUR_DIR/../shell_config.sh + +#${CLICKHOUSE_CLIENT} --max_block_size=1 --query="SELECT * FROM system.numbers LIMIT 10 FORMAT Parquet" > ${CLICKHOUSE_TMP}/t1.pq +#${CLICKHOUSE_CLIENT} --max_block_size=5 --query="SELECT * FROM system.numbers LIMIT 10 FORMAT Parquet" > ${CLICKHOUSE_TMP}/t5.pq +#${CLICKHOUSE_CLIENT} --max_block_size=15 --query="SELECT * FROM system.numbers LIMIT 10 FORMAT Parquet" > ${CLICKHOUSE_TMP}/t15.pq +#${CLICKHOUSE_CLIENT} --query="SELECT * FROM system.numbers LIMIT 100000 FORMAT Parquet" > ${CLICKHOUSE_TMP}/t100000.pq +#${CLICKHOUSE_CLIENT} --query="SELECT * FROM system.numbers LIMIT 1000000000 FORMAT Parquet" > ${CLICKHOUSE_TMP}/t1g.pq +#${CLICKHOUSE_CLIENT} --query="SELECT * FROM system.numbers LIMIT 100000000 FORMAT Parquet" > ${CLICKHOUSE_TMP}/t100m.pq +#${CLICKHOUSE_CLIENT} --max_block_size=100000000 --query="SELECT * FROM system.numbers LIMIT 100000000 FORMAT Parquet" > ${CLICKHOUSE_TMP}/t100m-100mbs.pq +#valgrind --tool=massif ${CLICKHOUSE_CLIENT} --query="SELECT * FROM system.numbers LIMIT 1000000 FORMAT Parquet" > ${CLICKHOUSE_TMP}/t1g.pq + + +${CLICKHOUSE_CLIENT} --query="DROP TABLE IF EXISTS test.contributors" +${CLICKHOUSE_CLIENT} --query="CREATE TABLE test.contributors (name String) ENGINE = Memory" +${CLICKHOUSE_CLIENT} --query="SELECT * FROM system.contributors ORDER BY name DESC FORMAT Parquet" | ${CLICKHOUSE_CLIENT} --query="INSERT INTO test.contributors FORMAT Parquet" +# random results +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.contributors LIMIT 10" > /dev/null +${CLICKHOUSE_CLIENT} --query="DROP TABLE test.contributors" + +${CLICKHOUSE_CLIENT} --query="DROP TABLE IF EXISTS test.parquet_numbers" +${CLICKHOUSE_CLIENT} --query="CREATE TABLE test.parquet_numbers (number UInt64) ENGINE = Memory" +# less than default block size (65k) +${CLICKHOUSE_CLIENT} --query="SELECT * FROM system.numbers LIMIT 10000 FORMAT Parquet" | ${CLICKHOUSE_CLIENT} --query="INSERT INTO test.parquet_numbers FORMAT Parquet" +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.parquet_numbers ORDER BY number DESC LIMIT 10" +${CLICKHOUSE_CLIENT} --query="TRUNCATE TABLE test.parquet_numbers" + +# More than default block size +${CLICKHOUSE_CLIENT} --query="SELECT * FROM system.numbers LIMIT 100000 FORMAT Parquet" | ${CLICKHOUSE_CLIENT} --query="INSERT INTO test.parquet_numbers FORMAT Parquet" +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.parquet_numbers ORDER BY number DESC LIMIT 10" +${CLICKHOUSE_CLIENT} --query="TRUNCATE TABLE test.parquet_numbers" + +#${CLICKHOUSE_CLIENT} --query="SELECT * FROM system.numbers LIMIT 10000000 FORMAT Parquet" | ${CLICKHOUSE_CLIENT} --query="INSERT INTO test.parquet_numbers FORMAT Parquet" +#${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.parquet_numbers ORDER BY number DESC LIMIT 10" +#${CLICKHOUSE_CLIENT} --query="TRUNCATE TABLE test.parquet_numbers" + +#${CLICKHOUSE_CLIENT} --max_block_size=2 --query="SELECT * FROM system.numbers LIMIT 3 FORMAT Parquet" > ${CLICKHOUSE_TMP}/bs2.pq +${CLICKHOUSE_CLIENT} --max_block_size=2 --query="SELECT * FROM system.numbers LIMIT 3 FORMAT Parquet" | ${CLICKHOUSE_CLIENT} --query="INSERT INTO test.parquet_numbers FORMAT Parquet" +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.parquet_numbers ORDER BY number DESC LIMIT 10" + +${CLICKHOUSE_CLIENT} --query="TRUNCATE TABLE test.parquet_numbers" +${CLICKHOUSE_CLIENT} --max_block_size=1 --query="SELECT * FROM system.numbers LIMIT 1000 FORMAT Parquet" | ${CLICKHOUSE_CLIENT} --query="INSERT INTO test.parquet_numbers FORMAT Parquet" +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.parquet_numbers ORDER BY number DESC LIMIT 10" + +${CLICKHOUSE_CLIENT} --query="DROP TABLE test.parquet_numbers" + +${CLICKHOUSE_CLIENT} --query="DROP TABLE IF EXISTS test.parquet_events" +${CLICKHOUSE_CLIENT} --query="CREATE TABLE test.parquet_events (event String, value UInt64, description String) ENGINE = Memory" +${CLICKHOUSE_CLIENT} --query="SELECT * FROM system.events FORMAT Parquet" | ${CLICKHOUSE_CLIENT} --query="INSERT INTO test.parquet_events FORMAT Parquet" +${CLICKHOUSE_CLIENT} --query="SELECT event, description FROM test.parquet_events WHERE event IN ('ContextLock', 'Query') ORDER BY event" +${CLICKHOUSE_CLIENT} --query="DROP TABLE test.parquet_events" + + +#${CLICKHOUSE_CLIENT} --query="DROP TABLE IF EXISTS test.parquet_types1" +#${CLICKHOUSE_CLIENT} --query="DROP TABLE IF EXISTS test.parquet_types2" +#${CLICKHOUSE_CLIENT} --query="CREATE TABLE test.parquet_types1 (int8 Int8, uint8 UInt8, int16 Int16, uint16 UInt16, int32 Int32, int64 Int64, uint64 UInt64, float32 Float32, float64 Float64, string String ) ENGINE = Memory" +#${CLICKHOUSE_CLIENT} --query="CREATE TABLE test.parquet_types2 (int8 Int8, uint8 UInt8, int16 Int16, uint16 UInt16, int32 Int32, int64 Int64, uint64 UInt64, float32 Float32, float64 Float64, string String ) ENGINE = Memory" +#${CLICKHOUSE_CLIENT} --query="INSERT INTO test.parquet_types1 values ( -108, 108, -1016, 1116, -1032, -1064, 1164, -1.032, -1.064, 'string' )" +#${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.parquet_types1 FORMAT Parquet" | ${CLICKHOUSE_CLIENT} --query="INSERT INTO test.parquet_types2 FORMAT Parquet" + + + +${CLICKHOUSE_CLIENT} --query="DROP TABLE IF EXISTS test.parquet_types1" +${CLICKHOUSE_CLIENT} --query="DROP TABLE IF EXISTS test.parquet_types2" +${CLICKHOUSE_CLIENT} --query="DROP TABLE IF EXISTS test.parquet_types3" +${CLICKHOUSE_CLIENT} --query="DROP TABLE IF EXISTS test.parquet_types4" +${CLICKHOUSE_CLIENT} --query="CREATE TABLE test.parquet_types1 (int8 Int8, uint8 UInt8, int16 Int16, uint16 UInt16, int32 Int32, uint32 UInt32, int64 Int64, uint64 UInt64, float32 Float32, float64 Float64, string String, fixedstring FixedString(15), date Date, datetime DateTime) ENGINE = Memory" +${CLICKHOUSE_CLIENT} --query="CREATE TABLE test.parquet_types2 (int8 Int8, uint8 UInt8, int16 Int16, uint16 UInt16, int32 Int32, uint32 UInt32, int64 Int64, uint64 UInt64, float32 Float32, float64 Float64, string String, fixedstring FixedString(15), date Date, datetime DateTime) ENGINE = Memory" +# convert min type +${CLICKHOUSE_CLIENT} --query="CREATE TABLE test.parquet_types3 (int8 Int8, uint8 Int8, int16 Int8, uint16 Int8, int32 Int8, uint32 Int8, int64 Int8, uint64 Int8, float32 Int8, float64 Int8, string FixedString(15), fixedstring FixedString(15), date Date, datetime Date) ENGINE = Memory" +# convert max type +${CLICKHOUSE_CLIENT} --query="CREATE TABLE test.parquet_types4 (int8 Int64, uint8 Int64, int16 Int64, uint16 Int64, int32 Int64, uint32 Int64, int64 Int64, uint64 Int64, float32 Int64, float64 Int64, string String, fixedstring String, date DateTime, datetime DateTime) ENGINE = Memory" + +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.parquet_types1 values ( -108, 108, -1016, 1116, -1032, 1132, -1064, 1164, -1.032, -1.064, 'string-0', 'fixedstring', '2001-02-03', '2002-02-03 04:05:06')" + +# min +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.parquet_types1 values ( -128, 0, -32768, 0, -2147483648, 0, -9223372036854775808, 0, -1.032, -1.064, 'string-1', 'fixedstring-1', '2003-04-05', '2003-02-03 04:05:06')" + +# max +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.parquet_types1 values ( 127, 255, 32767, 65535, 2147483647, 4294967295, 9223372036854775807, 9223372036854775807, -1.032, -1.064, 'string-2', 'fixedstring-2', '2004-06-07', '2004-02-03 04:05:06')" + +# 'SELECT -127,-128,-129,126,127,128,255,256,257,-32767,-32768,-32769,32766,32767,32768,65535,65536,65537, -2147483647,-2147483648,-2147483649,2147483646,2147483647,2147483648,4294967295,4294967296,4294967297, -9223372036854775807,-9223372036854775808,9223372036854775806,9223372036854775807,9223372036854775808,18446744073709551615'; + +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.parquet_types1 FORMAT Parquet" | ${CLICKHOUSE_CLIENT} --query="INSERT INTO test.parquet_types2 FORMAT Parquet" + +echo original: +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.parquet_types1 ORDER BY int8" | tee ${CLICKHOUSE_TMP}/parquet_all_types_1.dump +echo converted: +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.parquet_types2 ORDER BY int8" | tee ${CLICKHOUSE_TMP}/parquet_all_types_2.dump +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.parquet_types1 ORDER BY int8 FORMAT Parquet" > ${CLICKHOUSE_TMP}/parquet_all_types_1.parquet +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.parquet_types2 ORDER BY int8 FORMAT Parquet" > ${CLICKHOUSE_TMP}/parquet_all_types_2.parquet +echo diff: +diff ${CLICKHOUSE_TMP}/parquet_all_types_1.dump ${CLICKHOUSE_TMP}/parquet_all_types_2.dump + +${CLICKHOUSE_CLIENT} --query="TRUNCATE TABLE test.parquet_types2" +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.parquet_types3 values ( 79, 81, 82, 83, 84, 85, 86, 87, 88, 89, 'str01', 'fstr1', '2003-03-04', '2004-05-06')" +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.parquet_types3 ORDER BY int8 FORMAT Parquet" | ${CLICKHOUSE_CLIENT} --query="INSERT INTO test.parquet_types2 FORMAT Parquet" +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.parquet_types1 ORDER BY int8 FORMAT Parquet" | ${CLICKHOUSE_CLIENT} --query="INSERT INTO test.parquet_types3 FORMAT Parquet" + +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.parquet_types4 values ( 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 'str02', 'fstr2', '2005-03-04 05:06:07', '2006-08-09 10:11:12')" +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.parquet_types4 ORDER BY int8 FORMAT Parquet" | ${CLICKHOUSE_CLIENT} --query="INSERT INTO test.parquet_types2 FORMAT Parquet" +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.parquet_types1 ORDER BY int8 FORMAT Parquet" | ${CLICKHOUSE_CLIENT} --query="INSERT INTO test.parquet_types4 FORMAT Parquet" + +echo dest: +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.parquet_types2 ORDER BY int8" +echo min: +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.parquet_types3 ORDER BY int8" +echo max: +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.parquet_types4 ORDER BY int8" + + +${CLICKHOUSE_CLIENT} --query="DROP TABLE IF EXISTS test.parquet_types5" +${CLICKHOUSE_CLIENT} --query="DROP TABLE IF EXISTS test.parquet_types6" +${CLICKHOUSE_CLIENT} --query="TRUNCATE TABLE test.parquet_types2" +${CLICKHOUSE_CLIENT} --query="CREATE TABLE test.parquet_types5 (int8 Nullable(Int8), uint8 Nullable(UInt8), int16 Nullable(Int16), uint16 Nullable(UInt16), int32 Nullable(Int32), uint32 Nullable(UInt32), int64 Nullable(Int64), uint64 Nullable(UInt64), float32 Nullable(Float32), float64 Nullable(Float64), string Nullable(String), fixedstring Nullable(FixedString(15)), date Nullable(Date), datetime Nullable(DateTime)) ENGINE = Memory" +${CLICKHOUSE_CLIENT} --query="CREATE TABLE test.parquet_types6 (int8 Nullable(Int8), uint8 Nullable(UInt8), int16 Nullable(Int16), uint16 Nullable(UInt16), int32 Nullable(Int32), uint32 Nullable(UInt32), int64 Nullable(Int64), uint64 Nullable(UInt64), float32 Nullable(Float32), float64 Nullable(Float64), string Nullable(String), fixedstring Nullable(FixedString(15)), date Nullable(Date), datetime Nullable(DateTime)) ENGINE = Memory" +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.parquet_types5 values ( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)" +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.parquet_types5 ORDER BY int8 FORMAT Parquet" > ${CLICKHOUSE_TMP}/parquet_all_types_5.parquet +#${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.parquet_types5 FORMAT Parquet" | ${CLICKHOUSE_CLIENT} --query="INSERT INTO test.parquet_types6 FORMAT Parquet" +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.parquet_types5 ORDER BY int8 FORMAT Parquet" | ${CLICKHOUSE_CLIENT} --query="INSERT INTO test.parquet_types6 FORMAT Parquet" +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.parquet_types1 ORDER BY int8 FORMAT Parquet" | ${CLICKHOUSE_CLIENT} --query="INSERT INTO test.parquet_types6 FORMAT Parquet" +echo dest from null: +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.parquet_types6 ORDER BY int8" + +${CLICKHOUSE_CLIENT} --query="DROP TABLE test.parquet_types5" +${CLICKHOUSE_CLIENT} --query="DROP TABLE test.parquet_types6" + + +${CLICKHOUSE_CLIENT} --query="DROP TABLE test.parquet_types1" +${CLICKHOUSE_CLIENT} --query="DROP TABLE test.parquet_types2" +${CLICKHOUSE_CLIENT} --query="DROP TABLE test.parquet_types3" +${CLICKHOUSE_CLIENT} --query="DROP TABLE test.parquet_types4" diff --git a/dbms/tests/queries/0_stateless/00900_parquet_create_table_columns.pl b/dbms/tests/queries/0_stateless/00900_parquet_create_table_columns.pl new file mode 100755 index 00000000000..83c2aef01e2 --- /dev/null +++ b/dbms/tests/queries/0_stateless/00900_parquet_create_table_columns.pl @@ -0,0 +1,54 @@ +#!/usr/bin/env perl +package parquet_create_table_columns; +use strict; +no warnings 'experimental'; +use feature 'signatures'; +use JSON::XS; +#use Data::Dumper; + +sub file_read($file) { + open my $f, '<', $file or return; + local $/ = undef; + my $ret = <$f>; + close $f; + return $ret; +} + +our $type_parquet_logical_to_clickhouse = { + DECIMAL => 'Decimal128(1)', + TIMESTAMP_MICROS => 'DateTime', + TIMESTAMP_MILLIS => 'DateTime', +}; +our $type_parquet_physical_to_clickhouse = { + BOOLEAN => 'UInt8', + INT32 => 'Int32', + INT64 => 'Int64', + FLOAT => 'Float32', + DOUBLE => 'Float64', + BYTE_ARRAY => 'String', + FIXED_LEN_BYTE_ARRAY => 'String', # Maybe FixedString? + INT96 => 'Int64', # TODO! +}; + +sub columns ($json) { + my @list; + my %uniq; + for my $column (@{$json->{Columns}}) { + #warn Data::Dumper::Dumper $column; + my $name = $column->{'Name'}; + my $type = $type_parquet_logical_to_clickhouse->{$column->{'LogicalType'}} || $type_parquet_physical_to_clickhouse->{$column->{'PhysicalType'}}; + unless ($type) { + warn "Unknown type [$column->{'PhysicalType'}:$column->{'LogicalType'}] of column [$name]"; + } + $type = "Nullable($type)"; + $name .= $column->{'Id'} if $uniq{$name}++; # Names can be non-unique + push @list, {name => $name, type => $type}; + } + print join ', ', map {"$_->{name} $_->{type}"} @list; +} + +sub columns_file ($file) { + return columns(JSON::XS::decode_json(file_read($file))); +} + +columns_file(shift) unless caller; diff --git a/dbms/tests/queries/0_stateless/00900_parquet_decimal.reference b/dbms/tests/queries/0_stateless/00900_parquet_decimal.reference new file mode 100644 index 00000000000..72fc58bbe50 --- /dev/null +++ b/dbms/tests/queries/0_stateless/00900_parquet_decimal.reference @@ -0,0 +1,17 @@ +diff0: +diff1: +diff2: +nothing: +nulls: +\N \N \N \N +full orig: +1 \N \N \N +\N 1 \N \N +\N \N 1 \N +\N \N \N \N +full inserted: +1 \N \N \N +\N 1 \N \N +\N \N 1 \N +\N \N \N \N +diff3: diff --git a/dbms/tests/queries/0_stateless/00900_parquet_decimal.sh b/dbms/tests/queries/0_stateless/00900_parquet_decimal.sh new file mode 100755 index 00000000000..7fcefa3c3ee --- /dev/null +++ b/dbms/tests/queries/0_stateless/00900_parquet_decimal.sh @@ -0,0 +1,111 @@ +#!/usr/bin/env bash + +# set -x + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +. $CUR_DIR/../shell_config.sh +${CLICKHOUSE_CLIENT} --query="DROP TABLE IF EXISTS test.decimal;" +${CLICKHOUSE_CLIENT} --query="DROP TABLE IF EXISTS test.decimal2;" + +# Simple small values +${CLICKHOUSE_CLIENT} --query="CREATE TABLE IF NOT EXISTS test.decimal (a DECIMAL(9,0), b DECIMAL(18,0), c DECIMAL(38,0), d DECIMAL(9, 9), e DECIMAL(18, 18), f DECIMAL(38, 38), g Decimal(9, 5), h decimal(18, 9), i deciMAL(38, 18), j DECIMAL(1,0)) ENGINE = Memory;" +${CLICKHOUSE_CLIENT} --query="CREATE TABLE IF NOT EXISTS test.decimal2 AS test.decimal ENGINE = Memory;" +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal (a, b, c, d, e, f, g, h, i, j) VALUES (0, 0, 0, 0, 0, 0, 0, 0, 0, 0);" +#${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal (a, b, c, d, e, f, g, h, i, j) VALUES (1, 1, 1, 0.1, 0.1, 1, 1, 1, 1, 1);" +#${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal (a, b, c, d, e, f, g, h, i, j) VALUES (10, 10, 10, 0.1, 0.1, 0.1, 10, 10, 10, 10);" +#${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal (a, b, c, d, e, f, g, h, i, j) VALUES (-100, -100, -100, -0.1, -0.1, -0.1, -100, -100, -100, -100);" +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal (a, b, c) VALUES (1, 1, 1);" +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal (a, b, c) VALUES (10, 10, 10);" +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.decimal ORDER BY a, b, c, d, e, f, g, h, i, j;" > ${CLICKHOUSE_TMP}/parquet_decimal0_1.dump +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.decimal ORDER BY a, b, c, d, e, f, g, h, i, j FORMAT Parquet;" > ${CLICKHOUSE_TMP}/parquet_decimal0.parquet +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.decimal ORDER BY a, b, c, d, e, f, g, h, i, j FORMAT Parquet;" | ${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal2 FORMAT Parquet" +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.decimal2 ORDER BY a, b, c, d, e, f, g, h, i, j;" > ${CLICKHOUSE_TMP}/parquet_decimal0_2.dump +echo diff0: +diff ${CLICKHOUSE_TMP}/parquet_decimal0_1.dump ${CLICKHOUSE_TMP}/parquet_decimal0_2.dump +${CLICKHOUSE_CLIENT} --query="DROP TABLE IF EXISTS test.decimal;" +${CLICKHOUSE_CLIENT} --query="DROP TABLE IF EXISTS test.decimal2;" + + +${CLICKHOUSE_CLIENT} --query="CREATE TABLE IF NOT EXISTS test.decimal ( a DECIMAL(9,0), b DECIMAL(18,0), c DECIMAL(38,0), d DECIMAL(9, 9), e DECIMAL(18, 18), f DECIMAL(38, 38), g Decimal(9, 5), h decimal(18, 9), i deciMAL(38, 18), j DECIMAL(1,0)) ENGINE = Memory;" +${CLICKHOUSE_CLIENT} --query="CREATE TABLE IF NOT EXISTS test.decimal2 AS test.decimal ENGINE = Memory;" +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal (a, b, d, g) VALUES (999999999, 999999999999999999, 0.999999999, 9999.99999);" +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal (a, b, d, g) VALUES (-999999999, -999999999999999999, -0.999999999, -9999.99999);" +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal (c) VALUES (99999999999999999999999999999999999999);" +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal (c) VALUES (-99999999999999999999999999999999999999);" +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal (f) VALUES (0.99999999999999999999999999999999999999);" +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal (f) VALUES (-0.99999999999999999999999999999999999999);" +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal (e, h) VALUES (0.999999999999999999, 999999999.999999999);" +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal (e, h) VALUES (-0.999999999999999999, -999999999.999999999);" +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal (i) VALUES (99999999999999999999.999999999999999999);" +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal (i) VALUES (-99999999999999999999.999999999999999999);" +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal (a, b, c, d, g, j, h) VALUES (1, 1, 1, 0.000000001, 0.00001, 1, 0.000000001);" +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal (a, b, c, d, g, j, h) VALUES (-1, -1, -1, -0.000000001, -0.00001, -1, -0.000000001);" +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal (e, f) VALUES (0.000000000000000001, 0.00000000000000000000000000000000000001);" +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal (e, f) VALUES (-0.000000000000000001, -0.00000000000000000000000000000000000001);" +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal (i) VALUES (0.000000000000000001);" +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal (i) VALUES (-0.000000000000000001);" +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal (a, b, c, d, e, f, g, h, i, j) VALUES (0, 0, 0, 0, 0, 0, 0, 0, 0, 0);" +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal (a, b, c, d, e, f, g, h, i, j) VALUES (-0, -0, -0, -0, -0, -0, -0, -0, -0, -0);" +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal (a, b, c, d, e, f, g, h, i, j) VALUES (0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);" +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal (a, b, c, d, e, f, g, h, i, j) VALUES (-0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0);" +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal (a, b, g) VALUES ('42.00000', 42.0000000000000000000000000000000, '0.999990');" +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal (a, b, c, d, e, f) VALUES ('0.9e9', '0.9e18', '0.9e38', '9e-9', '9e-18', '9e-38');" +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal (a, b, c, d, e, f) VALUES ('-0.9e9', '-0.9e18', '-0.9e38', '-9e-9', '-9e-18', '-9e-38');" +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.decimal ORDER BY a, b, c, d, e, f, g, h, i, j;" > ${CLICKHOUSE_TMP}/parquet_decimal1_1.dump +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.decimal ORDER BY a, b, c, d, e, f, g, h, i, j FORMAT Parquet;" > ${CLICKHOUSE_TMP}/parquet_decimal1.parquet +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.decimal ORDER BY a, b, c, d, e, f, g, h, i, j FORMAT Parquet;" | ${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal2 FORMAT Parquet" +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.decimal2 ORDER BY a, b, c, d, e, f, g, h, i, j;" > ${CLICKHOUSE_TMP}/parquet_decimal1_2.dump +echo diff1: +diff ${CLICKHOUSE_TMP}/parquet_decimal1_1.dump ${CLICKHOUSE_TMP}/parquet_decimal1_2.dump +${CLICKHOUSE_CLIENT} --query="DROP TABLE IF EXISTS test.decimal;" +${CLICKHOUSE_CLIENT} --query="DROP TABLE IF EXISTS test.decimal2;" + +${CLICKHOUSE_CLIENT} --query="CREATE TABLE IF NOT EXISTS test.decimal (a DECIMAL(9,0), b DECIMAL(18,0), c DECIMAL(38,0), d DECIMAL(9, 9), e Decimal64(18), f Decimal128(38), g Decimal32(5), h Decimal64(9), i Decimal128(18), j dec(4,2)) ENGINE = Memory;" +${CLICKHOUSE_CLIENT} --query="CREATE TABLE IF NOT EXISTS test.decimal2 AS test.decimal ENGINE = Memory;" +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal (a, b, c, d, e, f, g, h, i, j) VALUES (42, 42, 42, 0.42, 0.42, 0.42, 42.42, 42.42, 42.42, 42.42);" +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal (a, b, c, d, e, f, g, h, i, j) VALUES (-42, -42, -42, -0.42, -0.42, -0.42, -42.42, -42.42, -42.42, -42.42);" +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.decimal ORDER BY a, b, c, d, e, f, g, h, i, j;" > ${CLICKHOUSE_TMP}/parquet_decimal2_1.dump +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.decimal ORDER BY a, b, c, d, e, f, g, h, i, j FORMAT Parquet;" > ${CLICKHOUSE_TMP}/parquet_decimal2.parquet +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.decimal ORDER BY a, b, c, d, e, f, g, h, i, j FORMAT Parquet;" | ${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal2 FORMAT Parquet" +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.decimal2 ORDER BY a, b, c, d, e, f, g, h, i, j;" > ${CLICKHOUSE_TMP}/parquet_decimal2_2.dump +echo diff2: +diff ${CLICKHOUSE_TMP}/parquet_decimal2_1.dump ${CLICKHOUSE_TMP}/parquet_decimal2_2.dump +${CLICKHOUSE_CLIENT} --query="DROP TABLE IF EXISTS test.decimal;" +${CLICKHOUSE_CLIENT} --query="DROP TABLE IF EXISTS test.decimal2;" + + +${CLICKHOUSE_CLIENT} --query="CREATE TABLE IF NOT EXISTS test.decimal (a Nullable(DECIMAL(9,0)), b Nullable(DECIMAL(18,0)), c Nullable(DECIMAL(38,0)), d Nullable(DECIMAL(9,0))) ENGINE = Memory;" +${CLICKHOUSE_CLIENT} --query="CREATE TABLE IF NOT EXISTS test.decimal2 AS test.decimal ENGINE = Memory;" +# Empty table test +# throws No data to insert +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.decimal ORDER BY a, b, c, d FORMAT Parquet;" > ${CLICKHOUSE_TMP}/parquet_decimal3_1.parquet +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.decimal ORDER BY a, b, c, d FORMAT Parquet;" | ${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal2 FORMAT Parquet" 2> /dev/null +echo nothing: +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.decimal2 ORDER BY a, b, c, d;" +${CLICKHOUSE_CLIENT} --query="TRUNCATE TABLE test.decimal2;" + +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal VALUES (Null, Null, Null, Null)" +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.decimal ORDER BY a, b, c, d FORMAT Parquet;" > ${CLICKHOUSE_TMP}/parquet_decimal3_2.parquet +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.decimal ORDER BY a, b, c, d FORMAT Parquet;" | ${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal2 FORMAT Parquet" +echo nulls: +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.decimal2 ORDER BY a, b, c, d;" +${CLICKHOUSE_CLIENT} --query="TRUNCATE TABLE test.decimal2;" + +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal VALUES (1, Null, Null, Null)" +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal VALUES (Null, 1, Null, Null)" +${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal VALUES (Null, Null, 1, Null)" +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.decimal ORDER BY a, b, c, d FORMAT Parquet;" > ${CLICKHOUSE_TMP}/parquet_decimal3_3.parquet +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.decimal ORDER BY a, b, c, d FORMAT Parquet;" | ${CLICKHOUSE_CLIENT} --query="INSERT INTO test.decimal2 FORMAT Parquet" + +echo full orig: +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.decimal ORDER BY a, b, c, d;" +echo full inserted: +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.decimal2 ORDER BY a, b, c, d;" + +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.decimal2 ORDER BY a, b, c, d;" > ${CLICKHOUSE_TMP}/parquet_decimal3_1.dump +${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.decimal2 ORDER BY a, b, c, d;" > ${CLICKHOUSE_TMP}/parquet_decimal3_2.dump + +echo diff3: +diff ${CLICKHOUSE_TMP}/parquet_decimal3_1.dump ${CLICKHOUSE_TMP}/parquet_decimal3_2.dump +#${CLICKHOUSE_CLIENT} --query="DROP TABLE IF EXISTS test.decimal;" +#${CLICKHOUSE_CLIENT} --query="DROP TABLE IF EXISTS test.decimal2;" diff --git a/dbms/tests/queries/0_stateless/00900_parquet_load.reference b/dbms/tests/queries/0_stateless/00900_parquet_load.reference new file mode 100644 index 00000000000..83d0e8efde9 --- /dev/null +++ b/dbms/tests/queries/0_stateless/00900_parquet_load.reference @@ -0,0 +1,729 @@ +=== Try load data from alltypes_dictionary.parquet +0 1 0 0 0 0 0 0 01/01/09 0 1230768000 +1 0 1 1 1 10 1.1 10.1 01/01/09 1 1230768060 +=== Try load data from alltypes_plain.parquet +4 1 0 0 0 0 0 0 03/01/09 0 1235865600 +5 0 1 1 1 10 1.1 10.1 03/01/09 1 1235865660 +6 1 0 0 0 0 0 0 04/01/09 0 1238544000 +7 0 1 1 1 10 1.1 10.1 04/01/09 1 1238544060 +2 1 0 0 0 0 0 0 02/01/09 0 1233446400 +3 0 1 1 1 10 1.1 10.1 02/01/09 1 1233446460 +0 1 0 0 0 0 0 0 01/01/09 0 1230768000 +1 0 1 1 1 10 1.1 10.1 01/01/09 1 1230768060 +=== Try load data from alltypes_plain.snappy.parquet +6 1 0 0 0 0 0 0 04/01/09 0 1238544000 +7 0 1 1 1 10 1.1 10.1 04/01/09 1 1238544060 +=== Try load data from byte_array_decimal.parquet +1.0 +2.0 +3.0 +4.0 +5.0 +6.0 +7.0 +8.0 +9.0 +10.0 +11.0 +12.0 +13.0 +14.0 +15.0 +16.0 +17.0 +18.0 +19.0 +20.0 +21.0 +22.0 +23.0 +24.0 +=== Try load data from datapage_v2.snappy.parquet +Code: 33. DB::Ex---tion: Error while reading parquet data: IOError: Arrow error: IOError: Corrupt snappy compressed data. + +=== Try load data from fixed_length_decimal_1.parquet +1.0 +2.0 +3.0 +4.0 +5.0 +6.0 +7.0 +8.0 +9.0 +10.0 +11.0 +12.0 +13.0 +14.0 +15.0 +16.0 +17.0 +18.0 +19.0 +20.0 +21.0 +22.0 +23.0 +24.0 +=== Try load data from fixed_length_decimal_legacy.parquet +1.0 +2.0 +3.0 +4.0 +5.0 +6.0 +7.0 +8.0 +9.0 +10.0 +11.0 +12.0 +13.0 +14.0 +15.0 +16.0 +17.0 +18.0 +19.0 +20.0 +21.0 +22.0 +23.0 +24.0 +=== Try load data from int32_decimal.parquet +1.0 +2.0 +3.0 +4.0 +5.0 +6.0 +7.0 +8.0 +9.0 +10.0 +11.0 +12.0 +13.0 +14.0 +15.0 +16.0 +17.0 +18.0 +19.0 +20.0 +21.0 +22.0 +23.0 +24.0 +=== Try load data from int64_decimal.parquet +1.0 +2.0 +3.0 +4.0 +5.0 +6.0 +7.0 +8.0 +9.0 +10.0 +11.0 +12.0 +13.0 +14.0 +15.0 +16.0 +17.0 +18.0 +19.0 +20.0 +21.0 +22.0 +23.0 +24.0 +=== Try load data from nation.dict-malformed.parquet +0 ALGERIA 0 haggle. carefully final deposits detect slyly agai +1 ARGENTINA 1 al foxes promise slyly according to the regular accounts. bold requests alon +2 BRAZIL 1 y alongside of the pending deposits. carefully special packages are about the ironic forges. slyly special +3 CANADA 1 eas hang ironic, silent packages. slyly regular packages are furiously over the tithes. fluffily bold +4 EGYPT 4 y above the carefully unusual theodolites. final dugouts are quickly across the furiously regular d +5 ETHIOPIA 0 ven packages wake quickly. regu +6 FRANCE 3 refully final requests. regular, ironi +7 GERMANY 3 l platelets. regular accounts x-ray: unusual, regular acco +8 INDIA 2 ss excuses cajole slyly across the packages. deposits print aroun +9 INDONESIA 2 slyly express asymptotes. regular deposits haggle slyly. carefully ironic hockey players sleep blithely. carefull +10 IRAN 4 efully alongside of the slyly final dependencies. +11 IRAQ 4 nic deposits boost atop the quickly final requests? quickly regula +12 JAPAN 2 ously. final, express gifts cajole a +13 JORDAN 4 ic deposits are blithely about the carefully regular pa +14 KENYA 0 pending excuses haggle furiously deposits. pending, express pinto beans wake fluffily past t +15 MOROCCO 0 rns. blithely bold courts among the closely regular packages use furiously bold platelets? +16 MOZAMBIQUE 0 s. ironic, unusual asymptotes wake blithely r +17 PERU 1 platelets. blithely pending dependencies use fluffily across the even pinto beans. carefully silent accoun +18 CHINA 2 c dependencies. furiously express notornis sleep slyly regular accounts. ideas sleep. depos +19 ROMANIA 3 ular asymptotes are about the furious multipliers. express dependencies nag above the ironically ironic account +20 SAUDI ARABIA 4 ts. silent requests haggle. closely express packages sleep across the blithely +21 VIETNAM 2 hely enticingly express accounts. even, final +22 RUSSIA 3 requests against the platelets use never according to the quickly regular pint +23 UNITED KINGDOM 3 eans boost carefully special requests. accounts are. carefull +24 UNITED STATES 1 y final packages. slow foxes cajole quickly. quickly silent platelets breach ironic accounts. unusual pinto be +=== Try load data from nested_lists.snappy.parquet +Code: 8. DB::Ex---tion: Column "element" is not presented in input data + +=== Try load data from nested_maps.snappy.parquet +Code: 33. DB::Ex---tion: Error while reading parquet data: NotImplemented: Currently only nesting with Lists is supported. + +=== Try load data from nonnullable.impala.parquet +Code: 33. DB::Ex---tion: Error while reading parquet data: NotImplemented: Currently only nesting with Lists is supported. + +=== Try load data from nullable.impala.parquet +Code: 33. DB::Ex---tion: Error while reading parquet data: NotImplemented: Currently only nesting with Lists is supported. + +=== Try load data from nulls.snappy.parquet +Code: 8. DB::Ex---tion: Column "b_c_int" is not presented in input data + +=== Try load data from repeated_no_annotation.parquet +Code: 33. DB::Ex---tion: Error while reading parquet data: NotImplemented: Currently only nesting with Lists is supported. + +=== Try load data from userdata1.parquet +1454486129 1 Amanda Jordan ajordan0@com.com Female 1.197.201.2 6759521864920116 Indonesia 3/8/1971 49756.53 Internal Auditor 1E+02 +1454519043 2 Albert Freeman afreeman1@is.gd Male 218.111.175.34 Canada 1/16/1968 150280.17 Accountant IV +1454461771 3 Evelyn Morgan emorgan2@altervista.org Female 7.161.136.94 6767119071901597 Russia 2/1/1960 144972.51 Structural Engineer +1454459781 4 Denise Riley driley3@gmpg.org Female 140.35.109.83 3576031598965625 China 4/8/1997 90263.05 Senior Cost Accountant +1454475931 5 Carlos Burns cburns4@miitbeian.gov.cn 169.113.235.40 5602256255204850 South Africa \N +1454484154 6 Kathryn White kwhite5@google.com Female 195.131.81.179 3583136326049310 Indonesia 2/25/1983 69227.11 Account Executive +1454488388 7 Samuel Holmes sholmes6@foxnews.com Male 232.234.81.197 3582641366974690 Portugal 12/18/1987 14247.62 Senior Financial Analyst +1454482026 8 Harry Howell hhowell7@eepurl.com Male 91.235.51.73 Bosnia and Herzegovina 3/1/1962 186469.43 Web Developer IV +1454471573 9 Jose Foster jfoster8@yelp.com Male 132.31.53.61 South Korea 3/27/1992 231067.84 Software Test Engineer I 1E+02 +1454524187 10 Emily Stewart estewart9@opensource.org Female 143.28.251.245 3574254110301671 Nigeria 1/28/1997 27234.28 Health Coach IV +1454458242 11 Susan Perkins sperkinsa@patch.com Female 180.85.0.62 3573823609854134 Russia 210001.95 +1454522674 12 Alice Berry aberryb@wikipedia.org Female 246.225.12.189 4917830851454417 China 8/12/1968 22944.53 Quality Engineer +1454525297 13 Justin Berry jberryc@usatoday.com Male 157.7.146.43 6331109912871813274 Zambia 8/15/1975 44165.46 Structural Analysis Engineer +1454536012 14 Kathy Reynolds kreynoldsd@redcross.org Female 81.254.172.13 5537178462965976 Bosnia and Herzegovina 6/27/1970 286592.99 Librarian +1454489603 15 Dorothy Hudson dhudsone@blogger.com Female 8.59.7.0 3542586858224170 Japan 12/20/1989 157099.71 Nurse Practicioner +1454460241 16 Bruce Willis bwillisf@bluehost.com Male 239.182.219.189 3573030625927601 Brazil 239100.65 +1454461065 17 Emily Andrews eandrewsg@cornell.edu Female 29.231.180.172 30271790537626 Russia 4/13/1990 116800.65 Food Chemist +1454517864 18 Stephen Wallace swallaceh@netvibes.com Male 152.49.213.62 5433943468526428 Ukraine 1/15/1978 248877.99 Account Representative I +1454499954 19 Clarence Lawson clawsoni@vkontakte.ru Male 107.175.15.152 3544052814080964 Russia 177122.99 +1454495436 20 Rebecca Bell rbellj@bandcamp.com Female 172.215.104.127 China 137251.19 +1454505444 21 Diane Stevens dstevensk@cnet.com Female 141.243.73.164 Russia 6/5/1985 87978.22 Food Chemist œ∑´®†¥¨ˆøπ“‘ +1454523505 22 Lawrence Ramos lramosl@sourceforge.net Male 46.72.4.6 3537473810855655 Tanzania 131283.64 +1454525455 23 Gregory Barnes gbarnesm@google.ru Male 220.22.114.145 3538432455620641 Tunisia 1/23/1971 182233.49 Senior Sales Associate 사회과학원 어학연구소 +1454472340 24 Michelle Ellis mellisn@timesonline.co.uk Female 239.81.215.135 3547383558025965 Tanzania 6/5/1964 278001.46 Tax Accountant +1454518347 25 Rachel Perkins rperkinso@lulu.com Female 90.173.28.95 633313663891003209 Russia 176178.75 +1454486554 26 Anthony Lawrence alawrencep@miitbeian.gov.cn Male 121.211.242.99 564182969714151470 Japan 12/10/1979 170085.81 Electrical Engineer +1454488886 27 Henry Henry hhenryq@godaddy.com Male 191.88.236.116 4905730021217853521 China 9/22/1995 284300.15 Nuclear Power Engineer +1454519352 28 Samuel Hunter shunterr@instagram.com Male 72.190.230.173 5002353797389897 Brazil 9/21/1968 108950.24 Environmental Tech +1454469374 29 Jacqueline Holmes jholmess@ustream.tv Female 47.141.224.95 3555934842115316 United States 247939.52 ̗̺͖̹̯͓Ṯ̤͍̥͇͈h̲́e͏͓̼̗̙̼̣͔ ͇̜̱̠͓͍ͅN͕͠e̗̱z̘̝̜̺͙p̤̺̹͍̯͚e̠̻̠͜r̨̤͍̺̖͔̖̖d̠̟̭̬̝͟i̦͖̩͓͔̤a̠̗̬͉̙n͚͜ ̻̞̰͚ͅh̵͉i̳̞v̢͇ḙ͎͟-҉̭̩̼͔m̤̭̫i͕͇̝̦n̗͙ḍ̟ ̯̲͕͞ǫ̟̯̰̲͙̻̝f ̪̰̰̗̖̭̘͘c̦͍̲̞͍̩̙ḥ͚a̮͎̟̙͜ơ̩̹͎s̤.̝̝ ҉Z̡̖̜͖̰̣͉̜a͖̰͙̬͡l̲̫̳͍̩g̡̟̼̱͚̞̬ͅo̗͜.̟ +1454535469 30 Annie Torres atorrest@ning.com Female 202.94.67.27 3530389861801215 Nigeria 5/20/1958 118310.72 Electrical Engineer -1E+02 +1454526588 31 Antonio Berry aberryu@ow.ly Male 5.82.180.4 Thailand 135007.96 +1454533547 32 Nicole Martinez nmartinezv@oakley.com Female 46.32.149.87 United States 149720.75 Z̮̞̠͙͔ͅḀ̗̞͈̻̗Ḷ͙͎̯̹̞͓G̻O̭̗̮ +1454459459 33 Christina Mason cmasonw@nydailynews.com Female 74.214.22.120 Greece 7/21/1986 242593.85 Senior Sales Associate +1454541103 34 Margaret Barnes mbarnesx@angelfire.com Female 133.178.126.244 3582552005871223 South Africa 11/13/1969 109644.23 Human Resources Assistant II +1454487881 35 Melissa Kelly mkellyy@unblog.fr Female 179.132.207.169 6374648559206801 Indonesia 2/6/1968 45639.62 General Manager Ṱ̺̺̕o͞ ̷i̲̬͇̪͙n̝̗͕v̟̜̘̦͟o̶̙̰̠kè͚̮̺̪̹̱̤ ̖t̝͕̳̣̻̪͞h̼͓̲̦̳̘̲e͇̣̰̦̬͎ ̢̼̻̱̘h͚͎͙̜̣̲ͅi̦̲̣̰̤v̻͍e̺̭̳̪̰-m̢iͅn̖̺̞̲̯̰d̵̼̟͙̩̼̘̳ ̞̥̱̳̭r̛̗̘e͙p͠r̼̞̻̭̗e̺̠̣͟s̘͇̳͍̝͉e͉̥̯̞̲͚̬͜ǹ̬͎͎̟̖͇̤t͍̬̤͓̼̭͘ͅi̪̱n͠g̴͉ ͏͉ͅc̬̟h͡a̫̻̯͘o̫̟̖͍̙̝͉s̗̦̲.̨̹͈̣ +1454484472 36 Betty Carr bcarrz@parallels.com Female 159.201.161.49 France 91370.3 -1E2 +1454532399 37 Dorothy Gomez dgomez10@jiathis.com Female 65.111.200.146 493684876859391834 China 57194.86 +1454538878 38 Kathryn Lane klane11@netlog.com Female 169.141.178.89 5308993357499254 Czech Republic 8/20/1964 67783.73 Paralegal +1454511326 39 Jose Murphy jmurphy12@paypal.com Male 118.85.253.180 4994715164232848 Chile 8/8/1991 134708.82 Nuclear Power Engineer +1454458506 40 Jack Flores jflores13@yolasite.com Male 162.215.65.11 3577342788590928 Argentina 1/28/1958 81685.1 Financial Advisor +1454529124 41 Walter Martinez wmartinez14@spotify.com Male 165.150.92.96 Somalia 3/8/1972 212105.33 Health Coach I +1454473984 42 Todd Alvarez talvarez15@csmonitor.com Male 59.123.34.76 3557102122317535 Japan 12/19/1999 284728.99 Marketing Assistant +1454488466 43 Amanda Gray agray16@cdbaby.com Female 252.20.193.145 3561501596653859 China 8/28/1967 213410.26 Senior Quality Engineer +1454494415 44 Sharon Simpson ssimpson17@weather.com Female 242.68.147.87 France 9/28/1963 133884.94 Analog Circuit Design manager +1454526201 45 Bonnie Collins bcollins18@list-manage.com Female 132.217.56.27 3540813015762450 Germany 7/21/1986 67661.42 Business Systems Development Analyst +1454474597 46 Deborah Armstrong darmstrong19@addthis.com Female 89.44.11.142 Canada 4/8/1969 111569.22 Quality Control Specialist ⁦test⁧ +1454486980 47 Daniel Mccoy dmccoy1a@skype.com Male 115.85.247.190 3554507990607374 Central African Republic 66260.14 ❤️ 💔 💌 💕 💞 💓 💗 💖 💘 💝 💟 💜 💛 💚 💙 +1454505529 48 Jean Flores jflores1b@samsung.com Female 211.70.131.207 5392903051983005 Nepal 4/6/1990 199100.32 Financial Advisor +1454521849 49 Lisa Snyder lsnyder1c@woothemes.com Female 145.202.177.215 30475362189761 Germany 12/12/1974 210631.91 Safety Technician II   +1454469295 50 Sean Alexander salexander1d@dagondesign.com Male 89.83.147.177 Bosnia and Herzegovina 5/29/1978 256068.38 Senior Financial Analyst +1454481568 51 Ernest Carroll ecarroll1e@dailymail.co.uk Male 194.224.39.215 5100172156945078 Portugal 11/1/1992 100269.36 Dental Hygienist +1454492589 52 Louise Dean ldean1f@tamu.edu Female 109.43.178.48 201996646854139 Ethiopia 173300.37 +1454457952 53 Ralph Price rprice1g@tmall.com Male 152.6.235.33 4844227560658222 China 8/26/1986 168208.4 Teacher +1454467269 54 George Ferguson gferguson1h@51.la Male 129.108.219.50 3539784298399554 Macedonia 6/26/1971 153238.6 Computer Systems Analyst IV パーティーへ行かないか +1454515393 55 Anna Montgomery amontgomery1i@google.cn Female 80.111.141.47 3586860392406446 China 9/6/1957 92837.5 Software Test Engineer IV 1E2 +1454514049 56 Cheryl Lawrence clawrence1j@ameblo.jp Female 171.155.78.116 Finland 5/7/1985 200827.88 Recruiting Manager +1454459605 57 Willie Palmer wpalmer1k@t-online.de Male 164.107.46.161 4026614769857244 China 8/23/1986 184978.64 Environmental Specialist +1454478957 58 Arthur Berry aberry1l@unc.edu Male 52.42.24.55 3542761473624274 China 144164.88 +1454519593 59 Patricia Marshall pmarshall1m@dell.com Female 47.108.196.175 China 7/21/1984 69236.54 Environmental Specialist +1454466852 60 Cynthia Richards crichards1n@dailymail.co.uk Female 178.236.66.213 3557986543874466 Brazil 179378 +1454496286 61 David Sanders dsanders1o@fda.gov Male 94.143.190.8 3585745042921822 Mexico 2/15/1963 197445.45 Data Coordiator 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 +1454534081 62 Julia Sullivan jsullivan1p@wisc.edu Female 32.183.154.67 6767624411254094 Bolivia 11/28/1963 118311.39 Electrical Engineer +1454530379 63 Kevin Butler kbutler1q@symantec.com Male 21.88.110.64 3551107057688681 Georgia 12/13/1962 129632.55 Database Administrator III +1454475593 64 Dennis Ross dross1r@parallels.com Male 78.25.77.223 Portugal 5/27/1959 280933.71 Biostatistician II +1454478626 65 Raymond Jacobs rjacobs1s@sohu.com Male 188.52.98.175 5048378563875353 Indonesia 13673.35 +1454532460 66 Steven Pierce spierce1t@usgs.gov Male 230.13.54.19 5100178880451481 Namibia 4/10/1965 152382.69 Analyst Programmer +1454480831 67 Jonathan Ellis jellis1u@g.co Male 125.115.227.203 China 4/5/1991 268468.96 Staff Scientist   +1454460516 68 Rachel Price rprice1v@census.gov Female 89.52.192.105 Indonesia 5/6/1982 234502.16 Payment Adjustment Coordinator +1454492257 69 Harold Olson holson1w@chronoengine.com Male 169.173.35.139 China 7/25/1994 146917.43 Occupational Therapist +1454524497 70 Pamela Wagner pwagner1x@gravatar.com Female 184.97.191.144 5593584893781844 Italy 5/3/1964 253108.75 Automation Specialist I 1;DROP TABLE users +1454537805 71 Stephanie Watkins swatkins1y@rakuten.co.jp 124.183.29.113 30552863095190 Burkina Faso 8/29/1971 \N Physical Therapy Assistant +1454530454 72 John Ortiz jortiz1z@mozilla.org Male 4.70.220.127 5194470971764378 Sweden 2/13/1978 91566.02 Analyst Programmer +1454523864 73 Kimberly Wheeler kwheeler20@imgur.com Female 26.46.50.55 China 11/6/1978 31026.94 Junior Executive +1454470404 74 Kathryn Henderson khenderson21@ask.com Female 218.212.63.68 4936394111685353310 Ukraine 4/11/1985 59413.85 Pharmacist -$1.00 +1454527390 75 Catherine Gibson cgibson22@ebay.com Female 204.84.35.26 5402007176101895 Indonesia 12/20/1984 92315.94 Desktop Support Technician +1454509078 76 Carolyn Nelson cnelson23@tiny.cc Female 64.13.61.211 4844223687165886 Estonia 3/9/1985 179193.6 Social Worker +1454479055 77 Denise Nguyen dnguyen24@ovh.net Female 18.208.48.116 201900233821394 China 121013.48 +1454458493 78 Mildred Torres mtorres25@alibaba.com Female 38.102.60.15 6399156779396437 Russia 9/24/1960 166987.55 Paralegal +1454507970 79 Linda Shaw lshaw26@psu.edu Female 188.221.197.229 3557917782902346 Russia 9/30/1987 67211.67 Structural Analysis Engineer +1454540546 80 Anna Hudson ahudson27@gmpg.org Female 153.84.219.15 Indonesia 9/12/1997 110408.87 VP Marketing +1454536800 81 Albert Pierce apierce28@phoca.cz Male 145.148.40.149 Palestinian Territory 11/4/1955 43019.01 Web Developer III 0/0 +1454542995 82 Carol Franklin cfranklin29@marketwatch.com Female 32.189.30.244 67097647572873744 China 6/5/1978 31572.53 Automation Specialist II +1454506472 83 Carlos Washington cwashington2a@phpbb.com Male 90.239.40.124 67063904960748578 United States 11/4/1970 28853.61 Developer I ❤️ 💔 💌 💕 💞 💓 💗 💖 💘 💝 💟 💜 💛 💚 💙 +1454463081 84 Kathryn Austin kaustin2b@livejournal.com Female 152.193.181.90 Philippines 10/8/1990 131855.43 Nurse Practicioner +1454494358 85 Lillian Gardner lgardner2c@hao123.com Female 189.104.46.70 Russia 10/28/1961 145282.64 Occupational Therapist +1454530407 86 Peter Mendoza pmendoza2d@paypal.com Male 77.225.63.206 3562330687037049 Mexico 12/23/1988 40664.88 Staff Scientist +1454466533 87 Dennis Torres dtorres2e@ask.com Male 199.131.129.105 50188330277167912 Croatia 5/25/1986 265985 Account Representative II 社會科學院語學研究所 +1454463286 88 Timothy Watkins twatkins2f@toplist.cz Male 120.52.182.111 Tunisia 6/24/2000 242129.05 Operator +1454498394 89 Nicole Willis nwillis2g@cmu.edu Female 44.196.120.110 6394724888228638 Indonesia 2/1/1966 258772.36 Physical Therapy Assistant +1454525151 90 Jacqueline Carr jcarr2h@freewebs.com Female 197.40.38.49 201939989746686 China 5/31/1961 100733.44 Civil Engineer (。◕ ∀ ◕。) +1454510656 91 Theresa Gonzalez tgonzalez2i@nih.gov Female 237.106.229.219 Argentina 8/10/1970 47723.61 Product Engineer +1454479785 92 Donald Bradley dbradley2j@latimes.com Male 244.82.249.86 3534114122488321 Indonesia 7/8/2000 105051.77 Tax Accountant +1454512853 93 Katherine Little klittle2k@cyberchimps.com Female 61.43.154.182 30218284989094 Poland 1/20/1990 155597.16 Associate Professor +1454516486 94 Ruth Cooper rcooper2l@apache.org Female 114.82.62.61 Indonesia 7/20/1993 181481.5 Civil Engineer +1454498785 95 Stephen Gutierrez sgutierrez2m@walmart.com Male 134.231.189.30 3560204445825528 Guatemala 8/22/1995 83986.79 Structural Engineer +1454473160 96 Kevin Scott kscott2n@histats.com Male 226.59.43.229 3558997916332270 United States 6/5/1966 130054.63 Graphic Designer ÅÍÎÏ˝ÓÔÒÚÆ☃ +1454540928 97 Steven Williamson swilliamson2o@devhub.com Male 122.216.99.88 France 238119.62 +1454473451 98 Shawn Adams sadams2p@imdb.com Male 148.92.123.202 5893564746795315893 Indonesia 11/10/1959 67749.83 Senior Developer ‫test‫ +1454507278 99 Russell Fields rfields2q@google.ca Male 110.74.199.162 Tanzania 1/2/1994 13268.99 Mechanical Systems Engineer +1454514595 100 Willie Weaver wweaver2r@google.de Male 13.54.121.138 3534023246040472 Mexico 8/21/1970 175694.61 Dental Hygienist ̡͓̞ͅI̗̘̦͝n͇͇͙v̮̫ok̲̫̙͈i̖͙̭̹̠̞n̡̻̮̣̺g̲͈͙̭͙̬͎ ̰t͔̦h̞̲e̢̤ ͍̬̲͖f̴̘͕̣è͖ẹ̥̩l͖͔͚i͓͚̦͠n͖͍̗͓̳̮g͍ ̨o͚̪͡f̘̣̬ ̖̘͖̟͙̮c҉͔̫͖͓͇͖ͅh̵̤̣͚͔á̗̼͕ͅo̼̣̥s̱͈̺̖̦̻͢.̛̖̞̠̫̰ +=== Try load data from userdata2.parquet +1454506599 1 Donald Lewis dlewis0@clickbank.net Male 102.22.124.20 Indonesia 7/9/1972 140249.37 Senior Financial Analyst +1454458948 2 Walter Collins wcollins1@bloglovin.com Male 247.28.26.93 3587726269478025 China \N +1454524144 3 Michelle Henderson mhenderson2@geocities.jp Female 193.68.146.150 France 1/15/1964 236219.26 Teacher +1454506939 4 Lori Hudson lhudson3@dion.ne.jp 34.252.168.48 3568840151595649 Russia 4/22/1988 \N Nuclear Power Engineer +1454458529 5 Howard Miller hmiller4@fema.gov Male 103.193.150.230 3583473261055014 France 11/26/1998 50210.02 Senior Editor +1454496547 6 Frances Adams fadams5@123-reg.co.uk Female 106.196.106.93 Russia 3/27/1997 82175.77 Account Coordinator +1454528652 \N Steven Hanson shanson6@cisco.com Male 234.130.172.185 3550842607768119 Indonesia 129582.61 +1454487094 8 Louis Simmons lsimmons7@icio.us Male 18.69.80.15 China 6/1/1992 90744.86 Product Engineer +1454543811 9 Keith Parker kparker8@amazonaws.com Male 108.205.40.64 Guadeloupe 12/30/1992 60618.9 Developer II +1454485649 10 Wanda Walker wwalker9@latimes.com Female 246.214.98.78 3539421569669478 Portugal 137664.53 +1454517563 11 Kathryn Weaver kweavera@bizjournals.com Female 157.237.161.75 201425019338900 Sweden 117572.65 +1454482256 12 Philip Ward pwardb@sakura.ne.jp Male 77.140.225.69 201508031789224 Greece 9/3/1984 238925.79 Human Resources Manager +1454542618 13 Evelyn Harvey eharveyc@time.com 254.174.154.7 3539535868968594 China 5/15/1979 \N Software Engineer III +1454484804 14 Andrea Lane alaned@gov.uk Female 192.253.116.192 5100174455306952 Indonesia 1/19/1989 166778.42 Operator +1454507104 15 Bobby Vasquez bvasqueze@furl.net Male 126.60.18.195 3581051861650673 Philippines 1/25/1975 138184.83 Senior Editor +1454536690 16 Kenneth Gibson kgibsonf@soundcloud.com Male 91.153.142.170 5389947292571488 Peru 11/3/1975 98614.53 Environmental Tech +1454516554 17 Emily Hill ehillg@house.gov Female 109.107.174.205 Palestinian Territory 5/18/1956 218781.48 Executive Secretary +1454541649 18 Kelly Fowler kfowlerh@dell.com Female 147.58.88.116 3551741291105936 Greece 6/11/1975 117249.56 Systems Administrator III +1454524126 19 Diana Howell dhowelli@sphinn.com Female 21.240.75.42 4026635872860296 Iran 7/7/1993 174844.52 Teacher +1454466206 20 Johnny Collins jcollinsj@google.ca Male 38.173.129.250 372301677387203 Afghanistan 7/28/1987 155908.69 Social Worker +1454493912 21 Frank Bradley fbradleyk@shinystat.com Male 186.9.38.46 4913033819988246 Czech Republic 211051.83 +1454509391 22 Billy Thomas bthomasl@moonfruit.com Male 143.89.197.162 4026052248187794 Czech Republic 10/7/1991 282061.72 Professor 👾 🙇 💁 🙅 🙆 🙋 🙎 🙍 +1454523133 23 Philip Moreno pmorenom@rambler.ru Male 9.39.210.239 4041597502244971 United States 122560.95 +1454536839 24 Billy Ray brayn@meetup.com Male 230.255.220.160 201925598515489 Kazakhstan 2/9/1966 130424.35 VP Accounting 사회과학원 어학연구소 +1454509252 25 Ryan Wilson rwilsono@forbes.com Male 197.77.142.137 Poland 7/4/1961 280703.91 Software Test Engineer III +1454458024 26 Sandra Coleman scolemanp@blogger.com Female 230.159.39.252 3555708337891155 China 8/7/1971 113688.11 VP Sales +1454513250 27 Evelyn Moreno emorenoq@chronoengine.com Female 126.96.111.52 3557508895347766 United States 8/17/1990 167131.57 Recruiting Manager +1454509036 28 Elizabeth Warren ewarrenr@flavors.me Female 213.8.204.211 67099385430526802 China 6/14/1996 119515.12 Media Manager II +1454541241 29 Linda Hawkins lhawkinss@fotki.com Female 206.6.3.196 4913079795915711 Philippines 2/14/1961 107779.93 Technical Writer +1454493935 30 Janice Day jdayt@devhub.com Female 243.24.120.209 Ukraine 6/9/1972 53906.4 Marketing Manager +1454483872 31 Diane Perez dperezu@ihg.com Female 182.136.218.77 Belarus 2/9/1957 170326.91 Chief Design Engineer +1454529216 32 Bruce Robinson brobinsonv@redcross.org Male 5.126.135.106 201769377515751 Philippines 169520.45 +1454470160 33 Daniel Lawrence dlawrencew@usgs.gov Male 200.168.191.214 4911581295367856744 United States 5/7/1967 199535.76 VP Sales +1454474809 34 Theresa James tjamesx@quantcast.com Female 83.122.166.224 3545570545148759 Russia 104683.19 +1454536922 35 Scott Russell srusselly@printfriendly.com Male 92.233.3.208 Bolivia 205730.41 +1454514354 36 Ruby Vasquez rvasquezz@toplist.cz Female 8.148.83.49 France 11/5/1999 95407.16 Financial Advisor +1454524074 37 Jeffrey Hall jhall10@pagesperso-orange.fr Male 91.103.226.35 3531476231658075 Indonesia 5/29/1987 247716.37 Business Systems Development Analyst +1454477697 38 Debra Kennedy dkennedy11@state.tx.us Female 116.247.236.130 676732277565853203 Mexico 5/22/1955 272563.67 Desktop Support Technician +1454464041 39 Cole Male 157.157.28.86 4911512925983388490 Panama 91174.63 +1454521471 40 Helen Sanchez hsanchez13@oakley.com Female 222.122.74.77 Venezuela 2/11/1969 189240.59 Food Chemist +1454527305 41 Jennifer Russell jrussell14@cpanel.net Female 42.82.215.191 Morocco 80644.64 1E02 +1454479360 42 Fred Marshall fmarshall15@ifeng.com 160.92.143.233 6374102245574313 China 12/18/1984 \N Structural Engineer +1454464402 43 Terry Ford tford16@shop-pro.jp Male 169.34.131.192 3588107849306045 Turkmenistan 286388.01 +1454468866 44 Maria Mason mmason17@miibeian.gov.cn Female 213.62.60.224 060438374765421941 Sweden 7/6/1973 34664.91 Social Worker +1454486568 45 Sharon Schmidt sschmidt18@istockphoto.com Female 111.247.11.124 5100179876769597 Argentina 10/4/1982 150142.49 Mechanical Systems Engineer +1454483332 46 Gregory Jones gjones19@jimdo.com Male 132.88.44.128 30372001476487 China 12/31/1972 240265.01 Design Engineer +1454520829 47 Raymond Moore rmoore1a@arizona.edu 89.39.221.170 5602248693774107 Japan 4/24/1956 \N VP Sales +1454531788 48 Tammy Scott tscott1b@mlb.com Female 236.12.148.59 3577211980737555 Peru 10/14/1959 132064.01 Software Consultant +1454480004 49 Willie Alexander walexander1c@home.pl Male 2.199.150.177 Brazil 10/14/1958 26424.57 Executive Secretary `ィ(´∀`∩ +1454473891 50 William Garrett wgarrett1d@java.com Male 20.24.142.67 Croatia 10/9/1963 181424.2 Database Administrator III +1454463118 51 Patricia Peterson ppeterson1e@cpanel.net Female 77.242.54.160 3585161324543005 Peru 3/5/1987 176561.19 Media Manager III +1454488118 52 Andrew Cook acook1f@ftc.gov Male 220.139.174.228 6333320102003586 Bolivia 3/8/1969 185775.61 Computer Systems Analyst III +1454536072 53 Carol Nichols cnichols1g@statcounter.com Female 233.176.31.182 3543580855019963 Nigeria 1/6/1960 105346.38 Compensation Analyst +1454489053 54 Jimmy Morales jmorales1h@archive.org Male 199.160.215.73 3587538933267985 Kiribati 8/25/1961 146625.62 Assistant Media Planner +1454538033 55 Nancy Montgomery nmontgomery1i@freewebs.com Female 11.235.20.56 3586137339728301 China 128631.29 $1.00 +1454461902 56 Thomas Freeman tfreeman1j@java.com Male 161.123.216.250 3536920916224146 Colombia 8/4/1973 239571.27 Senior Developer +1454488504 57 Virginia Bell vbell1k@aboutads.info Female 79.142.13.145 3585595583423005 Malaysia 4/2/1998 252007.47 Actuary +1454496671 58 Tammy Adams tadams1l@virginia.edu Female 106.207.61.165 3528072249217643 Canada 1/26/1973 98463.77 Business Systems Development Analyst +1454516066 59 Cynthia Robertson crobertson1m@alibaba.com Female 106.110.239.97 Belarus 12/20/1962 90950.39 Help Desk Technician +1454523801 60 Steven Romero sromero1n@usa.gov Male 65.249.97.254 5007669084530801 Argentina 9/27/1963 14358.32 Quality Control Specialist +1454458452 61 Sean Greene sgreene1o@goo.gl Male 71.195.178.59 5602246313163081 China 2/20/1991 70656.63 Sales Representative +1454537851 62 Jerry Turner jturner1p@scribd.com Male 69.148.19.138 3561778321182616 New Zealand 5/25/1991 89186 Information Systems Manager +1454523562 63 Jennifer Mendoza jmendoza1q@shutterfly.com Female 54.114.8.9 3544098267391200 Russia 7/8/1973 263720.16 General Manager +1454477002 64 Roy Hughes rhughes1r@stanford.edu Male 209.120.70.78 3552886646968253 Canada 10/30/1968 191750.33 Mechanical Systems Engineer +1454477109 65 Susan Jenkins sjenkins1s@princeton.edu Female 247.155.65.12 Philippines 3/1/1967 86339.04 VP Sales +1454527329 66 Norma Dunn ndunn1t@pen.io Female 250.241.78.109 China 7/20/1967 77739.6 Web Designer I +1454461701 67 Tina Reid treid1u@163.com Female 116.38.145.226 Germany 4/25/1967 228301.51 Financial Analyst +1454478121 68 Cynthia Daniels cdaniels1v@pinterest.com Female 17.140.57.238 3589952234971047 Burundi 1/9/1956 42221.96 Research Nurse +1454462100 69 Wells Male 92.13.7.20 Philippines 7/4/1969 78486.77 Tax Accountant +1454516337 70 Stephen Butler sbutler1x@moonfruit.com Male 230.147.124.190 Argentina 125060.01 +1454459366 71 Jacqueline Wallace jwallace1y@dagondesign.com Female 203.83.140.84 3578315582149538 Turkmenistan 4/15/1997 89436.49 Cost Accountant +1454479818 72 Carol Dunn cdunn1z@ocn.ne.jp Female 241.2.84.72 5602252003430282308 Bulgaria 2/1/1981 203473.36 Geological Engineer +1454505977 73 Russell Williams rwilliams20@imgur.com Male 21.217.68.126 3566925409646658 Slovenia 1/30/1977 252402.64 Librarian +1454476392 74 Kathryn Torres ktorres21@rakuten.co.jp Female 4.124.222.88 4026779356659103 Portugal 7/31/1956 121285.58 Project Manager +1454463675 75 Larry Mason lmason22@alibaba.com Male 172.104.78.232 3587717468815331 Sweden 4/20/1969 248583.77 Professor +1454517479 76 Rachel Dunn rdunn23@hugedomains.com Female 101.213.94.161 6374938227969686 Peru 6/18/1999 79245.45 Chief Design Engineer +1454457675 77 Doris Elliott delliott24@shinystat.com Female 36.27.140.126 Portugal 9/23/1987 98288.74 Design Engineer +1454483215 78 William Mendoza wmendoza25@prlog.org Male 71.28.136.31 3580069171786970 China 3/20/1967 81965.94 Media Manager II "ثم نفس سقطت وبالتحديد، +1454504790 79 Elizabeth Payne epayne26@about.me Female 40.237.87.45 337941052859146 Estonia 49661.99 +1454481311 80 Dennis Robertson drobertson27@w3.org Male 189.45.163.164 Italy 5/2/1972 19984.47 Web Developer III +1454514914 81 Edward Little elittle28@mozilla.org Male 114.189.184.212 South Korea 11/19/1984 141645.22 Senior Sales Associate ../../../../../../../../../../../etc/passwd%00 +1454530264 82 Roy Tucker rtucker29@vistaprint.com Male 254.148.189.172 Portugal 285617.13 +1454510066 83 Matthew Gardner mgardner2a@wix.com Male 91.23.27.42 5602247355547230028 Brazil 1/18/1977 267617.18 Actuary +1454535958 84 Anthony Palmer apalmer2b@uol.com.br 25.228.124.126 3561410660537354 China 7/4/1974 \N Human Resources Assistant III +1454460668 85 John Hudson jhudson2c@rediff.com Male 75.191.191.171 3538638405093479 Georgia 6/22/1994 82621.71 Tax Accountant +1454479399 86 Jonathan Mills jmills2d@mail.ru Male 224.145.163.163 36504499928546 Philippines 77260.7 00˙Ɩ$- +1454491670 87 Christine Jackson cjackson2e@feedburner.com Female 8.207.125.219 Philippines 6/12/1964 32832.61 Occupational Therapist +1454475253 88 Eric Fernandez efernandez2f@artisteer.com Male 246.217.21.160 France 124825.77 +1454483421 89 Heather Diaz hdiaz2g@tmall.com Female 220.248.165.145 502080553226612964 China 7/26/1966 280714.33 Food Chemist +1454515874 90 Nicole Reid nreid2h@cisco.com Female 10.75.131.59 5610704755842409780 Philippines 12/15/1985 24922.19 Marketing Assistant +1454542340 91 Donald Murphy dmurphy2i@fema.gov Male 127.141.234.199 China 4/10/1977 76449.81 Cost Accountant +1454531823 92 Steven Wagner swagner2j@go.com Male 211.154.182.230 United Kingdom 249411.22 +1454539859 93 Ruth Alvarez ralvarez2k@sciencedaily.com 240.195.230.204 South Korea 7/11/1964 \N Senior Developer +1454462055 94 Carl Oliver coliver2l@cafepress.com Male 199.184.71.24 China 6/26/1967 215279.38 Operator (╯°□°)╯︵ ┻━┻) +1454457982 95 Teresa Ruiz truiz2m@diigo.com Female 22.118.240.24 337941028849437 Brazil 7/25/1994 243603.67 Cost Accountant +1454465475 96 Kathryn Carter kcarter2n@fastcompany.com Female 203.255.226.40 Greece 1/23/1969 34951.57 Registered Nurse +1454542755 97 Fred Perry fperry2o@imgur.com 46.52.134.142 3544236333368634 Indonesia 2/6/1966 \N Programmer Analyst III +1454477885 98 Harry Perkins hperkins2p@domainmarket.com Male 235.202.132.85 374288817366643 Russia 1/9/1962 167340.53 Physical Therapy Assistant +1454509699 99 Bobby Hicks bhicks2q@wix.com Male 253.252.57.121 3555445397654443 United States 8/10/1964 238304.33 Quality Control Specialist Z̮̞̠͙͔ͅḀ̗̞͈̻̗Ḷ͙͎̯̹̞͓G̻O̭̗̮ +1454515572 100 Tammy Dunn tdunn2r@list-manage.com Female 162.156.75.67 Brazil 4/24/1980 163106.38 Sales Representative +=== Try load data from userdata3.parquet +1454515666 1 Ernest Fuller efuller0@examiner.com Male 106.72.28.74 5610608195667267 Israel 140639.36 +1454536327 2 Anthony Foster afoster1@weibo.com Male 156.243.130.166 4508242795214771 Indonesia 1/16/1998 172843.61 Developer II 👾 🙇 💁 🙅 🙆 🙋 🙎 🙍 +1454466139 3 Ryan Montgomery rmontgomery2@mozilla.org Male 28.55.168.128 Colombia 11/21/1978 204620.66 Developer I ␢ +1454473204 4 Brenda Nelson bnelson3@photobucket.com Female 185.81.160.85 Guatemala 10/29/1998 260474.12 GIS Technical Architect +1454458516 5 Jacqueline Ellis jellis4@amazon.com Female 158.137.238.6 Russia 7/12/1959 286038.78 Marketing Assistant +1454528894 6 Paul Ferguson pferguson5@gmpg.org Male 141.122.136.144 30501574577558 Thailand 241518.24 +1454489945 7 Linda Hunt lhunt6@prlog.org Female 104.179.97.82 Russia 3/30/1988 192756.38 Professor +1454486691 8 Frances Kim fkim7@blog.com Female 28.77.158.48 676306013856639159 Indonesia 188511.28 +1454487153 9 Jason Matthews jmatthews8@google.co.uk Male 72.129.239.24 3534550235909507 China 7/29/1982 238068.56 Web Designer III +1454519282 10 Carolyn Elliott celliott9@cpanel.net Female 51.211.70.30 3563436733386899 Indonesia 4/28/1977 132718.26 Research Nurse +1454473379 11 Thomas Mills tmillsa@psu.edu Male 104.114.227.199 5018278895598921190 Russia 236386.69 +1454534367 12 Russell Lee rleeb@howstuffworks.com Male 193.165.137.217 China 280252.36 🐵 🙈 🙉 🙊 +1454525264 13 Chris Bailey cbaileyc@redcross.org Male 246.109.118.154 30485245023962 Thailand 11/26/1970 200218.34 Research Assistant I +1454457712 14 Eric Parker eparkerd@usa.gov Male 25.73.91.135 5602249431899032 Russia 8/12/1986 102832.54 Tax Accountant +1454526788 15 Anne Robertson arobertsone@geocities.jp Female 209.77.27.30 Armenia 168201.04   +1454494278 16 Angela Gonzalez agonzalezf@state.gov Female 118.77.43.191 Sweden 7/1/1972 161220.37 Database Administrator I +1454488522 17 Edward Moreno emorenog@hp.com Male 200.50.125.67 3559979696602303 France 8/17/1966 144551.41 Chief Design Engineer +1454496145 18 Roy Murray rmurrayh@sphinn.com Male 91.52.226.221 3546330084792460 Portugal 285872.87 𠜎𠜱𠝹𠱓𠱸𠲖𠳏 +1454492939 19 Louis Willis lwillisi@hp.com 14.132.82.250 Philippines 8/1/1980 \N Director of Sales +1454530172 20 Edward Perez eperezj@china.com.cn Male 24.152.201.59 3571014044514515 Indonesia 29515.23 +1454518522 21 Nicole Price npricek@cpanel.net Female 4.21.204.142 Peru 5/8/1978 154023.3 Office Assistant III +1454496552 22 Virginia Nichols vnicholsl@ning.com Female 160.202.18.170 30166467912021 Greece 5/10/1966 145509.34 Programmer II +1454474290 23 Katherine Roberts krobertsm@hostgator.com Female 247.21.118.188 Cuba 192723.43 +1454522256 24 Emily Sullivan esullivann@sakura.ne.jp Female 33.152.103.14 4074771539744796 Indonesia 6/28/1965 36127.55 VP Sales +1454527958 25 Susan Turner sturnero@google.pl 150.94.47.96 374283138983226 United States \N +1454540961 26 Fred Jenkins fjenkinsp@walmart.com Male 219.195.7.86 China 3/23/1965 69388.75 Human Resources Assistant I +1454496916 27 Jane Torres jtorresq@photobucket.com Female 147.220.219.158 5002353015111222 Indonesia 9/29/1997 226788.25 Occupational Therapist +1454508711 28 Louis Patterson lpattersonr@wp.com Male 158.176.255.43 5100145505218793 China 9/20/1993 30309.45 VP Quality Control +1454538643 29 Brandon Wagner bwagners@slashdot.org Male 124.203.101.37 6771208405057819279 Iraq 10/3/1959 95522.88 Research Associate +1454484725 30 Amy Jenkins ajenkinst@wikia.com Female 21.0.126.111 3542005201579396 Ethiopia 9/26/1984 167682.84 Tax Accountant """\'""\'""\'\'\'""" +1454513613 31 Timothy Frazier tfrazieru@toplist.cz 100.218.94.178 China 5/17/1963 \N Director of Sales 0.00 +1454463548 32 Phillip Meyer pmeyerv@live.com Male 184.208.76.39 3541248561759148 France 11/3/1974 245572.41 Nurse +1454528692 33 Joe Wallace jwallacew@mail.ru Male 167.122.66.246 5602246900361320 Russia 64311.11 +1454466352 34 Walter Rivera wriverax@de.vu Male 67.169.221.120 5366484318587717 Russia 1/28/1983 271690.8 Programmer Analyst I +1454480715 35 Lois Mcdonald lmcdonaldy@paypal.com 44.140.199.251 Portugal \N +1454499439 36 William Edwards wedwardsz@acquirethisname.com Male 69.187.29.7 3528411636358679 Egypt 2/23/1958 252476.42 Financial Analyst Œ„´‰ˇÁ¨ˆØ∏”’ +1454460587 37 Frank Stevens fstevens10@samsung.com Male 61.182.84.178 Philippines 3/19/1958 47326.14 VP Product Management +1454536874 38 Albert Martinez amartinez11@godaddy.com Male 76.139.124.119 Ukraine 11/11/1994 57220.55 Software Engineer III +1454504601 39 Stephanie Stewart sstewart12@elpais.com Female 104.98.138.203 4905603900430425379 Syria 2/11/1975 250118.59 Developer I +1454521301 40 Annie Stevens astevens13@slate.com Female 214.146.163.79 3553338148582934 South Africa 11/8/1983 12963.52 Systems Administrator I -1E2 +1454460788 41 Joyce Butler jbutler14@csmonitor.com Female 88.243.175.236 Indonesia 135825.27 +1454460615 42 Carlos Armstrong carmstrong15@technorati.com Male 85.22.216.153 3532000356234436 Indonesia 23446.58 +1454537073 43 Frances Kelly fkelly16@springer.com Female 146.38.150.164 4026344347458956 China 242916.36 +1454507861 44 Amanda Pierce apierce17@phpbb.com Female 214.208.248.216 201678379872880 Faroe Islands 6/1/1990 38037.1 Software Test Engineer II 
test
 +1454464352 45 Alan Torres atorres18@histats.com Male 117.124.224.32 4844818559255911 Israel 114759.77 +1454528513 46 Nancy Brown nbrown19@lycos.com Female 98.103.84.222 4041378619584967 Portugal 9/16/1972 170596.79 GIS Technical Architect +1454518979 47 Kenneth Larson klarson1a@cnet.com Male 71.35.49.21 Philippines 2/3/1990 178010.01 Staff Scientist +1454536052 48 Thomas Lawson tlawson1b@canalblog.com Male 209.50.87.12 50201361710870252 Ukraine 10/5/1987 35118.14 Software Test Engineer II +1454488725 49 Debra Gomez dgomez1c@lycos.com Female 26.107.134.220 30508009555281 China 9/10/1979 129186.15 Electrical Engineer +1454489047 50 Deborah Price dprice1d@google.nl Female 207.145.225.232 4055636387933119 Russia 1/26/1983 165945.4 Dental Hygienist ␡ +1454478467 51 Diane Banks dbanks1e@wikispaces.com Female 22.253.228.131 China 39139.44 +1454468949 52 Marie Woods mwoods1f@bbc.co.uk 41.109.183.128 Russia 2/20/1989 \N Human Resources Manager +1454489570 53 Randy Romero rromero1g@tamu.edu Male 134.90.91.230 Indonesia 11/30/1960 230039.26 Professor +1454528266 54 Brandon Fox bfox1h@ocn.ne.jp Male 157.130.211.215 6391404048298002 China 2/1/1979 223567.43 Programmer III +1454513948 55 Albert Smith asmith1i@jalbum.net Male 167.84.86.133 3530479136988416 Ukraine 263457.42 +1454467976 56 Jeremy Black jblack1j@sphinn.com Male 181.85.144.139 Poland 194896.66 +1454463146 57 Marilyn Shaw mshaw1k@bloomberg.com Female 141.42.43.91 30110642387063 China 178473.04 +1454540383 58 Stephanie Diaz sdiaz1l@who.int Female 127.174.128.199 3571927033182087 Indonesia 3/25/1974 135570.75 Paralegal +1454492347 59 Christopher Reynolds creynolds1m@sun.com Male 81.89.26.14 China 5/29/1956 147519.69 Account Executive +1454529565 60 Douglas Holmes dholmes1n@weather.com Male 99.22.29.208 Honduras 11/29/2000 45372.51 VP Accounting œ∑´®†¥¨ˆøπ“‘ +1454485707 61 Howard Rogers hrogers1o@sciencedirect.com Male 222.229.220.65 Ukraine 2/26/1995 143231.21 Account Executive +1454489894 62 Melissa Washington mwashington1p@cmu.edu Female 32.151.71.144 374288910553246 Czech Republic 2/24/1966 266547.15 Human Resources Manager +1454541195 63 Margaret Flores mflores1q@usnews.com Female 108.42.248.249 France 8/25/1999 110594.3 Data Coordiator +1454458233 64 Rose Fernandez rfernandez1r@usgs.gov Female 199.141.221.229 3564435193511524 Brazil 5/5/1972 196329.18 Senior Cost Accountant +1454472500 65 Julie Mendoza jmendoza1s@unesco.org Female 137.192.7.121 3586331607810566 Cuba 149157.14 +1454515883 66 Earl Sanders esanders1t@github.com Male 179.122.203.141 3561742181897127 Vietnam 215545.14 𠜎𠜱𠝹𠱓𠱸𠲖𠳏 +1454460569 67 Eric Armstrong earmstrong1u@arizona.edu Male 128.202.252.112 4041590574307 Indonesia 5/30/1973 75347.18 Web Designer II +1454532395 68 Joyce Perez jperez1v@dmoz.org Female 145.86.183.96 Canada 3/29/1975 115579.36 Director of Sales +1454524697 69 Sanchez Female 100.163.22.106 Russia 127045.66 +1454489862 70 Laura Romero lromero1x@godaddy.com Female 237.131.116.77 3539134691869631 Madagascar 12/20/1957 208213.96 Business Systems Development Analyst +1454538359 71 Maria Thomas mthomas1y@lycos.com Female 12.113.23.220 5602229580950679 China 10/29/1990 88961.11 Nurse +1454520121 72 Victor Romero vromero1z@reference.com Male 208.79.116.61 6767842086446946518 Brazil 209207.14 +1454510241 73 Betty Hayes bhayes20@goo.ne.jp Female 153.254.225.4 201881044698306 Jordan 3/9/1970 173372.32 VP Accounting +1454465142 74 Roger Jacobs rjacobs21@rediff.com Male 51.122.147.153 36548589951538 Benin 7/18/1977 18545.32 Paralegal 1/2 +1454470850 75 Ruth Thompson rthompson22@reuters.com Female 220.41.116.217 67067442144878124 Croatia 6/30/1972 167279 Account Executive ヽ༼ຈل͜ຈ༽ノ ヽ༼ຈل͜ຈ༽ノ +1454515259 76 Theresa James tjames23@un.org Female 31.135.76.146 China 12/28/1974 188732.88 Financial Advisor +1454517695 77 Pamela Collins pcollins24@nih.gov Female 21.45.74.249 490591529416018576 Moldova 7/28/1998 252394.72 Marketing Assistant 🚾 🆒 🆓 🆕 🆖 🆗 🆙 🏧 +1454523543 78 Adam Ward award25@telegraph.co.uk Male 242.85.131.30 201794641891036 Brazil 276446.24 +1454458334 79 Robin Price rprice26@jugem.jp Female 235.141.108.176 5610389618618837 Russia 1/7/1977 120293.75 Biostatistician IV +1454529469 80 Barbara Ryan bryan27@usda.gov Female 58.0.103.48 30526192141883 Philippines 198959.68 +1454497076 81 Melissa Gibson mgibson28@census.gov Female 54.212.104.159 3529828486403520 Bhutan 7/29/1990 224163.74 Senior Developer +1454467979 82 Carolyn Morris cmorris29@cbslocal.com Female 86.106.24.230 Portugal 2/12/1958 87727.95 Quality Engineer 0.00 +1454484623 83 Stephen Harris sharris2a@un.org Male 247.19.48.100 Russia 4/9/1983 284559.55 Product Engineer ١٢٣ +1454476730 84 Linda Campbell lcampbell2b@mapy.cz Female 28.62.77.24 6759510168753943 Peru 2/27/1982 16435.84 VP Quality Control ␡ +1454463822 85 Brian Daniels bdaniels2c@ovh.net Male 143.36.66.196 Ecuador 7/6/1966 148952.4 Information Systems Manager +1454458337 86 West Female 247.72.186.254 3541609903446548 Indonesia 12/11/1984 132544.98 Physical Therapy Assistant +1454518267 87 Timothy Moore tmoore2e@printfriendly.com Male 109.229.170.253 Samoa 42697.58 +1454523368 88 Eric Walker ewalker2f@mozilla.com Male 243.173.35.155 Thailand 5/29/1970 48715.81 Engineer IV +1454486082 89 Maria Arnold marnold2g@google.com.br Female 58.58.77.228 3589928770150089 Uruguay 3/14/1956 64067 Geological Engineer +1454541738 90 Edward Garza egarza2h@moonfruit.com Male 43.21.138.236 New Zealand 3/27/1965 139025.58 Structural Analysis Engineer +1454490484 91 Alice Young ayoung2i@typepad.com Female 120.255.189.145 630468343049978318 Serbia 4/18/1981 17663.49 Automation Specialist I +1454512586 92 Kenneth Powell kpowell2j@unicef.org Male 238.251.71.34 3586683330377036 Philippines 2/10/1955 68010.82 Social Worker +1454472784 93 Kelly Bell kbell2k@hud.gov Female 176.210.241.20 Russia 11/17/1984 57640.41 Web Developer I   +1454490007 94 David Garcia dgarcia2l@tmall.com Male 100.18.61.166 Paraguay 201297.71 +1454504627 95 Maria Harvey mharvey2m@nydailynews.com Female 192.209.117.213 67593619471737741 Mongolia 283649.67 +1454505519 96 Chris Hall chall2n@imageshack.us Male 241.96.162.44 5594268668744901 Russia 1/3/1964 67656.08 Web Designer II +1454481847 97 Roger Simpson rsimpson2o@nymag.com Male 80.110.89.28 493618903455317947 Indonesia 76354.79 +1454515032 98 Richard Nelson rnelson2p@simplemachines.org Male 43.54.4.82 Brazil 237205.58 NIL +1454461907 99 Ruth Howell rhowell2q@cornell.edu Female 190.170.191.14 China 5/2/1969 286113.38 Senior Quality Engineer +1454524115 100 Judith Garza jgarza2r@usnews.com Female 204.216.154.40 Ecuador 6/22/1962 256786.42 Teacher +=== Try load data from userdata4.parquet +1454599685 1 Howard Morgan hmorgan0@typepad.com 158.178.195.62 Colombia 12/2/1992 \N Data Coordiator +1454581720 2 Jessica Schmidt jschmidt1@google.com Female 168.118.247.35 3565285464047941 Luxembourg 4/14/1995 222396.46 Research Nurse nil +1454608896 3 Beverly Flores bflores2@wikipedia.org Female 51.97.88.173 Sweden 2/15/1965 141112.8 Actuary +1454575874 4 Marilyn Sanchez msanchez3@intel.com Female 186.206.142.162 China 8/6/1969 87914.29 Structural Engineer +1454567588 5 Janice Mitchell jmitchell4@sina.com.cn Female 205.187.116.241 5610719759939376962 Poland 7/4/1995 269297.4 Systems Administrator I +1454545227 6 William Williamson wwilliamson5@trellian.com Male 44.86.73.201 201849487683564 Indonesia 12/6/1993 95352.25 Librarian 1E+02 +1454602212 7 Jack James jjames6@sogou.com Male 59.184.76.208 3552911855395632 Indonesia 11/25/1968 82549.73 Compensation Analyst ‪‪test‪ +1454556325 8 Jesse Arnold jarnold7@soup.io Male 7.25.90.13 5100177285965756 Brazil 10/19/1987 257968.86 Executive Secretary +1454622627 9 Lori Woods lwoods8@fastcompany.com Female 147.157.215.9 4844532485570190 Indonesia 12/26/1975 186145.91 Health Coach I +1454601455 10 Juan Evans jevans9@zimbio.com Male 150.132.218.181 3578802610769023 Philippines 5/29/1988 129369.52 Social Worker +1454579490 11 Roy Matthews rmatthewsa@ucsd.edu Male 203.239.85.224 5100135134598509 Russia 192057.84 +1454586145 12 Kenneth King kkingb@zimbio.com 9.103.96.206 675913564329481832 Greece \N +1454568600 13 Raymond Green rgreenc@fc2.com Male 163.9.101.43 United States 1/28/1984 225094.01 Budget/Accounting Analyst III +1454603300 14 Lillian Stephens lstephensd@psu.edu Female 31.50.183.23 630455284969060148 Finland 6/1/1973 19354.85 Information Systems Manager +1454560697 15 Mary Gonzales mgonzalese@wired.com Female 91.42.17.109 3560985473023370 France 5/7/1966 23746.36 Compensation Analyst +1454561895 16 Roger Mason rmasonf@newyorker.com Male 169.33.172.204 3545036194973129 Norway 165855.47 +1454604198 17 Diane Cole dcoleg@unesco.org Female 157.11.85.209 Philippines 6/9/1994 105028.67 Assistant Manager +1454601270 18 Annie Hunt ahunth@ocn.ne.jp Female 169.47.232.187 5100177440436305 Poland 3/30/1992 266071.6 Legal Assistant +1454600872 19 Jacqueline Bradley jbradleyi@epa.gov Female 83.241.214.77 5100131814165289 Indonesia 12/1/1971 55440.88 Dental Hygienist +1454600248 20 Kathy Russell krussellj@joomla.org Female 158.32.89.44 3585627581021729 Indonesia 11/20/1999 29602.23 Sales Representative +1454551378 21 Beverly Barnes bbarnesk@europa.eu Female 189.157.45.179 3548552521258155 Bulgaria 4/21/1956 37295.89 Human Resources Assistant II +1454604764 22 Roy Morris rmorrisl@scribd.com 201.51.139.86 China \N +1454569146 23 Alice Ramos aramosm@utexas.edu Female 185.168.142.9 374622349140748 Philippines 4/20/1966 138021.54 Paralegal +1454597325 24 Todd Kelly tkellyn@fotki.com Male 46.19.203.86 4041599550654 Portugal 3/14/1998 84343.96 Executive Secretary () { _; } >_[$($())] { touch /tmp/blns.shellshock2.fail; } +1454551797 25 Lawrence Ramos lramoso@imageshack.us Male 5.96.81.47 5010121401502407 Palestinian Territory 1/26/1994 265545.92 Operator +1454605654 26 Jennifer Rogers jrogersp@so-net.ne.jp Female 31.48.54.193 5610097864736794573 Yemen 6/5/1992 138365.1 Computer Systems Analyst II +1454603775 27 Kimberly Morgan kmorganq@seesaa.net Female 154.61.255.47 China 14486.75 0/0 +1454606635 28 Jessica Marshall jmarshallr@mtv.com Female 164.101.35.148 3531025977662047 Brazil 7/2/1987 216211.96 VP Accounting +1454597817 29 Katherine Gordon kgordons@phoca.cz Female 248.30.182.15 5602230546469168 Italy 10/11/1956 48478.51 Librarian +1454557995 30 Jennifer Phillips jphillipst@pcworld.com Female 61.30.215.16 5100179891124018 Sweden 9/3/1967 254808.27 Software Consultant +1454613512 31 Gerald Nguyen gnguyenu@seesaa.net Male 9.13.167.17 67717376159922001 China 9/3/1972 285571.49 Tax Accountant +1454625134 32 Rose Ellis rellisv@walmart.com Female 250.88.7.15 3580333318847248 China 4/23/1987 47695.25 Systems Administrator II 和製漢語 +1454622672 33 Margaret Grant mgrantw@bbb.org Female 227.165.116.192 3565645038486711 Slovenia 12/10/1992 106452.61 Account Coordinator +1454568796 34 Jessica Wells jwellsx@blogtalkradio.com Female 185.189.187.186 Azerbaijan 9/13/1996 173164.24 Project Manager +1454582324 35 Henry Jenkins hjenkinsy@mit.edu Male 10.83.90.235 5602221853972654 China 11/12/1975 25740.85 Recruiter 田中さんにあげて下さい +1454545876 36 Earl Mccoy emccoyz@bigcartel.com Male 161.179.122.154 5038877150819047588 Japan 10/12/1976 114766.43 Software Test Engineer IV 0.00 +1454618571 37 Paul Knight pknight10@google.cn Male 182.38.37.173 5020715558032859593 Ukraine 10/25/1971 199366 Social Worker +1454576590 38 Martha Clark mclark11@usda.gov 189.166.203.239 South Korea \N +1454601033 39 Clarence Bryant cbryant12@bigcartel.com Male 120.218.175.241 Poland 9/1/1968 257075.65 Professor 田中さんにあげて下さい +1454548319 40 Joan Price jprice13@mtv.com 233.4.158.135 3584182571037112 Portugal \N +1454573152 41 Anthony Ford aford14@chicagotribune.com Male 100.240.61.163 Iran 6/26/1992 152800.71 Senior Cost Accountant +1454595667 42 Roger Henderson rhenderson15@sitemeter.com Male 206.185.213.252 3560757094744860 Brazil 6/26/1970 40949.78 Nurse +1454591751 43 Kenneth Butler kbutler16@youtu.be Male 2.12.57.207 3586795027670612 Thailand 3/26/1987 165121.43 Research Assistant IV +1454566774 44 Kenneth Wright kwright17@google.de Male 241.213.136.95 5602246924892961 Belarus 10/15/1995 227583.86 Speech Pathologist +1454617513 45 Aaron Smith asmith18@flickr.com Male 185.244.9.145 China 11/25/1972 286108.94 Paralegal +1454574169 46 Amy Matthews amatthews19@t.co Female 206.172.83.152 5002357749310919 China 39365.73 +1454586102 47 Janet Cooper jcooper1a@dailymotion.com Female 9.148.129.197 Comoros 8/2/1968 168391.72 Senior Cost Accountant +1454601994 48 Russell Stewart rstewart1b@edublogs.org Male 113.23.229.63 675993663890158630 Thailand 4/17/1963 57609.96 Senior Editor +1454582839 49 Howard Elliott helliott1c@illinois.edu Male 225.208.151.89 3577055641640512 Mongolia 176999.03 +1454573932 50 Keith Lane klane1d@eventbrite.com Male 250.24.9.55 Russia 5/27/1983 80452.19 Budget/Accounting Analyst II +1454583292 51 Jimmy Richardson jrichardson1e@vimeo.com Male 152.87.188.99 China 6/30/1960 194774.28 Assistant Manager ❤️ 💔 💌 💕 💞 💓 💗 💖 💘 💝 💟 💜 💛 💚 💙 +1454623280 52 Justin Bryant jbryant1f@github.com Male 245.48.63.169 3562259518717901 Guatemala 10/28/1960 144419.21 Database Administrator III +1454582337 53 Ruby Allen rallen1g@cyberchimps.com Female 238.148.148.156 3541217939068433 Japan 248388.64 +1454578101 54 Ward Male 120.88.247.59 Russia 125075.78 +1454546163 55 Nancy Stephens nstephens1i@godaddy.com Female 211.0.225.116 Mongolia 20805.69 +1454580277 56 Dorothy Kennedy dkennedy1j@mlb.com Female 177.229.94.96 Indonesia 3/26/1984 118098.45 Legal Assistant +1454597567 57 Katherine Ferguson kferguson1k@google.cn Female 185.67.150.20 5038883804496681778 Russia 1/28/1982 255040.89 Chemical Engineer +1454609494 58 Norma Daniels ndaniels1l@adobe.com Female 72.161.56.76 5602256058813840 Lithuania 5/30/1986 228396.52 Junior Executive +1454549169 59 John Rogers jrogers1m@miitbeian.gov.cn Male 91.131.170.178 3578552255653202 Croatia 9/25/1971 164207.53 Administrative Assistant III +1454627177 60 Lisa Nguyen lnguyen1n@phpbb.com Female 99.51.36.31 3587343436670904 Ghana 6/10/1970 213963.71 Research Nurse +1454564279 61 Roy Carter rcarter1o@cmu.edu Male 154.176.171.103 3581163353975466 Germany 7/21/1980 216294.79 Marketing Manager +1454546835 62 Donna Gonzalez dgonzalez1p@instagram.com Female 81.57.136.186 China 3/3/1975 181562.45 Junior Executive +1454610240 63 Medina Female 84.135.250.216 3579667388606106 Indonesia 7/18/1958 80267.81 Accounting Assistant III +1454613635 64 Samuel Bishop sbishop1r@npr.org Male 87.38.89.122 3534693555244475 Indonesia 97009.57 +1454551032 65 Jerry Bradley jbradley1s@umn.edu Male 184.79.105.210 5602258009829107 China 3/13/1984 50863.85 Junior Executive +1454555641 66 Ralph Castillo rcastillo1t@nba.com Male 96.246.167.130 6373313274491359 United States 5/14/1986 13099.91 Health Coach III +1454615262 67 Margaret Vasquez mvasquez1u@tuttocitta.it Female 206.79.16.146 Poland 2/19/1973 281677.49 Quality Engineer +1454564143 68 Shawn Payne spayne1v@privacy.gov.au Male 233.32.138.222 6380689013620353 China 5/29/1996 152175.99 Help Desk Operator +1454560234 69 Bonnie Hart bhart1w@networkadvertising.org Female 92.158.145.51 5100141023990187 Philippines 8/10/1976 270525.27 Clinical Specialist +1454557523 70 Ruby Phillips rphillips1x@google.com.hk Female 180.71.236.34 Russia 12/29/1980 175991.04 Analog Circuit Design manager +1454615738 71 Michael Watkins mwatkins1y@infoseek.co.jp Male 20.48.165.57 6304600968704640 United States 277599.55 +1454549243 72 Walter Hill whill1z@fda.gov Male 169.189.26.193 Philippines 4/25/1989 170789.26 Executive Secretary +1454590835 73 Deborah Garcia dgarcia20@ehow.com Female 176.149.163.227 3578754434491831 Brazil 213787.81 !@#$%^&*() +1454592567 74 Sandra Lee slee21@hatena.ne.jp Female 196.212.29.124 China 12/25/1976 190399.56 Assistant Media Planner ../../../../../../../../../../../etc/passwd%00 +1454570808 75 Steve Shaw sshaw22@photobucket.com Male 56.32.41.109 3561652394394350 Macedonia 3/2/1961 180130.01 Recruiting Manager +1454627208 76 Jerry Hansen jhansen23@newyorker.com Male 180.99.147.201 36652106508977 Ukraine 4/27/1992 201900.61 Chief Design Engineer +1454595596 77 Joshua Harris jharris24@china.com.cn Male 93.173.2.87 3566428334927244 Greece 8/27/1987 189392.3 Account Representative III +1454615457 78 Clarence Simmons csimmons25@dailymotion.com Male 30.117.30.162 3571762129017388 Philippines 180434.25 +1454604481 79 Denise Bishop dbishop26@wsj.com Female 251.230.214.155 3556286320706184 Philippines 10/18/1999 194426.62 Geologist II +1454614660 80 Jason Warren jwarren27@shop-pro.jp Male 197.52.56.75 4913424719275497 China 8/26/1998 92571.41 Accounting Assistant II +1454592347 81 Jesse Reynolds jreynolds28@amazon.com 46.11.66.226 Portugal 10/6/1977 \N Administrative Officer +1454579746 82 Ruby Lynch rlynch29@xing.com Female 50.190.120.2 340177638737200 Portugal 5/7/1981 159634.3 Sales Associate +1454578991 83 Phillip Olson polson2a@marriott.com Male 38.205.137.200 4905640692662084 Indonesia 1/8/1987 161622.19 Assistant Media Planner +1454574785 84 Sean Watkins swatkins2b@ft.com Male 22.52.43.242 6759770945991352 China 2/7/1964 103943.54 Senior Financial Analyst +1454603364 85 Teresa Parker tparker2c@shinystat.com Female 36.134.254.22 4844522554899455 China 11/24/1987 137739.95 Chief Design Engineer +1454629483 86 Anthony Harris aharris2d@uiuc.edu Male 142.3.139.220 China 2/26/1975 194926.38 Senior Quality Engineer +1454617821 87 Donna Ray dray2e@wikimedia.org Female 122.113.90.100 3548062974262878 Peru 7/24/1964 121072.45 Clinical Specialist åß∂ƒ©˙∆˚¬…æ +1454567199 88 Craig Lewis clewis2f@purevolume.com Male 106.156.113.218 3535698276698452 Slovenia 113013.98 +1454606687 89 Adam Turner aturner2g@delicious.com Male 94.92.15.85 3530109929436477 Sweden 3/18/1976 233715.21 Nurse Practicioner +1454565501 90 Terry Parker tparker2h@hc360.com Male 189.36.77.133 China 4/2/1987 232623.76 GIS Technical Architect +1454604198 91 Juan Shaw jshaw2i@ehow.com Male 222.127.83.190 493610712595084582 Democratic Republic of the Congo 220779.8 +1454592729 92 Nicole Russell nrussell2j@angelfire.com Female 247.123.224.36 4120730296866808 Germany 90748.17 +1454563310 93 Robin Ray rray2k@t.co Female 217.150.228.185 Sweden 9/28/1968 175995.93 Human Resources Assistant III """" +1454546406 94 Debra Sims dsims2l@meetup.com Female 150.198.93.159 5602215295621929 Brazil 12/21/1984 276704.96 Office Assistant IV +1454550946 95 Teresa Harrison tharrison2m@t.co Female 111.107.40.16 5007666196554596 Philippines 5/12/1959 129967.9 GIS Technical Architect +1454603302 96 Tammy Ward tward2n@51.la Female 148.119.68.255 3568303818489466 France 8/20/1984 63550.31 General Manager +1454605950 97 Louis Harrison lharrison2o@usgs.gov Male 134.95.151.68 5100179516595931 Ukraine 9/27/1986 169379.73 Payment Adjustment Coordinator +1454579744 98 Charles Simpson csimpson2p@mashable.com Male 241.0.124.209 3562073915241617 Sweden 9/20/1956 116909.68 Biostatistician IV +1454584629 99 Maria Richards mrichards2q@rediff.com Female 108.13.82.54 Azerbaijan 1/23/1978 34000.68 Clinical Specialist 社會科學院語學研究所 +1454622328 100 Diana Hall dhall2r@oaic.gov.au Female 6.215.107.104 3528227609255704 Russia 8/29/1996 221168.13 Assistant Professor +=== Try load data from userdata5.parquet +1454582047 1 Kelly Ortiz kortiz0@omniture.com Female 252.115.158.159 3537905681760845 Russia 4/23/1980 277302.99 Nurse +1454626441 2 Sharon Carroll scarroll1@disqus.com Female 29.217.252.62 56022458507191696 Indonesia 8/28/1992 209258.05 Recruiter åß∂ƒ©˙∆˚¬…æ +1454608790 3 Ruth Ross rross2@cbc.ca Female 220.224.80.32 3589642396435648 Benin 6/13/1994 18270.7 Design Engineer +1454601797 4 Kelly Meyer kmeyer3@cornell.edu Female 255.65.123.124 Philippines 1/6/1967 17485.27 Cost Accountant +1454584344 5 Irene Jordan ijordan4@pagesperso-orange.fr Female 162.57.23.136 3576848317807089 United States 1/4/1997 163979.38 Programmer Analyst III +1454547199 6 Irene Wells iwells5@fema.gov Female 85.5.67.113 Iran 74337.42 +1454604109 7 Jessica Grant jgrant6@gov.uk Female 127.235.63.12 3536345996536989 Ecuador 1/27/1969 128665.86 Payment Adjustment Coordinator +1454549472 8 Norma Wright nwright7@prweb.com Female 81.219.156.187 63047796765720509 Indonesia 6/27/1997 68907.46 Office Assistant III +1454611735 9 Brandon Snyder bsnyder8@artisteer.com Male 102.118.191.191 490339322609872711 Malta 10/6/1981 71646.15 Physical Therapy Assistant +1454610256 10 Stephanie Reed sreed9@who.int Female 175.52.228.75 502081312903167845 Afghanistan 8/27/1957 137924.13 Recruiter 
test
 +1454565105 11 Jane Armstrong jarmstronga@state.gov 202.44.98.126 374283443294665 China 10/30/1991 \N Associate Professor +1454607247 12 Donna Coleman dcolemanb@upenn.edu Female 178.9.167.99 Vietnam 11/21/1957 93283.06 Librarian +1454567839 13 Samuel Butler sbutlerc@hp.com Male 129.114.220.80 3587725229492688 Colombia 9/12/1984 208303.6 Compensation Analyst +1454567413 14 Jerry Medina jmedinad@youtu.be Male 87.0.152.222 3579766249568578 Japan 8/30/1988 53502.26 Registered Nurse +1454603317 15 Samuel Lane slanee@i2i.jp Male 225.20.25.160 Canada 9/6/1983 142643.38 GIS Technical Architect ❤️ 💔 💌 💕 💞 💓 💗 💖 💘 💝 💟 💜 💛 💚 💙 +1454630090 16 Kathy Rice kricef@independent.co.uk Female 4.200.99.226 6709951086431189768 Philippines 52614.1 +1454575979 17 Adam Woods awoodsg@mapy.cz Male 229.247.245.218 3580417672766100 Indonesia 12/8/1987 284906.49 Payment Adjustment Coordinator +1454555573 18 Theresa Ellis tellish@nydailynews.com Female 39.249.101.160 Belarus 6/18/1966 35216.95 Sales Representative +1454555343 19 Christopher Brooks cbrooksi@intel.com Male 252.52.58.13 China 119492.57 +1454544139 20 Debra White dwhitej@umn.edu Female 142.140.184.111 Indonesia 47859.54 +1454559526 21 Alice Ward awardk@cafepress.com Female 14.157.183.41 3554057857533990 Vietnam 5/7/1977 117790.3 Technical Writer +1454597106 22 Tina Wood twoodl@businesswire.com Female 201.242.103.145 3568980472135848 Sweden 3/28/1969 47283.17 Staff Scientist +1454591306 23 Carolyn Mendoza cmendozam@army.mil 214.205.231.22 Greece \N ␡ +1454611603 24 Craig Ford cfordn@vistaprint.com Male 236.178.217.229 633110713949459104 Indonesia 12/22/1996 274187.59 Dental Hygienist +1454618551 25 Christine Morrison cmorrisono@ask.com Female 219.71.212.187 3538407669945679 Tanzania 3/12/1991 84756.66 Executive Secretary 社會科學院語學研究所 +1454580024 26 Janice Dean jdeanp@statcounter.com Female 49.234.145.208 3537160378882698 Ukraine 8/21/1991 217443.08 Administrative Assistant III +1454558127 27 Joan Burton jburtonq@oaic.gov.au Female 221.227.41.244 201770241278691 China 4/6/1993 256763.22 Staff Accountant I \N +1454619460 28 Brandon Stone bstoner@discovery.com Male 1.106.6.30 30535344906416 Indonesia 7/13/1964 166396.41 Health Coach II +1454571966 29 Sarah Hall shalls@loc.gov Female 235.168.89.65 3528746985103311 Czech Republic 11/13/1959 123411.44 Assistant Manager +1454569447 30 Kelly Crawford kcrawfordt@typepad.com Female 152.220.24.54 3578225435679583 Poland 10/21/1970 115305.8 Chief Design Engineer +1454609438 31 Maria Banks mbanksu@google.co.uk Female 107.120.193.133 5602224764294077 Italy 10/29/1981 213273.21 Financial Analyst +1454546937 32 Roy Simmons rsimmonsv@telegraph.co.uk Male 21.20.158.183 5602244835346375 Mongolia 6/27/1994 13987.6 Senior Editor "<>?:""{}|_+" +1454611880 33 Judith Williamson jwilliamsonw@hubpages.com Female 128.75.193.80 3540423032294659 Indonesia 10/19/1975 35326.68 Senior Sales Associate +1454567714 34 Joe Arnold jarnoldx@soundcloud.com Male 170.118.207.254 4017955870878 Morocco 1/11/1991 261893.92 Mechanical Systems Engineer +1454605829 35 Richard Griffin rgriffiny@barnesandnoble.com Male 180.74.211.58 3539729371124817 Philippines 8/23/1964 43742.89 Nurse +1454607440 36 Billy Freeman bfreemanz@fda.gov Male 223.238.104.92 Sweden 5/19/1961 185185.85 Office Assistant I +1454601803 37 Shawn Welch swelch10@oaic.gov.au Male 239.144.169.67 Brazil 45785.65 ‪‪test‪ +1454626608 38 Kenneth Price kprice11@tamu.edu Male 121.107.99.253 372301962802254 China 3/1/1958 110448 Senior Sales Associate +1454612578 39 Patricia Lawson plawson12@dailymotion.com Female 181.201.209.42 6761282787969476 Czech Republic 4/6/1956 126454.68 Staff Accountant I +1454544201 40 Christine Alexander calexander13@aboutads.info Female 163.32.3.92 50183677518131890 China 1/14/1981 213713.99 Sales Associate +1454599667 41 Mark Wagner mwagner14@imageshack.us Male 78.141.201.64 5007660710388524 China 3/10/1987 207149.01 Staff Scientist +1454624139 42 Richard Armstrong rarmstrong15@baidu.com Male 229.173.184.111 3546008978147005 Indonesia 9/6/1961 52279.16 Software Engineer II +1454618327 43 Phillip Ellis pellis16@berkeley.edu Male 183.182.90.8 3561054399919267 Brazil 1/31/1994 59681.04 Analog Circuit Design manager \N +1454614376 44 Beverly Perry bperry17@nasa.gov Female 47.117.191.34 Vietnam 9/15/1983 41351.4 Database Administrator IV 1E+02 +1454559810 45 Carolyn Parker cparker18@soup.io Female 124.227.162.209 3555739550936724 Belarus 1/29/1988 162142.52 Chemical Engineer +1454605899 46 Martin Knight mknight19@umn.edu Male 173.169.240.26 5387225346178705 China 9/4/1994 200217.98 Assistant Professor +1454580952 47 Michael Stephens mstephens1a@altervista.org Male 181.48.175.67 Honduras 9/10/1958 248987 Environmental Specialist +1454545483 48 Frances Willis fwillis1b@linkedin.com 102.186.57.75 4175001067968122 Philippines 8/3/1998 \N VP Marketing +1454618611 49 Gary Fox gfox1c@paginegialle.it Male 80.221.129.42 Belgium 261175.89 +1454605416 50 Cynthia Bailey cbailey1d@microsoft.com Female 210.74.99.47 Indonesia 4/23/1989 38171.71 Sales Associate +1454547938 51 Terry Mitchell tmitchell1e@soundcloud.com Male 64.34.240.165 Peru 101626.65 +1454607980 52 Edward Webb ewebb1f@123-reg.co.uk Male 208.114.99.74 6386981481832436 Jordan 235457.76 +1454544152 53 Ralph Simmons rsimmons1g@google.cn Male 180.159.250.232 3554040768947822 Pakistan 111413.03 +1454606074 54 Sara Kelly skelly1h@wix.com Female 97.243.219.196 3560161969850482 Portugal 12/11/1963 185788.86 Chief Design Engineer +1454577433 55 Donna Dean ddean1i@ftc.gov Female 91.232.196.181 Indonesia 285481.87 +1454545198 56 Jane Murray jmurray1j@apache.org Female 174.82.82.71 5100149053428994 China 7/15/1973 57832.83 Software Consultant +1454582927 57 Walter Cook wcook1k@webnode.com Male 4.223.17.187 5048374925679138 China 7/19/1979 164010.7 Accounting Assistant IV +1454553504 58 Bonnie Hanson bhanson1l@squidoo.com Female 209.131.133.80 3546400025538536 China 8/6/1989 207065.08 Recruiter +1454583403 59 Patrick Kelly pkelly1m@usgs.gov Male 92.132.67.51 30129138653846 Poland 10/22/1984 281404.55 Librarian +1454551706 60 George Ross gross1n@sciencedaily.com Male 77.33.183.49 201938854334636 Portugal 2/17/1986 96243.17 Teacher +1454572199 61 Joan Harvey jharvey1o@biglobe.ne.jp Female 244.175.30.138 5479197462183554 Indonesia 12/30/1974 269498 Nurse Practicioner åß∂ƒ©˙∆˚¬…æ +1454555502 62 Louise Stone lstone1p@1und1.de Female 230.79.20.66 Indonesia 1/14/1980 44528.64 Senior Editor +1454597662 63 Lawrence Pierce lpierce1q@ihg.com Male 35.230.80.125 6763027632739915 Indonesia 7/22/1982 269467.08 Human Resources Assistant IV +1454577961 64 Dorothy Gray dgray1r@vimeo.com Female 206.99.76.117 3582462082297450 China 10/8/1975 58802.03 Staff Scientist -1.00 +1454578138 65 Shawn Larson slarson1s@sohu.com Male 233.109.124.208 3557232712378033 Pakistan 6/11/1987 24566.92 Programmer I +1454620878 66 Ashley Carter acarter1t@weather.com Female 120.243.16.33 5641823823569006485 Philippines 2/4/1999 181594.54 Technical Writer +1454608592 67 Bruce Gonzalez bgonzalez1u@behance.net Male 213.165.12.93 5602219496203313 Sweden 6/27/1975 152915.03 Social Worker +1454570547 68 Gary Porter gporter1v@nhs.uk Male 113.26.17.148 3551504699131924 China 10/15/1988 239398.41 VP Sales åß∂ƒ©˙∆˚¬…æ +1454623375 69 Kimberly Bell kbell1w@techcrunch.com Female 232.188.203.114 06048433236353334 Tanzania 239482.42 " +1454580645 70 James Torres jtorres1x@rakuten.co.jp Male 42.70.136.181 Brazil 3/19/1968 66432.01 Information Systems Manager +1454565683 71 Cheryl Williams cwilliams1y@clickbank.net 24.11.168.130 Latvia 9/28/1958 \N Quality Control Specialist +1454572298 72 Diane Hicks dhicks1z@noaa.gov Female 220.185.241.90 36196827669213 Honduras 11/20/1977 104365.11 Systems Administrator I +1454630150 73 Judith Brown jbrown20@acquirethisname.com Female 173.62.110.176 Czech Republic 12/26/1994 218616.17 Safety Technician IV +1454550898 74 Jesse Dixon jdixon21@bloglines.com Male 156.125.120.208 Syria 277530.58 (╯°□°)╯︵ ┻━┻) +1454560223 75 Timothy Garza tgarza22@tmall.com Male 56.172.71.231 Poland 4/1/1978 21103.66 Desktop Support Technician ␡ +1454549446 76 Gloria Washington gwashington23@hud.gov Female 249.63.88.116 3528613230855766 Portugal 10/17/1960 175586.21 Information Systems Manager +1454555260 77 Patricia Bell pbell24@youtu.be Female 20.46.164.228 3528267541114924 Honduras 1/31/1999 47750.6 Payment Adjustment Coordinator +1454579807 78 Theresa Clark tclark25@wp.com Female 178.250.150.112 6396247540156151 Indonesia 10/10/1989 78319.93 Executive Secretary +1454629649 79 Matthew Matthews mmatthews26@typepad.com Male 33.186.230.54 5213341713953768 Azerbaijan 10/4/1990 12883.34 Help Desk Technician +1454568333 80 Betty White bwhite27@github.com Female 128.110.102.181 3572999005932624 Morocco 12/6/1980 30998.69 Operator +1454559489 81 Christina Nguyen cnguyen28@washingtonpost.com Female 63.57.110.32 36954036240279 Philippines 7/23/1984 259707.25 Project Manager +1454575575 82 Norma Stevens nstevens29@newyorker.com Female 148.35.34.31 Brazil 7/24/1984 233848.07 Professor +1454547659 83 Tammy Walker twalker2a@craigslist.org Female 115.94.89.2 4508955158259501 China 1/1/1972 241046.96 Community Outreach Specialist +1454559813 84 Mark Jackson mjackson2b@utexas.edu Male 136.242.153.66 36666130651082 Philippines 12/9/1957 245352.11 Account Executive 部落格 +1454547442 85 Scott Washington swashington2c@bloomberg.com Male 79.185.72.100 6395647151650882 Brazil 2/17/1957 240505.52 Professor +1454577775 86 Margaret Franklin mfranklin2d@mapy.cz Female 139.209.240.12 501835281527257384 Brazil 72758.49 +1454582451 87 Carolyn Wilson cwilson2e@hp.com Female 5.172.62.195 3581164938009805 France 1/19/1997 162909.64 Librarian +1454608782 88 Emily Cole ecole2f@epa.gov 97.83.153.33 Burkina Faso 5/3/1996 \N Accounting Assistant IV 1.00 +1454544809 89 Carolyn Gutierrez cgutierrez2g@smh.com.au Female 109.77.234.103 Madagascar 2/13/1999 139612.73 Nurse +1454591667 90 Jose Wallace jwallace2h@about.com Male 250.231.81.57 Philippines 12/17/1983 213500.16 Design Engineer +1454561119 91 Charles Reed creed2i@independent.co.uk Male 28.212.235.149 4017954848825528 China 88039.86 +1454615732 92 Brian Parker bparker2j@hugedomains.com Male 143.67.111.179 Portugal 1/18/1996 202446.54 Executive Secretary +1454613613 93 Donald Fox dfox2k@webs.com Male 251.61.52.170 3553498748210516 Indonesia 12/19/1975 134745.75 Human Resources Manager +1454603200 94 Jack West jwest2l@biblegateway.com Male 115.144.142.60 Poland 10/30/1956 245162.49 Office Assistant I 1.00 +1454574412 95 Doris Gomez dgomez2m@tinypic.com Female 156.173.76.213 4041593860679 Colombia 8/28/1977 164689.56 Speech Pathologist +1454544624 96 Brandon Owens bowens2n@si.edu Male 5.39.151.46 4591258400528650 France 3/13/1998 74028.68 Software Engineer III +1454596449 97 Evelyn Wagner ewagner2o@sbwire.com Female 84.231.120.250 3571837377153521 China 1/5/1965 78692.34 Operator +1454545547 98 Timothy Boyd tboyd2p@imdb.com Male 211.20.45.168 5602253132446507 Peru 7/8/1976 127883.56 Data Coordiator +1454549050 99 Edward Gilbert egilbert2q@ocn.ne.jp Male 237.183.200.242 3586807595028188 Bangladesh 8/30/1956 214872.75 Senior Financial Analyst ᠎ +1454583513 100 Howard Patterson hpatterson2r@toplist.cz Male 200.77.150.4 3558592437934298 China 7/9/1991 23607 Administrative Assistant IV +=== Try load data from v0.7.1.all-named-index.parquet +0.22 65.1 61 337 3.87 3.78 2.49 Fair E VS2 +0.23 56.9 65 327 4.05 4.07 2.31 Good E VS1 +0.31 63.3 58 335 4.34 4.35 2.75 Good J SI2 +0.23 61.5 55 326 3.95 3.98 2.43 Ideal E SI2 +0.21 59.8 61 326 3.89 3.84 2.31 Premium E SI1 +0.29 62.4 58 334 4.2 4.23 2.63 Premium I VS2 +0.26 61.9 55 337 4.07 4.11 2.53 Very Good H SI1 +0.23 59.4 61 338 4 4.05 2.39 Very Good H VS1 +0.24 62.3 57 336 3.95 3.98 2.47 Very Good I VVS1 +0.24 62.8 57 336 3.94 3.96 2.48 Very Good J VVS2 +=== Try load data from v0.7.1.column-metadata-handling.parquet +1 0.1 2017-01-01 02:00:00 a 2017-01-01 02:00:00 +2 0.2 2017-01-02 02:00:00 b 2017-01-02 02:00:00 +3 0.3 2017-01-03 02:00:00 c 2017-01-03 02:00:00 +=== Try load data from v0.7.1.parquet +0.23 Ideal E SI2 61.5 55 326 3.95 3.98 2.43 0 +0.21 Premium E SI1 59.8 61 326 3.89 3.84 2.31 1 +0.23 Good E VS1 56.9 65 327 4.05 4.07 2.31 2 +0.29 Premium I VS2 62.4 58 334 4.2 4.23 2.63 3 +0.31 Good J SI2 63.3 58 335 4.34 4.35 2.75 4 +0.24 Very Good J VVS2 62.8 57 336 3.94 3.96 2.48 5 +0.24 Very Good I VVS1 62.3 57 336 3.95 3.98 2.47 6 +0.26 Very Good H SI1 61.9 55 337 4.07 4.11 2.53 7 +0.22 Fair E VS2 65.1 61 337 3.87 3.78 2.49 8 +0.23 Very Good H VS1 59.4 61 338 4 4.05 2.39 9 +=== Try load data from v0.7.1.some-named-index.parquet +0.22 65.1 61 337 3.87 3.78 2.49 Fair E VS2 +0.23 56.9 65 327 4.05 4.07 2.31 Good E VS1 +0.31 63.3 58 335 4.34 4.35 2.75 Good J SI2 +0.23 61.5 55 326 3.95 3.98 2.43 Ideal E SI2 +0.21 59.8 61 326 3.89 3.84 2.31 Premium E SI1 +0.29 62.4 58 334 4.2 4.23 2.63 Premium I VS2 +0.26 61.9 55 337 4.07 4.11 2.53 Very Good H SI1 +0.23 59.4 61 338 4 4.05 2.39 Very Good H VS1 +0.24 62.3 57 336 3.95 3.98 2.47 Very Good I VVS1 +0.24 62.8 57 336 3.94 3.96 2.48 Very Good J VVS2 diff --git a/dbms/tests/queries/0_stateless/00900_parquet_load.sh b/dbms/tests/queries/0_stateless/00900_parquet_load.sh new file mode 100755 index 00000000000..66fdd54a512 --- /dev/null +++ b/dbms/tests/queries/0_stateless/00900_parquet_load.sh @@ -0,0 +1,58 @@ +#!/usr/bin/env bash + +# +# Load all possible .parquet files found in submodules. +# TODO: Add more files. +# + +# To regenerate data install perl JSON::XS module: sudo apt install libjson-xs-perl + +# Also 5 sample files from +# wget https://github.com/Teradata/kylo/raw/master/samples/sample-data/parquet/userdata1.parquet +# ... +# wget https://github.com/Teradata/kylo/raw/master/samples/sample-data/parquet/userdata5.parquet + + +# set -x + +CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +. $CUR_DIR/../shell_config.sh + +CB_DIR=$(dirname "$CLICKHOUSE_CLIENT_BINARY") +[ "$CB_DIR" == "." ] && ROOT_DIR=$CUR_DIR/../../../.. +[ "$CB_DIR" != "." ] && BUILD_DIR=$CB_DIR/../.. +[ -z "$ROOT_DIR" ] && ROOT_DIR=$CB_DIR/../../.. + +DATA_DIR=$CUR_DIR/data_parquet + +# To update: +# cp $ROOT_DIR/contrib/arrow/cpp/submodules/parquet-testing/data/*.parquet $ROOT_DIR/contrib/arrow/python/pyarrow/tests/data/parquet/*.parquet $CUR_DIR/data_parquet/ + +# BUG! nulls.snappy.parquet - parquet-reader shows wrong structure. Actual structure is {"type":"struct","fields":[{"name":"b_struct","type":{"type":"struct","fields":[{"name":"b_c_int","type":"integer","nullable":true,"metadata":{}}]},"nullable":true,"metadata":{}}]} +# why? repeated_no_annotation.parquet + +for NAME in `ls -1 $DATA_DIR/*.parquet | xargs -n 1 basename | sort`; do + echo === Try load data from $NAME + + JSON=$DATA_DIR/$NAME.json + COLUMNS_FILE=$DATA_DIR/$NAME.columns + + # If you want change or add .parquet file - rm data_parquet/*.json data_parquet/*.columns + [ -n "$BUILD_DIR" ] && [ ! -s $COLUMNS_FILE ] && [ ! -s $JSON ] && $BUILD_DIR/contrib/arrow-cmake/parquet-reader --json $DATA_DIR/$NAME > $JSON + [ -n "$BUILD_DIR" ] && [ ! -s $COLUMNS_FILE ] && $CUR_DIR/00900_parquet_create_table_columns.pl $JSON > $COLUMNS_FILE + + # Debug only: + # [ -n "$BUILD_DIR" ] && $BUILD_DIR/contrib/arrow-cmake/parquet-reader $DATA_DIR/$NAME > $DATA_DIR/$NAME.dump + + #COLUMNS=`$CUR_DIR/00900_parquet_create_table_columns.pl $JSON` 2>&1 || continue + COLUMNS=`cat $COLUMNS_FILE` || continue + + ${CLICKHOUSE_CLIENT} --query="DROP TABLE IF EXISTS test.parquet_load" + ${CLICKHOUSE_CLIENT} --query="CREATE TABLE test.parquet_load ($COLUMNS) ENGINE = Memory" + + # Some files is broken, exception is ok. + cat $DATA_DIR/$NAME | ${CLICKHOUSE_CLIENT} --query="INSERT INTO test.parquet_load FORMAT Parquet" 2>&1 | sed 's/Exception/Ex---tion/' + + ${CLICKHOUSE_CLIENT} --query="SELECT * FROM test.parquet_load LIMIT 100" + ${CLICKHOUSE_CLIENT} --query="DROP TABLE test.parquet_load" +done diff --git a/dbms/tests/queries/0_stateless/data_parquet/alltypes_dictionary.parquet b/dbms/tests/queries/0_stateless/data_parquet/alltypes_dictionary.parquet new file mode 100644 index 0000000000000000000000000000000000000000..e6da6ab7bd81008c1686f04a3186265291aacac6 GIT binary patch literal 1698 zcmb7_ziSg=7{}jSu9wR-jivNC61d?8`%uBwyQC?}q#ZPES z$)SiiIu~(pauksc4k8W}1i`_h@zC_l060`z?6jUa){m_SA`kw^;YX&~fFlF0Ho!LI{TMRi}@#{$wWa?3)N zyRk7h{F=~!MP9PqYz7BTGwAsms)1*8B>Bu0#vfrA$70(LANyf@0ObLF5by;>Juml_ zIOJwp4J!yH!M~IEDLFs*`@#^MnqQ>u5Xtj_1@NmHQR1g0u z_?dD`IbVgtB>46O}CW>ix));$mr@O?@p!XTa zyvu4JMVDA=`wh3%wi-u+E1ak&_#}((i9~|DxGS}shi=0Hm42=XT$==^mx0{+_ED|$ zEn{8YH(mB8C5H$j9mPN|_^D15`PdJHmTn9O#_v7#wXBM4z2-NLtiaMAxyLQP8S3U{ansni zSG#|EueMXw*X@oU)b+BpRj$`<)AhXaR;g03i=Ja_+s?LEGF`_k7_RAgo>RHTzR~F3 HrGKY?14}7} literal 0 HcmV?d00001 diff --git a/dbms/tests/queries/0_stateless/data_parquet/alltypes_dictionary.parquet.columns b/dbms/tests/queries/0_stateless/data_parquet/alltypes_dictionary.parquet.columns new file mode 100644 index 00000000000..f354c0b0e31 --- /dev/null +++ b/dbms/tests/queries/0_stateless/data_parquet/alltypes_dictionary.parquet.columns @@ -0,0 +1 @@ +id Nullable(Int32), bool_col Nullable(UInt8), tinyint_col Nullable(Int32), smallint_col Nullable(Int32), int_col Nullable(Int32), bigint_col Nullable(Int64), float_col Nullable(Float32), double_col Nullable(Float64), date_string_col Nullable(String), string_col Nullable(String), timestamp_col Nullable(Int64) \ No newline at end of file diff --git a/dbms/tests/queries/0_stateless/data_parquet/alltypes_plain.parquet b/dbms/tests/queries/0_stateless/data_parquet/alltypes_plain.parquet new file mode 100644 index 0000000000000000000000000000000000000000..a63f5dca7c3821909748f34752966a0d7e08d47f GIT binary patch literal 1851 zcmb7F&ui0g6#pje+AM2l7<*qVv_zM;YQD;X!1G_`Ye@W}TbqmweOL$NPTX=lg!8G{0y<66Rp8 z2pS|Aqlfj;PSH-&mT4zwizU$p1|0Y`VGJoyS_YbwNId;`jBg|z+DN8!b`S=|Sr$Ee51+|8u<)E>*X#arx$Xz24Q}8O`6X`}Xhr%F1Zjm_hG6In z7b&rg?-Cs*15K~?$g4Hmpi6uSk7fKqck31Rd$NO@X;dxW?*`sZ;$!02EAVEj1Dx*0 z{MLuNloZ0uLp~A&5eQYhXi-eh3&y9k4#_aQs_m^t;cL8xuhMu#`94GW^Wlpd7r_2h zbWlRre%G&Crz3oz;A@fee~~T(>&n~(=)0;8>IvyeeZ%&hb^-l_Dsj zFvuM<3gd=3Zp;SqWJI2b$YdaF$o()3pD7?YQ98!mj1HO5|D}r6be0>LFTr05hN163Gw zN`^s(6x}&&X(N%RnM7u%??nSFr{~`PZ?MG}V6i6>#vU;kXJ%l`=Er#5j4|7?$M(UP z-GIH6Am3BD#zq&s>YC+S`G?MW!>iZw=2&6OxPE8h?#;!8`C@+5-thcNe#V-dsZ?y! oaow58so4p;;FgVPyFBeqnNHc9FdWl$-SX^Jc0`|z5`8xR0vs|-V*mgE literal 0 HcmV?d00001 diff --git a/dbms/tests/queries/0_stateless/data_parquet/alltypes_plain.parquet.columns b/dbms/tests/queries/0_stateless/data_parquet/alltypes_plain.parquet.columns new file mode 100644 index 00000000000..f354c0b0e31 --- /dev/null +++ b/dbms/tests/queries/0_stateless/data_parquet/alltypes_plain.parquet.columns @@ -0,0 +1 @@ +id Nullable(Int32), bool_col Nullable(UInt8), tinyint_col Nullable(Int32), smallint_col Nullable(Int32), int_col Nullable(Int32), bigint_col Nullable(Int64), float_col Nullable(Float32), double_col Nullable(Float64), date_string_col Nullable(String), string_col Nullable(String), timestamp_col Nullable(Int64) \ No newline at end of file diff --git a/dbms/tests/queries/0_stateless/data_parquet/alltypes_plain.snappy.parquet b/dbms/tests/queries/0_stateless/data_parquet/alltypes_plain.snappy.parquet new file mode 100644 index 0000000000000000000000000000000000000000..9809d67652fd5b01c7bd8b85da27eb8f6d072b85 GIT binary patch literal 1736 zcmbVN&ubG=5PsQglFjBvOX)lk*h3EKP$9OvO&j+RnzZ1h z2Psn2qkn-X{{RswA|f6m2;Rg$Ld1iJi1U(de$j@t3%hT3c=LVpX1-(c+A;1l_=326#!BAr1;-$$~^?ITDFV=xZS5m*X$ zjBsQ<$3!l0#BUJ|Sm38v&8D|gYkFO8omcQ>gq%l%Awovh$-$gN2hpV3uK&>W+kIdW z)@KP{Pzaa7elHKO)2)W-dE?+GGJcI-4*Yj)0G=4f{Sd?Fu`X@_ia~Xz*F{3arS_J| zi8)PZAP4DIEq8aA!smzhD1jfT+~?%wQ|H;Wi30epXrKhpNylrNqZxmr;1eMQ8O{s7 z+`Wp|Co;TJHBirjuQv}Y&+Zph1pgf&Ks%s@TzIx}EU$G|QA0RN`3 zlkS4+Pzu0vjAbJ0PY>o8yL1CbQGd^Lrdg^pAq**ufkK9XE*Pj{!=Q=` z(qtIVd(S$QD;glQZS+)(%XuyTcH#&MF=#OC)WFaq0K@b%hHOd<*I^j4P5w*oVWo@V zwa0%dTxRoCx3On>X5rA@Z@EpsU@Vju^sBe4cW!J~H#Q6N)`9EQ3#(>jwO+Rj+i_Ma k%WF$k*{SI(R&B*uHtd?Qq}zt$IJLDa>RXy z4pAPUdPx~c88r?WoW?MK3^ZWSQ1b{2QZUss)-%wzRM5!D%qy*kPtVCrN;c9n)vYiy T(KRzk$}G`jC^O)$$|wRz>*JO&6gm=ia$W&*iPzF9uko}GrsqnbMHN4W&h5DK2_*ddTp1=ln}DS zDpF2%?SQI?tF!?S>9GnD`J&4}Rj$hlsQ}odECUie*$SXiMV=`VRviyfS6)d< zRnAxhQe(Qh3wgY>30aoNczKD`uhdr>V}$T)j?40yYNJrCFS2ZYBI8_L(d5b(0*Xc( zi$-b%MUt3Qv`}jnJ)=CMtzDp@ruDKG^8|LpkUGFTN?uf@HH?xOG9N|3vHDrA-uj@D ztmw)Pm5n#|wB(4#&z~mFGcn;*B~7FqWfBEp%tnEX6LXcx{cuI zx0~pG15%wUIyv-{q<@qUA1!Qcju)r7!QFS279|F)LEg`xO{D7v7RY zKGR|rFq-;XNq;W^gqAKjs()8>l^88{Gl~x_e#GIUm0M~h$AJZJkEbHF;^>7n5h-_h z%GnS3%uG*@ggG>mG@d%C*)u&~1a4vuADx*YpJXYHXo>Q}L%fI6AmDa@GU3;+Vbcg~z4_$c_zDIE*GaW3eB4}xEu`9r~1&c$`XJHb!R!mi*8=aMW) z1wT0DZNVqOAI{|tlvHDXEg9hW>OAo;Nra&UU=fy}q%7WGnvsnan1>E1S*oULWm$to z)s+iCorWQclz#JUl;xed)Bb<-s>Xg0VC4ZAFR*~BDb;>_Vd4R1JDZax%;cJytefkM zq-NZ|H6xPZ0H;{-hA6!s5Y$3R8fSir3>0<=4HDEk9ikqN#-T~aEHcduh~JGctvIgX zRM~VdqZE6TWwH{)K(pegH5`r3MnE~3ZoL`B`VEPbZojA7X2W#!ikEe1p!+q~aq5jm m&1n+1X<>JZc=cwZzU?*Lu;y=tp>2nD&98zJcE{T6g8l(ebZuw= literal 0 HcmV?d00001 diff --git a/dbms/tests/queries/0_stateless/data_parquet/fixed_length_decimal_1.parquet.columns b/dbms/tests/queries/0_stateless/data_parquet/fixed_length_decimal_1.parquet.columns new file mode 100644 index 00000000000..261efa19f11 --- /dev/null +++ b/dbms/tests/queries/0_stateless/data_parquet/fixed_length_decimal_1.parquet.columns @@ -0,0 +1 @@ +value Nullable(Decimal128(1)) \ No newline at end of file diff --git a/dbms/tests/queries/0_stateless/data_parquet/fixed_length_decimal_legacy.parquet b/dbms/tests/queries/0_stateless/data_parquet/fixed_length_decimal_legacy.parquet new file mode 100644 index 0000000000000000000000000000000000000000..b0df62a2e1c8f6d543bc320bb1e5c2810338fb7d GIT binary patch literal 537 zcmZwFJx;?g6aZj1v?WET6Rr}JA+ki(N+C+prhj694J3w&2?-(UBo0(K{mD-ORoyrM zBL`q)-~b$;BM0CB9DoTiV4JcLIbWQ-r}v!1{eu%50{ASkVL*#bi%`~-B49^p@OuTz z3cr=uY329~1i~dZX9ypJpIqrw_{v?=h4;b_ZvI&K!YynGZ-wvN;=b^SyDkf<@Qo`s zg^$8-ZfO7|)i~TtCOE#nNc<}jVJHDuhMQ1Q3NuVIvapQvdRpIKa4P~*$u;~v&W;1QtVNd z$x09d{S`;O`C@Ut0Lsy-^==gFGZH7m@kqDLj_K$%FB{T8_gk*xv^$-a(!8p6aG!08AA3n{F8}}l literal 0 HcmV?d00001 diff --git a/dbms/tests/queries/0_stateless/data_parquet/fixed_length_decimal_legacy.parquet.columns b/dbms/tests/queries/0_stateless/data_parquet/fixed_length_decimal_legacy.parquet.columns new file mode 100644 index 00000000000..261efa19f11 --- /dev/null +++ b/dbms/tests/queries/0_stateless/data_parquet/fixed_length_decimal_legacy.parquet.columns @@ -0,0 +1 @@ +value Nullable(Decimal128(1)) \ No newline at end of file diff --git a/dbms/tests/queries/0_stateless/data_parquet/int32_decimal.parquet b/dbms/tests/queries/0_stateless/data_parquet/int32_decimal.parquet new file mode 100644 index 0000000000000000000000000000000000000000..5bf2d4ea3845820abb3c5e89b486d0211d2c1804 GIT binary patch literal 478 zcmZ9JPfpuV5XL7a32w!b7uk{*){}yWWGvgn`6m{z1BnIds!~;z7yB6^o|E7|X;G9N z2SBViKo8IZZ~zu8I6x1;0a&u=mndv1%};u7zR`R$nzN%XJ|p&AK{(9Av(9wOsGff! zGO95VH2`VAt1Q1yz^M@3fj96K(j%}ph;G3vIIR->0oygAU*In|tP}kP`X-SAFQBax zJ%D$xG-R6T9B<`QkzM`Bqf40zrXktXjM_}7QZ_%cD$}XqnU-no=oacjy-wy@W>6aU z8e&I3_-_T%!fNP+>6axQnU>L-WEZZO3OKndQ#Zd>F5It6S-9Ecr<=+`#G(*}nDgRh zD*1rtMOH=ycX%?AD$e=f+nkR@x|CKkLRnYFG8&~q?Y5nuh3vRgN(>bW(Lp-=qc&tYcYI_yatim5cQT)T?Fw0Q?3XN~Qh^T(6b+9q<#lTQBt&puAk> z9QXm;mP`E^_zPUT6t1Yo{#rJs>D5^lUb2MZ3c}JxMXB9TUa*Z-Ea7$3uvAUenzDu^ z)s^c=1se;e@l_SODewGqRjMYg5{b45%}On#YD#OAUYK-D#YA&H+{~`IDNb=+u-r^X zw`Rg}8qu68!Gz@ZV@7%;%hMvvi9zB4<55O>ClfNH$;_IcRX9)?v2c)3zG+*A(-QKq z;G70rREieNAdBXtH@_rjE1^xc1=g$42l7d^w4u1r_=3vj?Y}* gqHdc79lzVz4tzKE!gd_nc5HiL3mu6s-WR{pA1Og=zyJUM literal 0 HcmV?d00001 diff --git a/dbms/tests/queries/0_stateless/data_parquet/int64_decimal.parquet.columns b/dbms/tests/queries/0_stateless/data_parquet/int64_decimal.parquet.columns new file mode 100644 index 00000000000..261efa19f11 --- /dev/null +++ b/dbms/tests/queries/0_stateless/data_parquet/int64_decimal.parquet.columns @@ -0,0 +1 @@ +value Nullable(Decimal128(1)) \ No newline at end of file diff --git a/dbms/tests/queries/0_stateless/data_parquet/nation.dict-malformed.parquet b/dbms/tests/queries/0_stateless/data_parquet/nation.dict-malformed.parquet new file mode 100644 index 0000000000000000000000000000000000000000..5008ac0b22b622cbcf37d5e286c749324fc26535 GIT binary patch literal 2850 zcmb7G&2Af26n0F~Hfi|Brja6Y7Z7#fSP&MJN~pStO)_mfb{z*P0aRU&ubpYebEosu z#$t!MKs*8qR@ng0z>-bZJOz)yito(KnX$tHVfi>WbIxG@;>Aa{l8rMmA*#^4*%p<9v!s%mL$)zf6%rEmMtmdUSFPBN3`0PwrojCrG0SP z8&DqY!J*adS*hZeeQEEv$rT)RqI~1aSa*QmfStqtNXt%^8%RXpzJJiDb$?-rA+Q&fUUhN*ivpf&a%BuK5 z{`mRbU;g;%yN_R4zx_`AM1%hWO+u7}GN%tAOF}4<&~p-AV_AHzvw@jG_OyotUwwdY zj^?L$B+k`j;_0SvRH(;^=gq{}^_3?^IxvwNM_9z#iAChiu%{-FJxy?N7zR*W?u2S~U*sh;78E3`k*L0Ok_ezU>Z$QcY7|9qH=8BN zg3v|#RS1%VaFRo&FN09Sp^9eHAU0{6I3cD*PTtgucrh%vi+`@qD4k5uHvcPxApWaG#x`#T;Ba@bX|{ns~7rcrKXUEJ(Ca ztFIKieadgbAGMu=s0tm2k!s9T~s%| zIb53J9kEvZsCsA3SFvmSCpZ8rwRJpL_SID9d+5u;-fhQBrvT@PW4uazcVlzoX#3V? zt-7(YG4H5`z53rv_-^CHZu|S{W^J8RQrGF`%a!`e6>MPl>LxoVqs=+E!rR#P&#SqI k`2

tF8Lg7WV0tw7y%pyB4SrY>0QJVdXCX(Zk#EKmWZ<*#H0l literal 0 HcmV?d00001 diff --git a/dbms/tests/queries/0_stateless/data_parquet/nation.dict-malformed.parquet.columns b/dbms/tests/queries/0_stateless/data_parquet/nation.dict-malformed.parquet.columns new file mode 100644 index 00000000000..28ebf9ca076 --- /dev/null +++ b/dbms/tests/queries/0_stateless/data_parquet/nation.dict-malformed.parquet.columns @@ -0,0 +1 @@ +nation_key Nullable(Int32), name Nullable(String), region_key Nullable(Int32), comment_col Nullable(String) \ No newline at end of file diff --git a/dbms/tests/queries/0_stateless/data_parquet/nested_lists.snappy.parquet b/dbms/tests/queries/0_stateless/data_parquet/nested_lists.snappy.parquet new file mode 100644 index 0000000000000000000000000000000000000000..f66ba04b6d3fb8f793b94b13d7caade91d47d2df GIT binary patch literal 881 zcmbtTO^ee&7@o>aeLU#9+FcevyO99uyW?#G8mr(n%Xk(r%LKE~QuT zNB9@Kc<|!ct9bMu_!~Ucce=Y>SP>L2FEh_O&-1>|6LR$6sZUfAlJJliL`7)(CPoNx z+&~d-gt5GgWD&9?1d)g2z$H7t(THZ7I59D&8uV_tO{mT6lT5Lg5iNl^}kn(ogUj zS+==5Eyo_8aR|m+XXI7KnFnDV&qeK((>Go&YChsMH$Nx~R-euU8?ve{=W)$kmZTyZ zRc!ct!3v(s76!D`z;5Z#qzS2a4cA-hPRgAuh!T2<6e?byapN-r&h5=tnAHY6)~m6*tqW63EY z7;-G3r+h&VIh7tmkNt#_U+5q76FMu&c0!yQyk5U~Z|2R6(B{i`HG;@{vSkwuE=5u_ zb?obyQ3RhSx&)_;WL(t0moVHJE+7{dx}Nyc69*TEPZY93>jVkbwzNgAQ`&?D5$3rx+gA=8s`AZvij{IXde?tXr~^rjx!b6T%_8D zA}Y}~h$IXtnkWKV07auBrkYvl+yKOpq#zk$56E(^Q%wOQ^!LRrtvZe9vs*f{G>2sT zc&)`lHaggey?s7lq=*_4Ocm@%sG;ch5BTxU5evo~>=CVkbQzEe60AaoFJwwN6MBJL z#zaJ**hQoyemz7r!!$lsRg-8&1r?1JX7hTY4w0xvzhZiZt7><)Zo`BoAsIAQJ;x@I zj7m{4K3o@P1#cx=qCYYHg+bNTZ!XoaVV(-)Oy`%TzLKC$>g&I$r&FLybeHz3R}vV_ zcYfXIrJNd7R0AfE_O(xk)k_(Sh?UQlyTHhWVv>?kNu^#YJ;n43u3jkJ`A+9I*zWBl z^sGQNWSIJDG}?36kioW{bn#An7&!0*9FBS7jH1uZfG4cS5~lx=PORj3$gPeQC!?{K zShnT&dC-fk&c_ogWCIamfM%>2d%%VO!v3~q>VCKfQ2M}R;GN`tnD9M5y2-ZOC<-_W zr|7FFOjtjR-;RU8>i8^(`6N$&GX%axBm^FF1Mn*V+nV-hbxtM|d)A8!`SXtFHs;#2 z&Yfa!F78ERQS5r%McVBN(%xbIkN7C=M`5|h<+jt66XJ lM*A6StZ{d}-CBR{wi|xaTl4)|&961RRrFg%XcOL({{Zt55HkP( literal 0 HcmV?d00001 diff --git a/dbms/tests/queries/0_stateless/data_parquet/nested_maps.snappy.parquet.columns b/dbms/tests/queries/0_stateless/data_parquet/nested_maps.snappy.parquet.columns new file mode 100644 index 00000000000..9b9a3957a75 --- /dev/null +++ b/dbms/tests/queries/0_stateless/data_parquet/nested_maps.snappy.parquet.columns @@ -0,0 +1 @@ +key Nullable(String), key1 Nullable(Int32), value Nullable(UInt8), b Nullable(Int32), c Nullable(Float64) \ No newline at end of file diff --git a/dbms/tests/queries/0_stateless/data_parquet/nonnullable.impala.parquet b/dbms/tests/queries/0_stateless/data_parquet/nonnullable.impala.parquet new file mode 100644 index 0000000000000000000000000000000000000000..f4be08287fc86b86fa806eb2305f4df30e849416 GIT binary patch literal 3186 zcmbVP%Wm676eTG}q7w%VPz*s8T&P4$IDjHpw&X~LHc^c@4p1Oyy+~0c!B85-j44W` zC?iJTeHZxve?>kZ%dWc&y2>XQLDxai_RfqrB!^0rM6mdnIrrRiAH0+w-uS0UPooP$Qt|$ zdnN~ifdw{j`c9!HbPLco(anq>?WAeJx8Q?PoX|MFSk@-mtV7TXSqXoc=?5)GT+%Nr z7UqEo5(c^oNQ)iKq7mH$YRG9OxpJ;(uwSD*pBb5zWs(*Fz8Xs?_}D{xnPgrICt)}b z0_+9E%HFW_<_WF=PX-QL7P3;VU0MKMM}7o=jcf^!rG&(2)qif?|9%oZYv3s!9FvAW zp5g#Eewd7>0eNwBHYKwoFF@-G(l-=KJKR^=inVqa#!v4?5k7-{Eh}x^(gS}MBMk@v zRUrWxlQ5>xZ+w7a3gt)H03Zom-YRfasM{a$6o49aS{lQ(j&udBgV)jtIoqHi!S$6> z9Lx#zf1UaV+~;`zeA1B2VlsUCa~#bFF*3MQ6;p?5e`Or%fa(Y6z6||DHnLj~F^y6s zJaTmeaZ|p7Pi6)XJTD9H$BVNst3X$?MKralU47>oHqxsbiczIafD}_RJ=1fIUOJxA zE7rX3a~s-gLn&7~X}_>O5d}|Jp7#pV%l%VL%pb`;lq1RAfUdF`nju&VN-^KuH=2#s zxuT?%XbaKCVF5icp8%#ur<<5??nNol(a9PuGMPkhQ4;>>Ea3_G0H)mEqkJ3YG-o6j zET8&;|gaps+-qyeXL@Zg$L#Xz$^*pRXLGy zUo!0H0us&fs=S2dyisg>x0NK& C**x?B literal 0 HcmV?d00001 diff --git a/dbms/tests/queries/0_stateless/data_parquet/nonnullable.impala.parquet.columns b/dbms/tests/queries/0_stateless/data_parquet/nonnullable.impala.parquet.columns new file mode 100644 index 00000000000..e50124dbfe4 --- /dev/null +++ b/dbms/tests/queries/0_stateless/data_parquet/nonnullable.impala.parquet.columns @@ -0,0 +1 @@ +ID Nullable(Int64), element Nullable(Int32), element2 Nullable(Int32), key Nullable(String), value Nullable(Int32), key5 Nullable(String), value6 Nullable(Int32), a Nullable(Int32), element8 Nullable(Int32), e Nullable(Int32), f Nullable(String), key11 Nullable(String), element12 Nullable(Float64) \ No newline at end of file diff --git a/dbms/tests/queries/0_stateless/data_parquet/nullable.impala.parquet b/dbms/tests/queries/0_stateless/data_parquet/nullable.impala.parquet new file mode 100644 index 0000000000000000000000000000000000000000..2c72f52f30be891a52e080fb3d1c4e5446b09770 GIT binary patch literal 3896 zcmb7HO>7%Q6yDigI~zAiOPU$2BdbbHvZU2w#fcr9$`VOKs!$cFf(jKC)b7R`cNPC( zJ5kb>0un+w=71`QIB-NgbLyo%^-v_#69>crRooF3>IJ0m-t4ZuKX#Kk8_(>{_rCYd zdvE6@mzUnpQi0x~cXT=elQ>mUsxlxrA5|gljNvH4uk^Y12=DMCIfEd(W6T}n?&y(G znW|L11TFxHB%BULa63(>b(#W1oW@hCjFhU37AaU&BUvWW{CI+tT=spM0NL*-U{Ih1osPl8*=q@quA-5U z(L*r8ARq+&ffF7<8TafHgEBHSqf-`^fzjjsZ@lJgHa3|*1J8&g0#u>OB?=QK9YCT} z-ABR`;7S{f5Lui^kihH|J>{z&8H4JYVNfv)(ub#UBe(+iA}#846ef{u54rf*7X-1f zk4N{wJWwqDDnj}f2L}ho9NtB`s8h|0fs9X88Q0l3OnI)=`yUBo!Z6X z7)+<4G^)9&M$v|0;9#023RnZZK?h__l>l>8@{9DMTdv5uUaw;Y%eWFzeP<(aG&W{iGmCyN@xY{GH%$*#39;`TK2WB#Z0(lUM}a9L?!; z+>4Xqt*DA;!@B9F6T%?qjO~^`nEVos15x@$pkngBGpncT&2q+Q7;87Jj9qOQ6(h4; zuQn>y_LZH6)w*I<=n$0bl&Fe!Nyv-ppj~TUH=0dj2Z}B(i7X zwKhVJcc9modKm!3gCEK@fLv9h0YDL*N;t+o^=%h8P)wW94TkYoNTAM14Q?i5(iFxQg$TI2&XekVRNi_URuw&dMS;3vdcmei} zeC3x$1`tkMT<@#yXopqMgg=RFB$-P7t|@S+C-aIBPhu5NfsL?V2wa*{?AvCvUr7o| zY$`4%3*DOGwbDttz*6jc0vCXbk%pl?7d?in;Zh3l1a3gxw5#s92&AE2p*@mQbjXqA z)fCneRuGtuu^$LrfGR=<=yn0^j~LeiAt?CG+@PZ2Ep`h~;1LgcUoX&pi+dig1}ie4 z+b4pteF7I4c12(h(Eb_d1mqB=jxNUb2wY$a%J2mAwF2#{LFD6!ogNOL$hPC+LI@ocIA@4+wA+Rey8Po(_AY;XRiF$$LWB69Q;Rp8v4d_K&A% zf>&Nx6t{O$MplU(*eoa-XHN-SKme~>pL3o)JHbYTWJ*2RFq)rkTJ4On)vRY)aIRMk z_0iz%bQ{j|^tp7?TB|opX+2#ts(2qd?cIeIbOck)mD8VmrguSJ--uv4+IU-mWxH)v(SgSW=QvRHBy-O8SEf9&%dk^8D*8Kf z7J2_UTz;o9_2=sokB<05{Q0#9-tPV$!`0Eu0ydiPr3gdX$x%1mW(3la-Dg`ag-JBTpkdotMl8Tu7KslI7eEdHu{TlPjleb+tM-mEq!wyb8$uGc2AnL=h}V%pra zE2W8<^^!4LFxCq>bK$Mr{M^F)Og3kf=8ar7Z!XN_7iNuxf;nfN5&ngLIWEKh%>M&R C&}Di6 literal 0 HcmV?d00001 diff --git a/dbms/tests/queries/0_stateless/data_parquet/nullable.impala.parquet.columns b/dbms/tests/queries/0_stateless/data_parquet/nullable.impala.parquet.columns new file mode 100644 index 00000000000..889ad17aa2e --- /dev/null +++ b/dbms/tests/queries/0_stateless/data_parquet/nullable.impala.parquet.columns @@ -0,0 +1 @@ +id Nullable(Int64), element Nullable(Int32), element2 Nullable(Int32), key Nullable(String), value Nullable(Int32), key5 Nullable(String), value6 Nullable(Int32), A Nullable(Int32), element8 Nullable(Int32), E Nullable(Int32), F Nullable(String), key11 Nullable(String), element12 Nullable(Float64) \ No newline at end of file diff --git a/dbms/tests/queries/0_stateless/data_parquet/nulls.snappy.parquet b/dbms/tests/queries/0_stateless/data_parquet/nulls.snappy.parquet new file mode 100644 index 0000000000000000000000000000000000000000..4046d79b777577db7a0a68cb3d16a5c797c69b80 GIT binary patch literal 461 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 DbfIxZ literal 0 HcmV?d00001 diff --git a/dbms/tests/queries/0_stateless/data_parquet/userdata1.parquet.columns b/dbms/tests/queries/0_stateless/data_parquet/userdata1.parquet.columns new file mode 100644 index 00000000000..476bc09d5fe --- /dev/null +++ b/dbms/tests/queries/0_stateless/data_parquet/userdata1.parquet.columns @@ -0,0 +1 @@ +registration_dttm Nullable(Int64), id Nullable(Int32), first_name Nullable(String), last_name Nullable(String), email Nullable(String), gender Nullable(String), ip_address Nullable(String), cc Nullable(String), country Nullable(String), birthdate Nullable(String), salary Nullable(Float64), title Nullable(String), comments Nullable(String) \ No newline at end of file diff --git a/dbms/tests/queries/0_stateless/data_parquet/userdata2.parquet b/dbms/tests/queries/0_stateless/data_parquet/userdata2.parquet new file mode 100644 index 0000000000000000000000000000000000000000..c4f0e01c31822b0c6c95b7857acd34581c20d98d GIT binary patch literal 112193 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

Y<9C_QRbpE^ zxXt9lcHN@lfzmwZuEcyla|}vs7ha2LPM1@wvQB1i9{h@BQL^#CA?ydv47&3t^K)Xf zqdeQb--c?>SvS6}vb!C}f`_l-Z!_Pr>n#0+>yZmXWAplZ%}m8!G0pckpLMZZ^2d7l zvaj&_xlJ|J?RD=$W^6l+Gc|nYXz;`j%uL?p&EKh<#44vMv5( z+06^cdCvTK8+za=`=VPd@_94=Zx5aq#&K%Y>zIkG=TYT8>%)3dx@o?~BoFv)Nwe%S=zwd}`BPgEcD=D~>? z!@O#rtU0Qz{$#Cje#=hQo*4GzO&xTz|F`Ny*VO)MT;TkdLCbFTXVGErFg%Y#!Kx2R<5{|&~WGDOYMV>`CU#7yK21LA?nGB%N?8j_V{uq zsbHNeNpa(z8^=;>w@MpJO7h2c77H=POs=&3(1=+1-IZAFF$B(3`7i_XZFC$z%f+OoN;=4EWVxoW=saHZ7? zT$g&TUYPZ8?&?JYU*BB4cxe90YnF^G-D}O#v9;%|SvDc$)|%y$V=Av*F+I80+Lg2Q z^VY7K@4U5k_2Lng*R5GTt=GD>tC!7Nw{HEmTkF3u&;k@;m_P@Th ze)Bi^t8CbEq;&5MTTj%UzhT?yknc8ZKOa+NuAjeg*LTkEHtxPRqROT{ zkEZqBwD;Mv`J48AzwNtC`+quIW%GewFZJI1)$b4IZ~pqP*WYda=D++^w;U|cGR|?x zyT(Mv;lhp21WhZ}^zWdfrP{x`bF^%C%P+?&rfvA;c-5>|znrM~P5EsneW&-?_HEte z3$~qVu>JP7(~XZ*-F_zYa-Z#IBOfi;ey-`Sx3`~fS)kgE3$bNB-*K_6@4_9I+K1lR zak*1$wVhYGboqSe)$WFcJFoS2-Pw7)-^gmaZWyM2zUyY%@`bx@Wo*B*>pT0AYP)Z{ zE`PrJPS&G^yYCMC_0H~lLkm>jbAM!+zIz^w^lSefPasy?oKWm+QCR-S_?GBh~l6+J3q3{vUQfTD1Si{lDJb z|I;@GY8?3aNSS^IemUWLFX#2%fNz@pdba6*&E8yW-?I5{S9=d_{`O|ZH_d;)Q|8q_ zzr#PCYJvZRf7Ge|(TjpeMK5F}y7F+NI;07@0^b}gk&oWc3v!TN0Q~?Tt%EPuA(qiO zpAK@pXt1I>de*ata;lI~{pj#AF>}w5}3>d{BqDrb9lb zLyf3IovTA0qpJzj0uVoRz5w!n9r8b&KY(0F7XZ`)>H`e`#0MSXmo5-MKB7ZB)gk8T z5bJb^M>@n~9pZ@&abJf#Mi&JjcI%n|$k%j;vpU3h9qMKs@?@O^v;ty)SO9sPt~JmG zKy1_@m(Zb>&?NxKLv)D%atB>Upc9Y;bOw@vE4;TO=pa7{r8ejsoz;a*(uo74WtOnKqYk_sZdSC;v5!eK52DSiOfo;HcU_A`~tiNeg)nDzX5N7-+@1XKY@3^U%=nMKfu4he}FC@{sZy@1psml^oJ|n zz-NFDPzWdt6ak6?#em`fUGOOhlmbcvbV;==P!1>$Q~)Xhm4M1X6`(3m4X6&(0BQoY zfZ6~ROMXBdz#pg!1OWAb`T!liHv}31fk0y*2nYs3fKVU|2nQm7NFWNJKTK=_GzFRg z&4Cs`OF#lz0Wm-<5C^md+5l~Vc%U7S0JH}Zfet`Npc9Y;bOw@vE2KoS>1AT#hKz~36^nd{{0t%1{qyg0IHUsHE24DfKfDNz%4qyP_1YCd{@Bo=W z7LX0(0J*?GU=T1E7y=9hh5^HY5x_`b6fhbX1B?a60bc;)feFAw;7ec6_Yz4Lf+kqXxPGA?X8`uNv1@-~^fdjx-z}LVxz(L>;a2PlO90iU6$AJ^TN#I-H z6mS|i1DplU0q21Wz(wE^a2dD)Tm`NH*MS?rP2d*r9dH}C1Kb7f0r!Ciz(e2>@ECXk zJO!Qs&w&@fOW=Fp74QS_Bk&XOGw=)W8u%4>1N;WO1%3zq0R9Bt0e=C11OEX30{;ON z^z#AvfdT+sR4NE~1D^pt09^yyhKnZ{j&q@KMfigf@pd3KiMFpTDPzk6E zQ~{`fuLe{HY5+9>I@GHT_yT@F9l#%`3j_f5fcgL(1U3X30f9hcAP5KsLV!>p3K^alC>p96h?en5Xf2K0adFaipY3Zwxhzzn1V8Gr?_0ye-7 zIDi3w6L0};zyo9gSpYTha)4Z5ATS6R3=9E=0>gmezzAR@FbWtAi~+_1n>wxvZ24Eww3D^v50k#6$fbGBzU?;E(*bVFf_5%BW{lEd>E8uJ38{i;t2sjKJ z0geL4faAak;3V)Za0)mLoB_@P=YaFT1>hoZ3AhYg0j>hqfa|~w;3jYj_zt)Y+yU+a z_kjDr1K=U>2zU%U0iFWSfakyq;3e=q@Cx_=_!0OC_!;;Gcn$mtya9d#-U7b^e*k|1 z?|{F6zkz>%e}Vr1O8D~u`GEp}7f=xJ20jCPfI>iFfc}7}C{PS24wL{&0;K?I-jxB$ z0_A}6Kn0*8Pzk6EQ~~G@3#tLtff_(fpcYUYpo3;Vpbp><)CB^7dH`L}r;C{lfkr?e z&=?2;f`Jeq6bJ*tfe0WHhytR4CO}i58PFVP0ki}ppcO!eZLvTc&>Cn1v<2dUb^!fx zQ+ps0=m2yCIsr*QXCN8q0;B+4fo?!|pa;+s=mpRpob>@d2l@j2fc}6C=m7&@1QZ|@ zNCQj&HCxkx48Q_d0UKZk9KZm;3Ag|^-~lp$EFc@m0dj$Xz#w2SFa#J13 zC}1=&1{e#B1HJ&p0~3IWz?Z-zU@|ZTmzTDH_SH9 zZj&uWdg?A)+=|l&PaVt#lVY(b7@|wGJI(ZKygf^H8b8BR8>ehDC@y;0#jRv2wt`}q z$Lykq_KMkUqKEFX%_!6O_OjdL%(2nvFr6Y;tR!Q zQ`A{nTg{dnbzY155NDQcGEI?SH`#3BH=-y*%wWbKqB=Q877KO(5l*=fEod?4%6e_q zL^Eg;bI3NcL7`7+TJaF$^cWQSEe^ja7NRG`q&O9qps|a=?skh6JSwdTN@}W85oE+E zdZ&!xI+`zDu_!iTW&$>2PF0-rQ5&aXq#sihr&D~=L3Wx2Aze(e({7{1+B%gqyHoHX zSy@y41kjT}WRFRfSIWxJ@(& z+_BIvkcB4Oc%qJIBB=-!Nbt~{G*yD)a+wXPsAMZPN8{oZo4TC@y9=AA*^*?dViChy z+0yVt-;z1WswO3p^kgw(EF^AGTtrHuUA3K9r)*9WyAgCV{}jDqFbH0^vZ<;MO6?Y* z7fG^5U9PQSccuw`$Jsq;7Fif$k^+lXNwC1m#24+HimK?z_B8d!BvTHk5|kukBg9&8 zAWe2E?hjcj_5yL)-6p}M_DZH%=tvjYDVt~&RSh$U56~OMnnRxpy&zMf*R7p4#pR}_ z7(2u*q}5hdxt<`q>^5RYg2yQ23?jrr2_Eo_bg-3b0^qjEqw?74HhIJbW8eaecGVTh z9;a%nU*rOmD+%u{c zf;aSKf;~s|Amrx+y~%dHS$LmBJDj4}cPlHVWf6)u-OL8JU3lAA3pfprDm20D5^N?% z2~SCjCzJL#jbi^c!Jk$}*(&%1kEQ;9gYbT>$b|^zdyH_x^b@HE5eYAE6U&pPl7QQr zt$M|2$q~;W+@dJrQ}7%bFFuho&BEWqt=S=9u~%4upgtCC%dwDnY1fJqs!9vDa$zDN zyVg){B00e>xY}LLQE5%F8^xrsKD#E8WZB{n#I~}iPP>%_q`7Im7>zqGu!D?2wo$cR91~9irX!ioG54INjbqTtBMXM ztA0l@7;W~)CGg*e$B^EtyRRtP;5uR`4jp}lqS7wlRnYr0pF)L;6fIV~M9EU6%akow zq+Iz5MJraST%~HY>NRTCs_pAn$G>hsz4{FrHVSMU6dV#77Tz$zJ2I+Hbd#pdB7B>- z2yR(eY84Y$F*Yu`b(^;F?GoB2>byI2>{Qr4sd&R;#X2W({S%e_5|H7?spCQyX)G^bCtHT%NzpUe_@|AMV@5Sq<%{rP^X4zenKNs+cVJ&- z;i5!aKg&P=+%Y6e^tei8w)2dcO zGRw4IJ#yUap(`q{$zB^hpmmLP>w~|HnY5@cG zPHUKK9+RFFIb~4Ce8biZ^q!m0y7Z=)6*GqW_AaxsX|KhuDuafuO|BcYJf!2=xjjm4 zo?k5C%lgum(M6{$^jTawCZW>C@CNBK6TZx@Vr=QVcF-3+3nng4@71T<{He{it{b1Z zZEV}^ElO=Iq^lA?Zk(@i?%W++dym^$Fg3R4uH6e8`!3bB9a^wK*{TUWmNc9@__O@8 zc1-dg-fQ%1+oV0k`?gQ3u(#OAO8b`2URx#EzTf6IdfS0=^S}D~o1X29R8^#?T$qHt za?J)?Cd}FPS>v7drjrlWn$jXDwoB%e&qKQVCUu*>eBi8par3@Bl+Yw9*4S^rgyxZl z!vdBieUUM7X=JdK;plGe5=mQ&afc*L@D$;_19lZusU;dc41uHqYCeZZol2bHG9 z!-lrqn;5rmz|yY_lNwK7->j3d`XOb>5=TYDlJN_>HQjKmL6L4FBl}MuTDq3SG&{UQ z{=Nf~(!+N3DC;|R&Vfo}lzDz8bCXf4rLDcvHv4uQUu1iT@3OfKVkb9jV;wfXdQRsO z+m@I6qG#jjB^oc=+kIz;;-$jJxmr)`A6s~M<2Ea2nJN`u+;sfd4He>-Rv9*PZ0fvv zljr;D+s8Y@ODrjU+*Pv3>WI%GS{|F+*gK?pAOFaaYrPiO1{U>NzB;_rH)~h*=;fQG z>=@N0LiSxhGOk?_Ndakg11F%AAEG`-qfgFZED#LTT_xE3VYRS zTxwIb{HwD*8`No3qZRJ;XiU|6@H=-@eZ>V{crR7gnC*E{Cv-f)3Dqt$^?JLmMy z{lc=!H`veF`731XyGdv=9Qh9s&`L>OQk8g z$u1;%x%6XOvtA3|@mQ4Jw6SMlaq*!&3ke{7fG}-DgrJvd3QA8M?C^|KgCZ>yKf&o~ zG-8ViLMM#^6&Oa7#LHP3*f)I;CyR)iglr?1{Jsdi_?Dj85DdYr%0hXP^Kcr8BA8QQ4KD3WHz)^2RpVy5292c z;k2?S*$Dq?vW091d6k<86xo@^v{<`6gJx6%mmn2vk&z%$Lfye`bEny@h`BTdRRl4G zD2f4JX$dv*U@qcRGK~}g3AF@bq~Nv(nU|UhLRIX!B80|!(o8B_P^1t`Y05Z{nq?#_ zTKK2j%_6qe9jgg_iSf80TA~H|Vv!9ZrO@gTF(Ac`U5Z__hK{0SB8DVU5I5#F}NHeH}bbhe_2PIZfMW zD@!I41Mzbwi&@jLsnr5zigW zZYpDhW_LF!sQ3i^f)Q#ut(Bn=rB>x6<(YyeGQkh%m@2w9$Vk+6+S+Zo5Wi|$BDbfJ z@2haN^cKuUC6Sq@tW*Q#5<{s<(q<)_SIhKHS&F*DPGn)EgdGe>n~{B}UgQJTfpz@g^d~1>=CVtT(hb+9bsjf7MNYgsp$i7NSF>; zkx)6UFc8n8?STkDtc;bd4n0(nHrvMT(%9DBZWrsuIz7UfX-cJvPB5Rw$Jn#rPH2`^ zLI#>Z98{DD+ay&$tWnoNMQpJM?-JvL(-L#V$YyQdZLw4J`?gMVYN}cXC1HmKMfFog zr#THFgZ>Am#Tp=$i0F>@Cb8GNsv5?J)LPXD_%T|(iwBGV+vy8<46Wr6w2BIJ7{Hh%R`NXm=>NG;bF$Newtwt?FxURuwb}eGu_W41BZ*FKTN=wK7Br z@jXmIt#?{Ei7cA3Lk{*$Tj-8zUDa#_JsBY$P_G8M?k2NaogLjbp^(DmfErS97RYVQS(PJFetl&$cjaD16d~7DpUw{tt_TN|1FE&v_Y&>S84-Q zQ&p1`N$v1;z}}tzSDjW+IE9J@sWf+$$2|YPwOT$DYvn6cEXSoR})QNb|)c}AJ zwVPHPC=aSU*gd4q&|yP|4;(R48Wle}e9YK}<;Q(7e!|4TL%y8Up-9oOWhXakGG%I& zsne$0W@OKtHG9t7rt_pB^A|`J1}^kkw0OyYr3;o7Ti!!X30YB~*veI_>v#_5tj&HEMDvUQ5rwz;|6yA(<5m|3}g*rd%n28^{0*(t~M-Q~4w_qxXG z2JLCMU`g@4`8pTfw>WX^vJU$#dwS&GHzmE&Vf`NdFI>D-s%6D;^BRpzEV{SC@oFL6CN{mi?&6e?sDW3ic@G=b{A&Ni zD%YyEPwKPPJ9SY0jA+dewnrS$7NceE3K|w%^i5hPL^})SW(V(c{aFTUWRqFlK*=$YXK)sz)_B z61O9!|GGPaI$0~0h;H}9=V`6#L1mh4Uh~ZRe%&XogSWhVj+OPBYI1 z$G>{D|A$q6xK=_HXwO2HlV{6+Z@mZT6*X=UfH{bniar*ueH;-+Z zIq9b9ZcdY7-P_7ur}E!e>ECr`WcT<5KXoXpR6kX0@tvR7E-3c-PwPiNGe>0TY?p#& zouAoNGCaDKv?*$4^4^HkU3wj#dG5CH<}Y*h?F!Ewmhf!q=MziRN!&ED(Wtgh?_|U_ z^oe+|rf9c%C&L>h_~k!hi{9?jxp~pXUw3YBvHbOQOQxJ$*1l$u=U2Y^!Z`N&FOBN_ z)Mb`yO^DLCmHFPfah0Bg=&IGv%(7d;E8PjMHScQL>FAMnZmzoHp3?17zgMrejNUnJ zUgQ@WM?KqIY}JpURcm>lsB@*zis%h2P5E+P_-arI&q%Zyy}6 z`|yUjS*LoPFfLx!>R64i9@3slKYsBr5Po6Y@B)MnFG`lp$`U12v}BRpW;pghgWdXZ zKc^hr1*#%cbwQE=?WGJo9BLq%Ru%9=7W&py@pvPGT z&R;B&)o!fBRG`yCBx0%@n`BiKx5vTMII~2VY?qK->Q%iW zX+lz>W_AdLK>|bLE8z!4oqB*|Fdj__2rkmP6y8x@JEc^MoN0Hu0<8+YwjeB0 z((l3|$o^?6A}8G_=eWU|Op`}X?@HjE5ebTt>ygYR(jY5wK<}hZI5a3z!r_C#i6lM{ zSr$!fv}pa%EXm_abFnJA)2UF;mIk1?>NdzO!Ivr+?{ccANI8-N&1QEh4rpvfOAf6> zO6JsLo-3iHk5n1o2o9C(at1_6%Mp*$HEM#xB!dI$C$vnMl2vOL1cysF^s@<8(0<)i z0t81u73_{i4yPUVSP`$S&;q+HI8w5j&3XmRZem2B!B!c+xm;>@Avj9HhU|t6hso|1 zR!Fv)mQD?a;Akn`Y&D9vf)7wArxGknIPoAe3{;Flf85Xtw>wxbSuH|f!Z1-@s(p!I z1C$>Y<**Q`S!tvS7;Ti&RX*4>Ngm0xJtH_(N_88Ee4^ceV^uWZ zUBPLBuLjs0KIW;?p^4Pm2sVLEg9#}(sRey!Lq|&MbOf6v9IPr?iayURKM)|u#@-#GMz@I$(645V1ivj#SIElXZo!;zOosSwg$T;luLnTJMrA@ zM0+OKBLzo<5?95hkW^ErCOA`az(nX+Q&XJ6A z8jhS5mpM)NH{ysvtez{`4O%22-jeshv7FTv5+s?eX&xb5GWrZ0Yhme-V7Rahj~f&t zbfi0oV-}(9At4{KoIY{V0wJLic%vBM7~wN`Q{;ZBe-sk-u@@BztT8$y92`S%Bqbtx z6$dq%LLyX!&^(zjPvjwyQdTI9rETC~hk8*VQD90gb|lje#7(E$L#?ThXebXvCA^ge(S`9`bgmW9B;v@AfVc$Vm#g-{fu&&lh;N<|MX1ToA2k84njpjEg*k{coo zmCqp-$sngH4oF?djTUwzsO5%Ok$#xf>1cNu2GMm3u}P_L?N|f8Q%puwrNTWsb3*Lz zwTUP&;VlKA5Qn5{1{`dLBJ`Sw)|;qP7czk5KvcPfHaR5<1C3A;!u8XB$oh~gsHbot zuDn>ShISdO&QLV6{6dNEgnPbc1pmhiZMH84@lhAQwOb)n-S|NWas!Mm5(DwZJ>t(3;AE ze$j8l%`~3ZD&hE^>k=f;M5+-sCfdlMHpyXtidck5tJ9k4YF9bbF6lik; z@TzJT&v;@P^t-^R=O{W@rslVNlDK&}<1hD;vNv%p(3W&8X6sE4e&m zDad3p-e-&sxISlC(1)sP63jNJbxByTWCx!bQISVWkp`=ESs214M2Rp;|9*fjLkoIg zp$I1k2;`LM1Cpwix`c%xq>z`)lHri(M`Dy)ur@6GqhyGZ3*sOc8x|pvqo6g?aa?CG zg++dvyAi`snu%k8u&DP8BTt-Zq%(oAXwLufO61V#tW05ui&kWXWS@dq;abBCd5XmP zNyN(J!^4apD+nn80+xCn7p6!iQ3}!9EY1IfrD6?{HIcHW%X}sghBQ=*UoZlLaEQVv zGsHnfmIT6`WZx8c6a+~WU14Sk$2w>X(?v9`dM5(YWO1AkmM-PUCZvQS$Dt`r zxYYvQ!6@MvkVd)H%8Y!rlUz@jMS}KPwZ()hhi4VXAYoRN0dD3`x?q9rf0q~EkhLQl z53@@Kn_g%$Ev|XoFtzr}YZi!~w15#dfDF@RkR4*TVlvGcgi*{yE)InuEkIf?3dt~+ zWN<;7&6@8aXAu^!N#nL2qL7NDzn1FML{ljLe@>>!OMn6!0=7fr4TCO76(<~k?bfOqSUaese5>o z6J{pQj?f`)Y`Ve~DHm7F&>zAt^dYiRt=bGv zg{+Z3payh{jsn#)WNYDRQjTH~Mon4(b;AK%xQV%pSK=>*acfcuPX{N63nUYL4xPw_ zXOP!(Qn5g5lCMHcM=%PvNVXgfal)~pFX3{9TM-uEa%r$o7okVtwokW3q=1D6CET9Z zccQH#3lyh);SR~2Wp+E>#}qwf;^70dqz&_Han(ikAMX5ATtq4Q6cjVUQTxd`s3V9d z5%co+2~!g(B}IOt+CB>R{2!5@NXvkaCe22A`T<8swl=5*)%M|JZy(A)xCpg24bKLJ z=rrm{BT%^!9cbRDrYao_7jmMxvZWv{6~6<6-3HJN4?IRh@6j_rXtk6?~X;}epvG2dboNl9~tyv zZ-rxBswxCQS#7kta@?C9~mZ5rR3H- z5gK_a2mWFK$NrJwAC*HyGSw2|{#0bd`%a}uI@Gg;$jJAxQV=CVZ)6n8Fuh__n@64u zB1-i6Bcmla`wZbeRE~%s8YxRCoYBC|D;5lC>h*(2JuKdij-Z>kPQ@U?U8LcIRyuhH zBplkkgh(S2E{ALu6OqTvn@EwUt>{t|a#L`Nw7f$t4G{r_@Iv=f*tU7CnQ zH}u1U7%GTxJg&y(NEjn!!)|jbYIrm|@qa}GC%w0-^+=>u%F2tx>7x4?i312VJtc9Z zQ)emC{=QtMk2BN`LZm~IqsWueyEIJ!aqb`j7&$hROS{Jr>D0n4wZKI5ATebiO5tip zr0aujzEDAqLXn7uI8zZtAo6vRlUsEtksk7tIP}WvMv0V0FK&oLBLDnfH|k)=9GUgO zkp``2)Uxcz?2l_Licwb7UgD}rWX>lBK?_>dPFEy~!H=n-6Dx#gr!fj`Q`i=6eIstE zy@9A;$zZ1#W+5j;KcuRix~Py39Xb7ARjZSzP)UzNF)9JUZ4!%7OQ@s5q|k^U@P_z_ zd!FbpM1@O~WngXgaX2=zSfU~%MK23?O=ICmL|PLSDaj74N+DjT9q=d|@O|9=q2JOo zFi%cY^rx~Ug~Z?ThDqxc(nGBQB8EC zOgOhi8j&hoCi?ss67@-=21|&4vIe$Gzh->U|0R)Rpr?!5Mo|_nafnH#}A?`ct09pPnZ^Q!mXB7QRubUWno+-LD)0WS~&_$QAN?K-CCh#c^P<=6Qvbe zYuGCBM@0W99PxcrCI4Ul9%%k_?W`?|OpVUWkPy%9o9fhKXtjJ6KZ8cNO|cNaf7CG}y+f};^^nmxQ2!{WC7aIDqJMPg|3Q||#et(PeMphe(^sCgG{ z;Il7!DS9!{bi%G3ZqwIBJsq67-O&nsW?-i9R&t(#MW-S=aT(Z_U>Ky4(P@1AC=8bF zgu9{<1M&auS$bp~WXmK63pd!K&7TO8=y9n*CK@H6+Up^%p${o;l0|1ou-sfO4e8G! zp-DzpwB`MIESU~gM58g<%DXZu^fn7A65Zm9wn;XJlO_=cr5(yd+utj^s98l=jCM$w zf^t&83?uITMGwe}-rUn7mZ8g?V~oZLyLKyq0wE6Ggm;W~yfDAKBSax7HK&TEx=$qKBBKI(VG>zzmrxI6=wc>PXzfZwboQqiicpVKdv*xbi3mOToB) z5sXF)Ne#CSs8E$d-k(|tVX9qvITVGvRTjCixalDd%;Yf9rzGw<)YL+z^S@6n1rSZh zQ7Mg;BmU>;NZ1)&4Ulp2{{GyLRKOv6(=sYQK1ZXe^m+N53`6_08|H+Hxn&tn)g@x9 zNOAb6N!Du`F76-@D}@q65IM2|IdPg=DhX4C2c?QfMr`BD12wU_tfsB9^8e9OrwI*e zPe4wU^m;vME|Hy;rd}(R(>^^8A`9eWOxg5N+D<_ z$mvusV=e566vl-OlPoh}Qq&+ICr51!6f?2~?~Jn1m{$}kl>f>&dw0+u0u#A3g?4rz zSc8^oZv|BvtNgRF=0Um$!hGZlYcVV)*dRA)|t;Uh5oD&Uq zoJ-OE@h74=GTJF0wSp-aq359%Y;sPXulOL-7amHxLLuk!AwRvP#1DVzpbyGxjtUPY zsserRhs|ixab$xyzSN_+f*vsiA6Z;~kWqcRO?t#JgTaII3=}A$4Muv4AcuGhLF#eh z{&DU~9D+kdj-wYAmnj=^#C;WY)^yQ^)8iNcJ(Ks*Q}j#7$))LW*oT_VV11tf<}DWW z-nG&;4Z@x1kx?oxTr<-0SX9}9GWml%o!AT&LQ$mGOSo_&8`ItgSvM!?dh}ITSxNfj zcWIACZeSC)WYwMM6)6qu!ObSKI1R~wb1^9TR4E6_hx<%?21hHqG$H9xM_G?%m|-?c#g_ zM|(mgNakn{(_eDw9m37#T}+{ca2kdnuE$B9Y{&IMnu-?6(2frD|I_TG`7&U7IPcWE zKE8-Tij2BR{W}J|Te8uKAtoew8MVHp-h)aA#~m^STcg@6*JplGnG1`^%l7nH91R6$ zG`3}P;5W!Z^lI*^&v{?Z5|cC4E|)&{Qx{H_f`2zb+}Sq-Nm+<#Ce#BgnAh=U&7^FhnOLxiVu)7^+*_<@_Zs+TK_>B!jKlv)ritR+U6Tq5p$#kpRSL zr168Z1DcEOIfy$r#!SiGNHYPWLhIu&ga5S3n1v{5;sy*_*nFsM%zmFQ({$(ysHYr8 zlyvX!$;c?C78mQ|$E3LWC5*+m~h_;le-M<_3ZirR5942GjVj(3EK0HPz=8Wb_FoCE{RP!KKc;GZO7ir=tJpEQTaX z`IkE0fJgv|kj5fT(Z==Zh+H^a!TpsFRv~%~>P0n0d4G9^7B{I!kV-0!G4y$d8)lQZ zHLaw57{P^WqFRssZcf2%vj4}|+W=X1o^^ibc2Cdr$ewYJJR?gp)~aP&!Zvo#{l4cI zf6Pc4$+9Igl4fifFzEL5?e5zj_jcdz(P*@I8CbKJEg*&%h#epT!opT|Q;=*ZvbB{G z3%lzCcGsKbV^a{y5J+|_l`Pp}DN-R+e*gdTo^x-H*cb_Q-+RvcKJWAVpa1jmzUTDp zR;}#08uU0ALMGMOYGEKX+6L5Z>YSFxgKdv84&ZYy=ZJo&V!`xgDD7P1FL-8 zmOzmc4{k*tWagO(O%R2_;FY7StqFF$gEzQ+iMn$dg;%HP(}2^|eYS&CD))U{am@{> z^?J2;>cn5$7VC`)6~Ud-^ExdP9x6$v4s65N+g+z=lA6IX`t%&zI=)uzZ0X$BCI~)U z@1$)RVR{cLx;0woDTSkjpVE@m(xujkVaju>M`$$pUThAob3i5aK%}5J@4a3erB#`1 z3%%%A?|Q#F$?w*8oW@>XjdaLXOr*MgV>YSKoHQ3qBI~$WY*R`-d*Na0gPEf;`uxDe zwZ2~UdlH*(CCNALPT1&ZjR=v4>zmV!%hdJj-(DY)G`rXLr~WNJ8%2M0o!X7Vi0J_$VTr>u5k%GxE~#Cc0=J~n zF-n~)SwDQ^Qy5$2$=!AQt;_F0of|E9H7NjyD=MINkNe{tum-IC#IY zQD!WnR~~0$A7-+#d3XIPrSkBMUQe>Y>60=okT787$ zl(t4J*kI%PNPn(+h-G7U+J90BQkHoeqc`;Bt+=X$-XM*v9tL#(tV%LA*ci~EgzC`| z>6Oh3z0+c2|8D+YjmIxGCbJpQVR?pmgI-AlRt>V7+AAA(Kd!Kq41JU565J~loHo;m z;f^&IU3%*=is8-t4ciHZ zW#kl_oW`8>a}$x7X|q2)x}r~|-py5tkm?wNbr?C{<_&y%=0RFTkv(;vH`nOz>%4F3 z2k__`h1cdl$Ec{1H-;)-R)&Y3A&x|Bu2*S}+g4%1&5i%S$znPFCI_OY2migi*k0Hq ztJHff%e+h~1VO^YCXXnTe(GE zJ>aLSiB-IH;^iunlR>vv{aT7mTrbYm7-b1ZY=_^~DUererO>cRZ-hq+_00ESA9H(Y z9R1lIY`$7Dg|9EGlwtiy+HAhQQN0Ue*qAvG#WeowJ8SN$505k>wa7?rhwV$RuzH@; zjdr_`uvwm@8Pbr9(m*$m0O)ks@aSH*M8F!Zn1?))2RLHiJT?2awOu+S1Wpm6!KNpx zhUAsyV}H_I)l?Yr7?3)i{R6g#ge={+QyO`=sc@%BfdC5d6dN0(UZUA z;Reoj#dhs*1S^vCy@IFczU@+pdgJ9$7Zn22^JT-mlq_l8x5}Na;r`5NE~QbBh+cCv zoH%3Cns3Cb5{3sy(V(wVb9ty^&@<pW_4s-)#B-bl=+_Lry?XzlqJT?J7gq zVo!W}M$7Ra7QV%H9SW1~I8A_~KYa7mt*yHsM3Z!@WvQ^WjY`+! zX%>yf%fC4GvPDIAcZ}rSaL$^ycB?c)V#R**7D?vxUYH?_Z^SnK7LCgC9EX|T`@dTpZU*EtJDM7AFFhx;b$HjV znv^mroq6l#>_ZR!%Dw09p+}&oggnJ5GlNG}2m>gs4xEPNmpEY^!SDWt;vnRM^R)ys04_4BjTIBxty^?P%+b@NG82PXi%UCQ#Xo^D9R;`SPcmvmlio3?snLu_m6O`h9F>N~T$3$ATCDATT= znB(>~rzhjgiJBq(@@(%m&lB90!f57$V83nNqB6sCj!G%yZEsa)BFY_d-8hN)Nhmo? zRy`;w`=>{#2Cr@(dDO?;mo&+9uI$hAEGq9C^v1T85L#ogD)Y*BIOrQr&8zm@=6w${ zX`d_*+lt$SxanD1*6TVFCVFEoFfpzk)OA#q<)-)nZ(B0Ho>i=1L5B9CfU|* zo1VtMVa=ozdi%&hFY`^9Z>N5DnWtr~M?+zUS}wh|gAd&XS*1aw=WKUcM>Hy_`s!Nk z@Lc)yJseiXx?jMyLqw|{;no~GI%&B>kFts|ijn0Tbx0)d3UZnPC2MzZXXccNaKjn4 zC_Z`7kY(>D@S)VP$YrI zbwb2TvMiZDCPKY-VPhp(bUtmoGM`RVdv#(+D4;H*S?&@J+TA+QGXDIA`VkI( zuIG0femsv9g#Ga{T5zh;FXPy4&Ztqg7WJ@avWsg)8oEBw$Gg#7+odhZtH-JkvK?#O z?acH}4CiA{I;~ZriOnE=#*2M87P3pO7*4EJa2PM1_}e9DDL>d_8<1eF zLw+1m+QFA=yAzdM@U_}6Xm;PNg# z$-CaxBJmwv4t9B1AhwJpe%a^RBZ0~ML`GMSVZ?oyr2cAzz+UezMF z^9F|5L_o$&2Pt-WYM?}`W-50lc6mJ*kLptOl|Hq@1Jom)#33`AzMapoh`2p+jTXS;TX6J>g0yF4;W9w$c}<*DSB>}&2qjX0=Wok0jTidN^SfA<8OyVY63(du0< z9a5Fv_ZxObH)69xi(+@1XD3Fyx9Il4zB{b?lvfYv`0t30h`KJRy$bWE>SV+t0e7DZw%1?V{}y@zcygqL}5%P<{L;w%5{Xx@CxiJK8! ze?J+MV7N9?LU>nHNZO{^=$FOBvv*R~+z48OJjLB{51f)!D1@bZc9>e>pHT z=EV!sew7rnmyR5a+1#GNi|v&j&KS4v+VCyk(KqIy)Ch}1zhZ&6qR@@xnSf~{Vwov+ zqLDoAl{&cVy)|0ydK_3B`?2uZM>_Ro`2@4Vx0S=4iHfa7HXo8WRWOY`?DM z*p%OKH|BkPM@lr#Ir&Zbz+4wkBskVs}iHrq_=0hRrC?Wnx~1Se^wQ-oF35|3z^Ugf0_N&Ob5 zi^qN==FCxizI6M35|4=PvFSEg_#iWO(*CFv$>WA@M!ep}7yepJx zy_}JS-uGJN_N0U$8YXt%t3n*Ju;(gD(d#bg)$I}H?tb@>)j|% zyzc1{owAdy+qNC!_jZ_yjA}JXL*Yg9aWH~vYmc|3ys^8!5l2P#XrIjVa+bMkH5$iz z?92V7uK{x)O4o1*EM6q6>2}KY(caPGPb=U&p|@l9CbLSB`gi^G?;a2H@E)G&YtCr? z;G}zpZ&;Y_;X$SZ8(vx)0yz1M9>yLoZAfo8D@U}6UHpl6TS;%)Q%e`w;FqE_&#<01U{4BQyUwpu-EUXz8huQxWy@>7Gjmu(fTYE-v$NlQ<5{ll z*uUEM`%~h1FsF&pd*08hT@HO(y$@o)NDruM32>X91lX6O&b)cXxk9wU_lb^dvjQgA zC31-L1l9hHBPWq*=i5K`d1Xpj_G;q3HemPlv}*a%V(By9H@r`mCEnwxE7c{tHQKLY z;JQo5Td@JY&kh2it$K^2q_+YFqx~VYNedHH`w>fxzbd%w^OCUiUL)ZFW^*0CznyY+ zS&Fyk_{r0Kw#1JfzSAw*XS%VuPxwpQ0kTt7dhS=JF7@$_n;ZMH=Tc<8jc6$C^R}Yt z)`+f;=Hk8%T$XQ_HVszXzE25wc{tIDCt zJ7W8HQ|t0`GzPb+tc08N#pJ$T{^C6he>mKN<)yM3_3WN zwAiy}_s+$q)K$LVnb)x&dF{KFy%jGFn5g?XEg!V(4Vr5cA|`*KbF5=>yv~l&Mr`eT zKVBd*(UCGbSb}Hu;-LxcPudgd1wXRlR^$Q`jzdH8JW8SKqxCt_Ci?8#izPAi8?QK> ztj^TsTYHjt68=7+Wpme|=iNwfCv2jZZW!340B9CmHg;zTYQ4;k0J#S;$HpAluoQaDJ?Mya?S%8&EPm^U1cF8-DUk z+89K4Z^CnSvuEV^##^UsSu4qzjE?9-({QF+e@bM+8~UctSQ#bagb8h!!L8f8A9MN! zvfVh^Iboyx$U8Z;N?zAT+DryEnH*(c{zBaQ&b{xMbI0`uo%IJ%o~8WuUos(`-x=@$ z?-V-sdH#;vvDrT?c}$lb{WAn}-|>ZGXOExDuAO`0iKqKZXU;8Mzxu?PJ4*}CKX&fk zYiBNB`=Q#|C$ArS`1+NF%V)1HEImtDX| zeD;aUXV2D_uAi-4SvvdN(z$H$*z;$uEoH|(dG_)XSD!p~E_?3!*|Q5*p1fSU zo?X9m=ef_Gz5LPVu0OeSPKC^WB*!5$VFQ5J4GqtRC_3|g5 zJ9q8jg{$YDd*Uavg|m-bsU5qr_{9B>ojdm2wWWotPh2|o#NfFnmacDJed6rpE7#6G ze5Jp%_T<&2#WM@nYFFNU?h*^TR=axjN0u(XboR{UrSH6Q`N~UAUq?rO>j&oa@9ZCM zcvDfVmxzgYrg3Y=*Ma_0^rJ1iZ zyDLRYeUwJgTIn)YyUPf5-NLBN4!7`WJD2Y^>a7)B#`i1DR^4~ixxCdQ9C|>G_@> zzi@rC*#qo|Arf(D-jax`NT+&9gUOkpnAUlII z6f*fP6w}F9a_(w$t*ORJlev3H+|(#7zUeVavtYt{ERfZ&@Oisy@!PGHoN)`Sps6AF zl8YNsTMJmyyW8saq?#i`XZtQYnv+Wh3 z?N*DKn)O^0b9o!3wN~0Tk2DQhnvC4)SkaipkYjG(VMSx*hAho}U476rK$|PrB1FSZ zh}&!+TG6odm=ilUw5(RZ7GxQ5Oc+*|PP$DQ9#MT0>eAHmjiv$DXfZI>l4f$vjJ0H- zCRg+3i2Dho>9U0+>eM|s}b8Z`9-ko8d|n3qZ(RG<60VP^iT=& z(XxZNh9#KQdqt& zW3~%^VH7K&$HfJj?UhSJlUi?s|Fm-bEh?=Ax6D^U19iSYtRDYZY1SzqX5@w!gLuq= z%Q8qp8$!!n+Jd@m+`tYvlO5cX$egVeqza`8^Rkt6TZAdVk?_Y|dD|Fg3hW0+>=YQS z$*2Ns)BehxVmZK+2b+kAa1q36wnFQ5-P2krWUPh&Add*i(jaIDT*^~g4Vgvc10&_V zm85bY!>aV>4I15cAe_!pj4`ldrb*1pTd|7lT?PFl3YUDWuX~4p8xGN zJc@Bv&ebwrZSDqa*lgIXgF?}w5KzIdskvpIcE`{%i8Vl9$1K$Fk|hwc7eP#N5=kw; zYsEk;T|f~X!8DrQsFeY@Hy9iZLnxxj@VTa(-vrl%=XDPpuVA97($bA`eT1P5TG6*6 zj(DMIvp}DS(-rr2&51&*c?q>QjcYNLxC`mph9#FPy2x~S+yk4-OpaQHGI2>J5S4a~ zN>qZX?6JLwVs++GB*ClTZCS3{UI75`amR#Luv8)fVmLN}tWW`Q79tYwXgE0%a8e9qb zHHyF>Jc=`04jM8vTH~``iZnt4|7!Sp$c8SY0O_p}7(jhEsw0{CTnog=3Pz10JX~x@ zNEUIn1GF->Y>15rZAL#a8k-|bxJ&~Y5!AJ&PVOsmJfopYT3#Ywq5%{Qm)M{pFR6fJT)Fft*oh$d_&~SZ~8Y+T3{g0B#`xl;s&mPcm)5*It(imCy51TNhJi{hSUy7dVwqjX5}CXCe1XCvPz}r_@WUk>hx8uzzs79 zZGuk6aZIL>6SB-mjuh4HsTIY_`T{*)G+F|HB0lEg*OaNs`Q&X}7^wlC!bPIDZVJI( zu+-}KAni#(a!P9vwzPRERl?p122On#+IlB!feL#<2&%{l!T}L{Z~MxB(GWUmC0;{n zw4^Mnn-nDcFfoqpd!Rk}Dw5-1j@tTF9IV76Y6200;A$Uj#gb)YA%*)|k;lM7;sM3E zFgr>_W7bPVS5->N$bd3wv?Nw2R(w~D6^NAfA#*2>DcZ6I%_Nfruu+YmA#Jz2c1UTD z57ADznDLwl#GI+fBQ2;JuxgZ2DF(u&&9GSm{P82gU_`TvcNyj{~3F;O8*7D>#DC8l-`o<$K_ zcwsBU^l%^yk-{L0P`<@1fn0MoNeLl>e1E!$oeX{7i~c^S;! zalT_$6$v+^ti&qj7M!}1Dm4^KfD*e#He+aU2diZC0IAR-Bti}@FMW2ysl@w8 z2Q~@B;btfWv;#eKZqnu}+=sPCuvgyfu#Pb!*V1yZv{)>hO0)tHkT2qg35+SU^rn&P zl3#FE<`+ICy3)`BXT%{YEOD}67}^yTX>vZuL%Rf|l&~?3<(Kcn-J*`*1bGi@5)|91 zjz>`L19EXsgRDv^1CEGz!C467v;h4^>q5~^?13LyyYhBvS6o&PqQlumKoST~lQdXX z6RYNGq$UFLvr5;wF_7}1G!^Ew6X4@2B*ZR}O-M^xhyLTaoH&9-r#`8LA;oFsLQB9i zek4LG=*X7LqhwZLCWRz}Ou>$8y>ij4M#ARFNlg=q)LazC1JFuRlmJFiqbTLylyWu#CX&ET%fJOwkzRY5tTC6YK))FamoJ%9@TZ7l9t4SnE#0Kd8kIZRbwe6)h+1^` zc#ymsHSiN5Fk!-(vPxY7r^HiUjmVHIWtxT+eJBl4Ku?L2cnc-4w02Zf3Td7zn98(G zK7^hkEjAReEtm{+lE^xZ5^ppjOAr#pGN3fNObQUn>R4dU?nbHxjFeubG*O7B%*QOf zNa_{kJ%*UYSX52v#j&hL<=6mRg$Vv?ZBtH)f8}DSDh_Z4C;Ace%i9%G<<`IK{o5H&jlwR-^%TZlqU>G9xOd$-75i6q|peP#<*^OB4Q(wL<;GcuNC9S(uzYEl&oGJ zsW=zrOqVDLQ$8xO+F@S7RKQehsT;q_X1PY7NG(IgVG;7faDC-Z?qtzz4ExK@np;HZ zskuPm50v&IijgxRMVdlIc@+F&j+B$wwG1aB7f@`5 zqD&r=k0=>o6Kyhy>WiN7tJ+9L!511m&to&moN`iW4lt|K;DREx|Akb2g8W_ATp(3h zf^Mzb0J5pOvkuykA;Pt2z<_qrrKrTeOdh$ZL=lh6D0Sx!(y|nQ9uoD+${@nX4#DP(X{6bp1>%^VVf!0ZGCM-pWrB+X_k8uoIvfg3?D#(^Z}AI3_a=~Nso zDo@VsF>c}tDEwP@hOW9B0l74Hz$Lyh3DN<5jjCD&3ey65(b1HCM2(6JiIJ44o4K^+ z@DFl0QU*aVrQ0|u1(QmMmK!I~5PZp<(H4+SnOKxy1qiM{f;=Fa5l$`eKB?ZTCErsB zVtLJoGV&s|8sPp2=~|a_SA>YnMQRokDMGd4E;))o%Ur?yG6PaXEC`I~4(^opn^7ri z{p5BCkP=GFt6U4xuBSzSFuL}+v1~!oeKk;T@5hb$#L3x5+L(|G&KtLoY?jHd=Xb@r2eg>v98;T3+QHU#Uq9cf? z7c88(+d(!Mgs-C%)b!!&QW?pbu`fs}@`{Gk>4q!apaUe}5Otpw)(N3>-)xxPNL#RWg~8ih(^W5SU1pcUGmgmNWg!cXit;aO_6 zLb7081IwjFvD^!q^@(X&UW&MlpcOm?LJ+p1>!j=D=2~z#13pE<;rcO^S^!14mHGwn zsnA8}fpwy;OF0JQfI~?K6(1@{GgR(4BHk4Sl@hDvYp)jF+rnCv{vnP^aHYZSd}(pP zCoEL~PdbQpX6!zQLl7+-P_&FWl>;WuWT{x4#3nVprLdB`Q`c7tguC$T*vfI?%lw3v z+Y66yKXjlXG>ne`fV&5QkGJ~)*cH3X=GGb zw>_29%PvBDI|V_Jo0h-D!NHVg6(JjL zLvV3Juw?)WC<+21+In0g&<2U8K2^j$nVG~Qz^^ce`|<$+QLA=w1zMCWhsP-QafS{o zQ?VyKaRa6b=Z00KHzjy2k76`LY)}0c*IKZPNF$X~;Mz5^SU7B_b0(y?%!87H<`^1L z+h0Am!3^;4FC>c#02zSFXE zw^vm3CB18K&7u`Y{}~@e!3-LV$P6k1Q4bZqZHE=nmy^tPq(@ZUEF7ma_M`-}8`HQ{ zN(WU?S@4fiILQMfqe7HL93qvGB=eg)wRqS%%s@m^3)O2O3;hc815&H5ovJH)R~AjqTtUb!8#&T^uYg5CxVy<&5FsR%+NkK zD^XZUZA*0PY+oRX5Mg7WOV>*Jfye(=VjIO9^&oAu50*E5A*(;nt z!hsZxni5g_j3}j>3Se#^oXJ-rc0_u`;9w-Mqbcw_HFVrA6=^9hk!2>La3B>5D>*lUu!!+{C2)k~`AT~>lBmwHu zS{cRxP~B!n0&a-h*g3phjt^2>60_QRBGZ&QVG%K`fL+)x%wKS2FoVAMt;e3m0 zpAt%wm}$F4WsCH!BC_sGMYXY#9(35Xm$}tvk_e45q!SRVU@Ib41W)CXZly9FgP^d6 zX+{^Q4is;MazL!0B?JYSFublH(vb~YRPd;jLWyw5rSH_o+qRN^z;&9B05#9NXIq;sj0y7&qYtW%tvj;lBuKv#lv zGm;)AcfyK-6ICj_#q4mOY=T>%29=!6MEwjwk|6sB^5p|AZpiqPzml|}P!*}RE7asJ z5+X+yj}Yih*<(9mHjE|yQu$N13b1;yHOyryH2 zTuY5hwvUYsd{LQ$E5by%DxZPnJ()~xL;&n=Q z1p@NWz(N$6AX4eE4p~?V!AjX3D~c^@XU^ypic6bHB+fvIkLZ>PH@aWMtU1gQ%+EsQ zvB9CHCnO|KWF4MHW)Vu5z84u6Hwi@y3%pINcrQb$pf#6};-en47mlFVraaYIacYv_ zlZtu_5#4LWR`skOjr0 zUB>Td7)cVi1yRvE2x>bR%gfwE1<|n$8eJ4`u9m4IHc`&Ze^O|I0Tov%!6F7I7eNk2 z?*BNpU7|@xDVIc@l0=;8Ya|J2P(zL1dW1=ghuWmtpdT()e3vBCt`HL`@O2_; z30NXf63B=zl3v!)=xILyohcoRJ>3XAK3&%g<6spoW)0mWJ0l2Y%-k_nRpP2P6sC<# z)atxO&8SE(?HoGP7l1I=AvN_`vajrtY!f?<-e}@OwOE48_(?wE?pf@+Nj+wN1Sn|{ zi~6{bd_yh(Zl!2wH&xT}GAhUI74@Bl>H>^I%yp7(Z}>D831zfCNW1u2}cNmx;6VOt-ydu7Rb6M#NxHf7h|dr86JN>b^kb zAu8hfZkUQoz40q+SVuncho0~Ob2YZaG|nDF3PV-o!aT;2!H*T>ww=(tG9N?-Cjh_` zD|DfDBuRCg_?XKSc_KwM8nHGRQL4(ghbW_vl};z(Hbhs9Q6$3F<=!{JcbpGl92TVM z9r%OuSPZIfM%xLSxJE_=9qR;|QLK`eM`h*&oxtiIYuYCiS7D0q7`dbi6D;rWADO8W zAZ(_>Ev1%Dtq@4LMcdA=A|G;Okwx?%ur8XEfbHNdRvj%!NH&ndtg2U~=g4O?LKJ%V zfUV@b1m&`d(3Qe7w#BUJkPEKIDy7UwVYOxztz6ge)-qqKN~A*)X$&G8H{4*=iofk( zffKdLgaQONEhv%IE!qqPXFo&duoDO?!W|^QGC_F>C7q= zB4jyJDy$xPxDs!HEgT7pirM%)P=IJ|>^UQf4G&|Ln-r(w+?movSwSuoJm;K64dtL| zah&Wao=fe1=|@Ue1KK=|F-7hAFiw~1cBgG>U5%{>1KQkVjdpdR5feHqiV&cs5T8X=sS~LDOKX-LQ(*&@2mum0Tu6xru@knU43XVH znU<(DJ%~!Bsd7`TAUsAtqFUwU5dswPv5{kK(+9yZk+_ExCo(!|0o}@9G>M201A)S*gz3pA#)VF)Q|W6)@Xq8^{WASAc~Qw$<5<6p5=i!B8dL`X+6okBpd z_KXzEaUX^eJ{krflS(;YE^Q!~8^j{1#mS=N@x;EwCfe%?(4^zUz(}cyw1yr{70OMN zBlAr?aDqBC6~2*nRDHHj6r_J5(MDN9mOP&n!dl}eq{oBc0q@vI>0G1QtK4ml9*f|S zxLCMQ2otVtVR^YcQAucY%&|E{A$|yO37>)~^EE86d`m{wCqep>%1I>y#hDRos>{gI zVk67Bmc-y=se#4H)l=c4^+*s`7A0Mad9?*3KdeWW4B?evnU2$5B?}=_a_-QM@=ln? zEUMrm`O^-!EkLvm-Jv9Do6nh5d?rTV9ucGy5CtQp<`80PD`;bkm<`Q^s{k#h_goa) zooEAVqlr#rlLU7W5qG5{6G-Va0b!c4U8b^CN)$uXqvBGVj5&)q=Pt>Ww#&wL6%mLU z56(MEl2I-v^M!AC$3#IwiZS9u3*4v`*CPQD3e1vxlMagtH*uz?9Sg)9(ySDh$3b`| z_1gT6SyOlx+DRvZ;DWn zTtH>5@}RWyh0&xqS;&&&h3d^XBu6!;ePK0}L{jPKr&bIZ+wCJ8f*yoW^dG{>wIDvc zJ<+4`ZVkdH!F_Ow>t_Y6XoUzSa3ceEEsC-+*HU0G9!`VF>4q}Xf9OD}EaEYiO5`L*n*aKT=$uL){B(*SE^$4uy(G2N1 zIJp+~faBF?z(`m_l1c$ux?+k}6B&uJ5By3Yq8Ztk?1rY6RQHq5fqSeI}0s-Vh zwIOQJNlP3-kv5j6P^cb&C_S|&K)iIz2YHlUiokLtHPYK2Mry?okf%r%WC+ZMej!Rt z#5&~zrmawj5fnLqfyDUCp_C=yYF3xBnW+<}2^=A%d-Ph5*bDBsfbyvw;Y#o~|Bz5d z#6TYk-iiRx7m-SE3)x4-8mmD#aMP`l6Zhl9TaE_qHaM*ilUZx93o1a8)Y3s9RKUEz z!mC54jvzR3YKtK|&M4mr13E1fBKRbA@{uG=qxj%3DjI~8oNlFDgK1biQ9XD~Yc-ju zbt9xmJ=}#W08@KLKnxAQNs;lubUGG58l?+F;EEP1u3LdNY(or{cg6Wn(;!aH6=ik? zByccDD|H{3&?ja{-UFbrq^OgNBF#ZxN`Uzfn`icF#ZayiE}Xb4{bQ}j-%9?+YUF#0 znCaniFb%eZ?6P}{Px-v-t~(z82gAciZY<^cIwYDnDkMGQ0@fZ_v#QIb zzE<=Pk%DAcY6#RQ5E%8$2j#1f&eHc3MiK9qTj1uLovUE@)yN0LmwY)%9idO+>zrk}TuZa$` zLNyTQgUCLWV!-5F*J$VgJ6r(wBel?+B5~P{Wd}Hwv!Pn8B}_pWlScVGX&&-(&4_>J z0UV8u3y3Dlw2PnQ&8mV89j#kk9yJ&u?bO~9oU7%;Nou?WYmq}hrIB@sB@jemGK`}{ z6%e`!kg7;>0V&jla3Wmh7=TanXzmG)6y?%_(I!$; z{;KXzH17m6Ab~SBmbhNf1f$`_wUg=QS?8(3Z~V`d%b42*)7_=yx#1@XWcw+ z*THe8=ycmfx~|pkwVGWL?M}VXj?X&vyxr{9d%bQ>cOX7%6>XH%ExH~uoi1rZD;T4d z7j*}43R~{2w{XIOqOQENgE-y1=;ocmpLJ*_;8N{Qr&aG3oo12*83^*Iy58-z^jU|2 zSwORBc6x-1Jg)0-E1XNU+9_IHeb%lwyIn20nRn~Wc;2klBNAiJUWk8 z7ai2v>vr{~oo=sQ6s^3|ZZT08Yj|GC(kpsJrvNqO8A0;aqSfm$2mk6dK!^-ovD!|n z+siv$lom=rcfES2-9atAPH7_IZkGbO+sW&_j@~-d?V(9%u-DNF9JYYK|1 zZaa`!uVdW;KLNsdjMwqnx@Zp4sOM>pE}2-~VtqMIR?6J27yR056|{1!`&NfZ@@}_{ zgXK_PlDWV+;4?5-Zs3Mg-N z_@JObNYnIsxD@0-YTL5df&!2QIfVpDV&`?dmGiYd>=#d4f_=;ntnq9#SV;q=U`RX{ z9X3m8Xk^v9-FgQzbV_Q-yDccGQ!j8ANAeclkJA+eL$xm5I2J z9N5YONgb#X<28Hrx_sBsT}aVo_(?l(#Im|AX;ce_IYQCgL*k7n6wbZy8sN;DU>p!u zl)TdG3a51(pX#bpX%+s(R|*`jnaAxI5=}8XHUYw=R&gVQL^G6+);?3VJ51B=z`|&- zf)}5{nXqAyYsavrTIu!bL?H8uEQIB_87;%Hx>u+w>Z})t!P#~(DF!aW6DeR|W1B;I zZgraoi9;nAbu>N#LWc}$nrdN5f`(ihaMt5V8eE;*i9&TO(kP?`@fiswzK({lFpIG` z@;ngNYT{B*Y%H&hu^~C^!o?+oL4Lu-^@8=4-Uzr@3GCWJRF7w?K)i@ZxJ=fITQPbE zW0&K#S|ZV$$$NR^HiW<&3V_0il}XcG5Ln>bsEqYhA`^whgt$;ia6li`5doY|%N0J(_@P%%sgpOQ32@&qUed7x2#T|pVk6s(RTm%-O2LwHIBG5ztktgs0)oT)&^g@^*Y^KwT7?v4` zZN%j8Jt8<<#Ne6%=q2MQV}b7#9osXZg0v2{0Yu<4{KszJhVwBLAw1nqeoEE`>uS3A zj0mjEhR{==S#YOAGK1!sEL{gp7sPHZY{F}iim-+p9p-h`uBaFzw!18qEC#LR<;*C* zhvD%2oE61&4BkX{1TG1XB&-wkU?MoE9>;Hk|M>(hq8wdjt%7H<5R)ZTfkd=OLLii; z;mATj8sL-HC(kvBAaD)=Mnwy)x9~Im(?phFIpQ4LOu7O9%Ny%BDkf%PEFbccvI&u- zSwseF$`OVskp(RWa!DTGtrigNim)qZ7VJoSKzW1?ryIC^(L}Kgm!iaf5ib8%M<@P)QOeA_>hiC`3=52rWam z$>s=0gd$hz;nU%lIIWmkF5W7;>99KR>9yg}Ud(|sT}CHghPs;E9aK*Qb7*Tq8BL;c z@-HY458X6FfYJJn50cs2mDErS#^So#6k1qgv7;Q*ET!_MH0Kpf{1h- zoYH{-z$uuMz^j~MwFHfzNGOejkZgsN61Pc4mob!VV^R29$$$7X;hKq1V4lnr+=PV* zt|6RC8j==*V4gfszfi#;GrcZE2yV8+2!1BL*QDHsu?bgLl8ET>(r4fWCP5Nk7f6GC2}by?K0`|sf~Xhi;PeCmoDMLO zL6e%5VUsIcay`y5L3nAg1WTX_HZiwD4rn41K?7}i2VisRSKL&9kTQa^Gz<%?bX7N5 zJV!93A#m`qH^0Ca_9sQhm`JG0kRIm1QK?URt#)qf@Egb>LqMgVD%pan2)f{7B2gnU z6tqUD=61}@Na+ay;u0Jp#WdoGEEOkaX0SH@S27&VNW{dmh$V@BC}z0^J%Qwiuh

?qu$#d>1BrcpyQBy;E)#-u<3KUql|4l1=mtR{dd>rmQmt;lGwEU;=3LBrq*2RMY1 zT(YPX>=+pFz%@}JKt&ozI)%txG8Dwtc;p00D+=w!G@MXA!RCysIPOy*QF=pQAj4VY>{GvzT49k6;XQ>(xDvcTgL2_`9bkktYGnL~ zOdzccCS~=gsU#p(_zJkPFR78qUTJv`NJ$&Jow5R(m0+3_+ya_iFdF$LF)x9Q@TA12OPnIT4$Tlk z$c=Dw8UtmKfc+sgS~qB*lN^bf9uwiKV)c{>iVn#>NH)_&Btg;u=ACA#DpP2kxX38; z2?SB<%~!;$wDn8pgy60+f>Opi;g%AT5O zih?n3k4BREFf0KpM+~Q)q`5L>vog`&8X z3KGs@$vAkG5(pUh8AIZ%Zc2zA)|eRKkY|M3Hjn%s}?r4i;O!DNKe6}pflg{H2oQeQZd+<~?P zh%2iYwHPQml&X7QQ-PR>uhtAQl^LHhLzD-^>0?e4%Qm!5Od@%1*}@nQ8J+wyb2I^v zfNxdA69`d}^z42#axt??ITI|l#rFkLB8LDceNl!|tf;D{P{VcNGXf4}0tS~P5=k z5c1UjL8!D8Je;fnmj?TRBGnyK-Vi=^_eW3~o~A4g#HFPvT@ifA2gza$4+nTse-uVT zBPm9dhN~j4T2?K`t;h$}wcty%?z_n|)B=QHkhn;SVHh>C)yE{#N5nLQNsj1$W1U9n z|5Pg~KXhThns4pZsFj?fUKbpg8Al`s;7ioQijq}eH311RX+(HP(Ts9p^$f`<5~%_b zmP`^)PMY3&s3GAtl0*op)DDB7WxPcC2*bnURDi&Z#H6gI$&K2qmo6KTBeDj_ns5f9 zSxu-PF<1!Br%JLUZKtd>ttk9TFUC7b&57GeX)Fk%DCWz>+Ek+RCO zfdD*4>mI8}VpOc63cHiYkkrR26y3QE6rxneZj6AL5H2!Q-Af$omNEiUNa)P8*bcr3&pPJk0I!XY50;1_$L|PsAl;YG`BKaptUYHOm-3i}V+gLA5EVgP}Em*aC?N z0R&v4N(_qa>Y#=$w<`Kl-{=J=AWW9qkIDqp|G>w|WaCy6O*IoiH$)fu;WG8+8BE(y z@fjs)8%jfPcswY$CTN9W>jsp5@=!?#?&r1lLP*8B?{nh z2}uUTsq0kR5!3*SR#*l})u=S#L{Rur5*q|5Rgk{Q43o&nCp}i93@K!0sVqw?SAmB* zb$iMTycs0n;B9n59^|EWzqB%7M(|t8+(^{ajiUELra*O-s0z4~K@mw(cZR}KNC#}hI!qO^LhY)a3E4!D)RcAY zshmKi41=^Jv1o*Vfm^CyhHvVA*3Di7YNAW7t$KY1;R6%glAx-XX9-pH5$MPdNQ|qN z7kmreC>HRVJSiS8QWi_(R!h0`e~#7gkyA1nD~XAunq0V!tW$9x#*c&p0(O zqT8x1Y-2T24Ti@#DH}`Yhc>jo$0*fj+PPubWX}b@5gK#v7Cs>FM< zro`%r$>MSJK4Up`BG;g+*jEs(Whzx z5FH4s_>EX2w69JFl@-wsd?X@7Cj=ff5F}MpyYe?WX3E8Vr&|Spl-iprGztwtTD1#X zk!m+39Kd6MUip?9CNZm`3&0?v^FwF~qk|T*CHx6&*+gmqlYtN}h*)JgqP`8Z|TrqY-Y%~Kq#%F|8>Mx1{09RJnQWVV} znY7x@g-9rma7v2Mc6l!gL4~*-e3(8{hm{M-DyhcP;$8`H~pIs%7>M zFr;OwSHM*wfo2Ch3*!)eyk7DJv$@EPPC*s7lsIvf&qY}IPDD@x6`Yze`izw#1<{lt zh~zHNWnl{=S5geYU7?9iSlE+L2g_w){W94Wc(jkF&9X3w zI0WLM!wOeatWQCKOw12s){_dAi$U9hG@KG-xQ)1~pSue_3#Xvf>CaY!e#2K;1P-ozJ-0Wib~CAR|6q|4gQ#=>&Xn8AU@J8|qD zBFHp~$N8 zLB*%`$KpElDqcgy=wQlW%7@g?0fgx~E+c=`jsxK=J_9$n9udF=tUila2KI;^Fm&*h zjH}cY(_s6ANU*5wa|%JSkF;1KGz|-MC(=&y;*m_Nwb3gq6@|6Ys2GBuLKcV`QHZ|k zeObPcMfo|H21W|#@fmB@4z$X%xS4oLmI(N0nFYkj^x5}UAfyf;$0=hYm6qC+cmnCV zQGg{$M0JvdkHKJ!h)zi001JzYenK#jQfWwlkQUbw<^@?5NMy9-`4JLxuBeVo5kMJO zTUoeFRf(#Vpp6tX2&KeuxEh>ANL7cpSq1-5(-ROpKmE4V@9P#CF*_ zR3=2<41kx}J0%2X4wV1WcPt|fHxW1}egIP%j-(F8fh4)Ek&Yx`1vHPK5MElXMZK$rITipX#1J`S zyNqlVMuc$SclBAyz6;Gs3Oky5WKdSV8>94~(0$r3Q~{;>l=;C(7zAnPjr(8-rB@Ib zpTXa3H{d18QbR)J5a0mvfOZnd34%Je2anO2Oqy~1j1#I=)t!0>3A&oH=(Vgo)m3A4 zJ~`d=;+(LN!mtQ+Wid@mO*@k$4w6<%8j3}y+B1b?seKzwD~!?9m?n~-Hi*gs*+)o8 zF`eRC$=V=@_O&W?+%FO|_f~X-5WS`)E8h}UxhO~r0mvRXdqjapL`9u`I@R7ONxgOxQ4AE-4UAH${6 z`-ovEu22NSrfER`$4r~`x_>J9#f9T3VZ zWN^4zQC$7HWM=}Tf-X6zI7rt)fJ9NqMi~-_N}nlH64$6jQ3fYsrAP!=6DT|fSs^6G z03@dgt>$>>49pRX17BeQ;wBSgK97grQDhO?U^r23Sr2PZp6Z7DjoUqmBBh#Mu#d9N z5D+(kS*bCoQp!Jr1IMYy2mhdqxD1XF@j*bCpnW%l&t?wg{~d2_xtc4Vwm9pcWTL zLLdaxbhpR~ZNtFHD^WP4jt`(Y{Xbo&ty+~wO?q2+PMTRI9S7yw8gK;Gu?T@DYO%)J)b-Qfb@@4MW>qxY6(x;k-*hl^hZ#q`~qDB42oj%f+@Xd z3j^TeH(s2pVCA|BW*FB#2~r>kl>&5V)DcP3r~yt+rv6Mi6UgdVF2OG#zR{oj&L&{5cCv8XnsPaAE!5?M5!(R%% zg#ORI^m=XaU9Y`9m({;|XZ|ghmcH{?_ROWr3;Z$R*B98B^o_J8%vNA>B`@BW2j=S%cUwH0#w*F(^`Q-Vnzw^t-v)wGab77oiPrZGT z)lV?UbKmpet?bT;>~{9rKlv-){wKfxPaev$dq2PY*O#9E{KMJX=dyQvZ}!?(-tm3y zKlsW!nSlrEo_NQ}>_5Ibcj=KI(Ukn}^+)~_7W3$r`RUOg%f8Abugtyvb+3JH?#{b^ z`U`WH-t)Jzy?fsKw}0-xy65Zv?l1kjd)}A*>N|ezecbTz_y6MWe%G6_|2BK=*H-?) zpZvkEU3^`G{c^Va>-B7D{!$~mfByBxSKjs0zux@y?5p3`%04)MD*G4N@;`0=Mt1f4 zJHO4f-E8frPi4Qe_b%aNA{~C(=`G5HX-|%l= zf2#;#S^qD4{ew*YjUUSX)%@!p`m;a$>3{xVKKjOw{KcP#akH#eTmI^$W9QbsdO2JE z;!<``?dO*s&)UcCJpPu;XMgaCw?236Om^RAKKI;{=WE&PPrkkO)ic>&`RuWKvxmR8 zeectceCbdb%AMyw_Fe#xef=*SyY%twm;U75XR=>?7Z&^VW7)IWZydYxZ14AvUHU}! zum9d#zwtx=_n*A=>gAK2v(H_5;O1Fm{NXP?pS|xNU3=jZA6m$=&tARq$ZuY|c71Rz z`&8}Dx$M)!|K{AMK6CrupL?-iTmG#V*J|0NPp|*@cYpGmwrW2Q{Ccl{>&?X^fSNxt>6Cd7w&vp_U8*PzLYI?@6SHR0R6wgLi)OE z^?Tp*i}&C7{^I!SH?m9jeQ7Ow=6E*v;ZMKJUoL;?N4~WFpYHPq$$$LzpYrRS`}iC7 zpYNU@{>+zN)?c%~qyP7XFK_)9zwldM-p>BP@oXpi)klA4=kNXI`h_g}-M{h8qrd-u z{NryPXMgsm7xsSnWbf_!|LB2RZ_mE+$j|=ncQ+cKYi=L zm;a|B!2F%s>z}#xd!Id#z4H6D<==ZH`vRY3Up#T=_W$;iKl&4|{_nr=+duJF|LrfI zxb*G+?w>yOZJ+(q|Cw+9?2mr-q3r*uz5Z?A@fZKEF3#?M?autYFTVDj+1o$AoMrF& zxvzcKo4fydIeW`v_y6SQ-unEDKl$BU^ZIw+zm9{RAAP0&Js{}!zh`-F>8C#b&L3L5 z^u3S%#OGK4=6nB3zJ1@^SKpDX{CA7l_ci{9#n->D{abw2{XPC){=fd*|MCM2a^pYx z@Lw#x3x9pjyRygc{q%qSgHOHVOZ@uoldu2KGhH0w6CXbLNcP;^@*jOsa{X|YU410W zUcCKC_Tu{A=BFJl`Ifn_@>BM;Kl;(^4!`#QX7T8k24BAY=$D6cuRW@}UjOpWFaDcH zv++NC;Aek~ruf(4yPy8qAJ2Z5i?gqtyz~>V{-6K-#((zL{^Dfz+IP-ncV7GJ_wu@f z?>_(PyMO9?-+RyNKlOdxd+z*n_Q8AJll|bwKJcFGi=Vvb&d>bl>X+ZcU%1z65q9p$ zewK$W|KNW9dFI@A&FPU#4gBgI4~xVJZCY|-1*!Q|#S z{g*#ye{eV)4f~_zYlF#TcsQQi)&);9qwc%BzOmUK4G#|cBc&gYzdE?Fx%~WK@8;^x z@P!ab}U~Tz@!~WsmKyrP&|7w4GQ#VM0tK*&iXiez2zCGzPy?%Ubu+yL1Jn)a> zo#D$vFY?*JE5jRO-_#%Vcl%PuCkLa!t2en^*FHO*jBnf+i^{LvoNVt7LM~l*d9pDW zu@0;4WBt9D{IN;@)!~kAeS9+R9}YdrCx#n?$*?b_eSA0>uJXBletf($-d&B)pY8AT zZ=+_(@;I`r^`(kW3~nud(}1sHJx>iLyZzB^FXHCp=4j2sJa%(uqo0O=19&Rpwd^{QWlBWja$;PlRH7BKhd^p-z8}I6-PY+nGMMr&MD!a>mT+f66e}@V=Ui(tUub=fp!iyWrnN$ zZ4-k8{rJsW{o$cjaRm|q(fSZSAHM3PJvki7z8dt(#_c^@@tcObtNqnm{{G4h*laur zH$&iwL8jp@PvqzQ#7T;X+4T*E>RW^MpuoE1dlpyS=pV2|&GgK0^|qmOHI^J+b8{`A z^33pX^JeJ}S3uVCwc+k~qG7JTx;mIH?V0`|45iN>AA_Og=TV`=_}F;DP|B;Xue`9b z{K+BSJDT;6kD?Jp*6gxC5^H#Tvu`at#-c|0?%CV@(QbdD0Rxy?*JEG=2rfU_KNwpl zuzO+(DgLqX;Q{#SlUV=ZTli--v0g0IdjFedxZBBz65g-ArMCDTS#559Za%9WTR48A zmMxyV=fs=deCpKcw=C68*A~y*yLfv3t#jGgbN9WicK`7QYUfX0c>Bq>KKNH^4=q1@ z?*p}W%s;$Xd*{0rAGrUKM;DHtT&R8ByWg{Lq4wUz#ktyI?d#uDyKo|#KYihSON+Jl zue|-@qh}WD$IqR<(0K5^=9yY{v6i*kwYl1bQ?&~ZEIqPxW^pO&JY1Xa_G)Kp^ZA9^ z!|yJ##ShHS&o9j_)w20o_6>^kTKKSPM*u=mmaEp;3Jn# z)E19lZah|7s9iYEeUCr!K<&ztHU2k${QO6j=1)Df^wIgn+S6ZOdpLVwu6E!2!c(WR zhZbuOd@RfEIsNhD&&)5>+RtA6#K~{WuD;_GD|#+_e*Pob!?lMVTz=mJA6Qz-=9&88 zxeNEbaP4~S>?dm%+O^}0Pc6-#|5WXrwNnqgIDcmD(+@s;VR3os;`?ilFClaL#6oTU zo3azxQVpr*p31%%mA{quDZKORvh!%+bnR4DTR2tw76w|#Y7gCa>O}40yK1K&od3+i zx6Wq|TzGi?)VG~{)BNJa#S2;O!Q+dyTK3YyhmP}~3-h(J3+?k4E7FLI2&%w z*J^Vc2t5A{^T)H=sk6^K{J|G%AF5qgIk|M|@_cPEt7Ww}AK$LkHftA-FXT%nYfJae z?<~%La^W~{3AuQowmVvU>@*i$$c}R#IsUoY{CIBhWbNYdy^FhNPCj&eE(31IkIyfi zdmCYL{`lI``{z&BYG+Rz-=BcN(@P7BEbHXbGjmJFR}an~Us}BO@ZrNJYZn&ZRGWKj zKKr)$rF+lRmKuxMsfC5bo#Vp?(C0>W^PcmyrP_;gh!cy%+$4@QQ7A~HuWpCP?pFi`K>?5x%e#0XRb91N9Q{>dn zf9jR&rS(%M7N37_4NrNDyUu5G+5B7PP8>hY1*hibYxf<0@pkQ{+JhHgt<^qK%l2yz zWf$(hdHP%4e1Y$4e|6#PNvg%#{P`2L+Qm~Rv(wLCU&(4uznrzc{rG25#Dk|!ES#zR zwc2+K?$nl--tr&>@$-MTrhiQl*}3EA7T-p6-4B?yVX)aw=cw!VXy``J9r`u!LPNk5JhwJ)x zO>J2k7qz&;EA3otdf7dF!!J^Gr&C_aZ(3lt&<9DWUVq-!Cn3D-(ett!^@|cKuk>&2 zG&M9<)K{JOdr8>EzZD*{{LMCH48x?Q!CRIz@5RqjX}8eNjfC^?+A558?ZS_(Fu{rrZ*MJ`LAPW4H88z>l##kqwDLBwSdP^%&;9 z2QLYEP@GN1nlxZoNyG6^7}W5HfqE9C7rL~&bORlQO|L7NQUi6X4_LYF5=Q1bEj_mr zVeVLkgwV|(+bS!E_Kl_fta5*Y(X^5#{e>>Wd@S56^c@LldA*zods>b(ctbOF z%9-R~xp9Oz{v|NUyjokwuASR%d8-_eFQv1>rVlLUO~C*xdc5*Nt`g2mT*WV*8liM) z;kC3peo^{Hd}Ay!pvARo@QbZ#nNS{ft$UT4x)}r$K9sOvu0S6eBL4mY221)(n2P~t z`7)NN6$G$-g-1fk{-t7*@}fXVuuSskri`0=sr;m+_N<|HxRC!CgvOKIa{F{ApcXXG z4Pnu8ID^MX$}idl!f2?(W7|^@PTEeh2IF=c9wC`CDWQJR;uW*BW{d>K19VeOTMFnJ zbDdmkE&n$wRAD;-FjIBVAWD`TopfEeK?y&JSada%y{+M87ZGV#r58|rTMw%Cz4)=k z@(V7d9$gzFmDgiv4^W|^8~0l*z-aSXS4g2NdtO(mBDqO7A;^(6B0)JiNYVg3!=3^7 zIZr>^9ZI;tJ_(qKC2SRIvmG96#^O@}Gp}@!Jhvzv-!>1nW-d)v*ab_q`tEWy(s-u= zPh70&3HTZ(KvAmDl6LfsBrV62m>nB}k!8+UX=EowJ>0=0TiQ}12Q|gQW&*y*kHH-` z8V3C|Eb6w1NoZUH_Ur*9Ec~2TLD9%|QdC-iWf=mNpNnO%UbSfdW-=}f8Y|M>`kxjM z!7)~eTYB;`AO<~oZ0uU#=xCZ`eHN`AwTw)eg zt_N7O&dBv7j(%}a=DM(t%$Rtq3d*Kx+lp_r%=m@@tTn@0_kpPpg`e$k%qIbIy9D0~ zDIF7muF(Iqnv{`x`3XV2aA%BUaG3mjrf>IGbJVdrVL*aF<3kzV40uTn(+%?SZ`k0tlsj%@8z8(F!QQ>)fZ!I>;h6O?&lQkOJ|1$WG#k*)rT)Yl}oQ;fN_x+C+9rEw!2}-IC7~or%t)a_Usvfs#CTDw87dEm_P0cPr|jGA(Pj zjniFmU1idMX`a$n2^JLxbD5IMqQbv*ODgh+k!}SJywFHBSdWRSsv@L(tv2E^DAyu- zCI#k`Rw~}ojgdOxPlkU=GX1ml82MGt7?hPYKjzXTd4*iKS$9Ms-;M}pTQclag;0Ss zlb5!1Iu(Q-Sz{lB3L~X{p{z*&}+jQ&{2R|0-cYV13iE zKcE)rqGPz=hq6Us`aqTZ9AHG%T0jWH-NJ01>SV91@>CS9A*xb0Ji^LlQr%{AN&b?{ zEv6%~!kI3y23fNONbxqgc(8-{yrO>w@PexHA}$gZqJTmuT@V__fYycVnb@FPxs?{9 zD`&E=1a$<{s=Fn)Y{QvwCH2OTc9(E`*5HZDpeWb}Q}dG-Q4MFs&)~|lr4W%8c%&+d z>@mVuBvk}H4R5oi&>U%HrEC^1_(pchFZ$W0VP*VWC6M7)&eU>edZ9*!x3TZGpj{v! z%=cR3G)p5084vbCe)9bOg-h)rRdI~6^g*|>YnfzKG_Ki8e>S~DyGwTApE3jnY|2bm z6Gm?&^?u4PbXPRRP?l|x8W$QXG>U@wxo2LK5@p}Anc+3yJifwkX*s9rrFa*3HF#OJ zbP(OB7<1Yw)0*_9uViqI7c@U(wt%k1P|FKQF<55@o3Pg&VB6nGg~b#=QQbf;fn_Hjc;`6$~J-vS+eX-J6$f2rnna>y+;eE5m6E|MoTlwlkVNQf?b03$a#7d>B#UbT0>RpuzUG(d|5&VG4NBYKmnl@ zwX~JS_5Px)*}dl3RH|EcBEug8C()#iAV}nxYMP()OSDwVv>1i+Ntr|2tql<7=9@h6 zhw;#@7zR00qG5bR7qRUwUoY&4&k90eAx2UxbG*b3T2mFEY=0XG4k?8pQzUwMW^K7~g|biGbEu<}Q_ErIf3RwM<|z85v$O>-R4y zIjTB_x-1$M%qeB(PMbiZrj1@qV7ah)%TlyrMi!zd7nuSB2sKeI#D+x#QN|N^j`mY~ zR%?`D$rNSw5pHg9r7lgC$)i?-!ZB4|5IJgjr@b@Pff&k{1`be)=^}9qnvmEUp%Z>& z%ps;QF|8cXgF)iku#GilB_+iM2WyW zy=YI$v&*ss{SrjQ7haMLUnZY6T&1p*&KG4?7B^TTbfdc?;zct$vWFCe%eGuno8;F2 zQkb$xN3wT)VK^XO>6p@19>^=}!jeDaM&WEJN$$8D1x;F?(Z)}@s_bjXX(9|^2Q4$z zwxyj*KMt$goZJ#?v~baw>!kw18nd8^i&K1@o9zJ)%(TvkA6vmRNj)r9!^W=epthS}Tb4$F2; zCy48XIxsMt+#_=5NMxpsJFuIan!&W*@PBU5J;7s`O7j+FX&XQ(OTw8r!!5ExQH4+m z5ql(Qsdlln!6dsxb`(3n({-^Z;bH2W_^@qZxUn9sy6n4}al-ddkT0ut7*VeAYhAJo zttmw|7H(izMf@aDgIrLAZkpNK;n$;NksNYnHw6WGu~n}@il|T#W-no-ugYZGx(uVS zW*fjx%XrdxbPB~B!TnV}qLoxVkXVR^M^iDg?n%z>$i!&UX(Yj1qS0fMJAuyjuGlt} z9AyUPw6>FajfPg$yI>^GXdUyDJvjwKQ(-iZ7~Z~-5+UJ#n*9@;2X?ZVTx&v{7>@&bS*J5Ce|cv%x>`Zs+CBJ7?8^>MWojJs1ahf2s0wM^mMpOi>EC+6bJ60=oR;_Kb~1d2Gqx067qLjgH+Al?@;w@RAk5 z5F|o_Q|0XyV<%ov)$Eagj&Mc}`n-qDdkZLf-rHkm1+8cXigEx8=)@@t;04iV$m9)Q z#Nn`Muu+~GdSEAx*Bv+;H6$*?2yadr)rLdz#tFM!WSmVC?!dVr#R44Rpq*fQ+e8$MpD`9d6t{2dGhl6@EzgyXP}fyoKXbQ_fr$O0r`zzlfP zm~QSB+H}=laLTJTM#WyYr_R?4&{T zBr@Z61%ko&r7O-XjcXB-1O;FaJhU<$zR9vT8M#R6l5C84n=`A&d`0*de5m!NIq0FHD2KcfNbODXzQqgE@{tu9ia&H(S^y@0{FaI&@Bir&(oL zfH1k%}JzEru_)f8_<VB)r;jkJK2;x1 zJcP~3s_NHe!Eo*lPwXxeCT|?z=mL$NjiD2hHvz(`y86{z801Y4nCFxSyr278e6hT! z@PGp3Qu#*Ka=aUTJ0Cv59L=k z#&tKn1pikI9s>`&q4qJ}c0p$<}><$r{m20{1xd)rpYv0sniS47{Sq4(so;KHE`ra{<${$5k!@2jzvL8y!UsW0ii zQ&X!T9H(O7b2-xG-o0KBh+)sA4Gz@)%U;jqAcn(d-7JET-+_fs;>x1*!vBj&s1rDCE#v6VUTnX=4`_?x}koZ5LDeo6D%-WJ4v{G_)e zmz*AU#Anwt^@2zbRxe22;q9MMdrup!9Q9=_e=G+K!T&(6B>CjKI?y-)5f*gxYfwq^ zA9+Xq#yI_O^;p6uHUBfV5O+#vacMKkWC z4eh9%(_It7-}255^nT5KOTxq5r+*OLt0SxBh~K2*TcqdKFB}NZ?tLq0-pih4L}!b$ zcEoprlLhG|@Vo=z=Imh;;?Mc2AlwYu@QmpE`zy;Jv=fIxwn2#dn^RtqT*fqhN^%S+ zx1n*?zABfaecW1TNqA5-wIn&+UjC5eIV$r7;dH0F3E`k+FKG~%LEPhoHgq)8-X!`? z?{y$M=+N&m%~LwijPzHz=QYjOv70&3aVO|8je95h0Ui5S{!03O+Myot^M&4wa1$JJ zU5<7<>Gm5r&R39b9)vjCw#Jg?$(UeG^RMmpBjLbljy=);xBt34JBYm&pz13d5SgZF6syf%-i{a2%&(f!{pRTCY4ex|Ia zlWgysrq~l7<}*x5@B6>KM0Ru{;xXB~6CIqB!wQZwRn>Rc<5*Yd{> zbUd7DLv$5?a*_C{o?1-&%^YY+{Vr9SlfKqQaX-Iv4ulVHD@T&o?Nufu$I3kRFW*gI ze=_R``?K+_-;g|f`dQQbO%`02qklSe*n#bJel_ubOKnH@w@tMpdRkSyAh`}d{(|h# ze)bc>Z<|84pNC2dqAzOz<9FmrGt$>5-#nrAlLOzfJS(5jan+4SG~Ut)_GAyrY$@^8 z<~wu3*V1As;pavdmXn9GJ>6e8>Q}PI4ktK%thw-(#`ikQxI4VwU|)aSCA;iY#r|tR z)&r8G?a>F+|L5rEq}K@{b~In4oc;KgED6c4!<@&2ugZh=BvS6hCGEnRtch zFZ@}M|Jf65OY(cYmE+B;HTP-0G@S$Cuw$|<(Qg%IL;mIG0LDY=?kb{xL`xfL*Xf}H z&EIc|Bk^D0Y(;)!)?d%bet-7nxOVK7l=O2p&7Sm=+SZZm=%=nX$R6i3hX3COkEyF{ z2zQ^x+7oU=pWUSSEY3V59ONZRsek7U&k5g!k(Si1-I)@?ZHI`bB*zJdONf8f1v{Fj z-xU+$XWDanl3zquGqQv47JJzuc>RSaSKaKH4J@Ny#g0mqr4dXi&dx8I14RsA23 ze>i6QlHO0YVte>>8tZ?77ssVN-`693d}(J#ekD7VcU?}or?l0$R{w#Ver#heec5G1$RgCx}cX**Mr^MhXHHR)|eixO&Y+PIYLYp@67^J!x%(r@CnALx3khkvvGGYChmxR}OM{G#`VeL%VZ&tjd{<9)q6CU%fvmbMCd`WWNd;2lnf1Atp zHofpZ$^Gf8XJiNKs>Zh?UC4F|dR8I1n z-cCyW)_8HgwQ;f|;rQv`aYysdB^?1*5rTwYUN0N zB(%3V*_&-sM>^g=A|?5I557bB*vLO#)A)0*vL4H4TN17u<<{hnOjk^1d-qkX{FZ|G|7M{AxYI(<{gq zF;8}%Xhrk^8s~YLDHhZ|cc?w-^UAzegttCR%c)<(UpbFE zx6Xm+Nwjk$c~AJY9?4~Li7nYl7T_B5;voUN9yoiO^TYNVZK?f>V#dL+_9f&uZZBj% z_~%?+pCx>Bll0Is^(M)sq66oFdp~|c_}Hwsrt!Oe&HgNO8|U-ByQIW-e6M2mD{Frv z{TH^eAbAc7{fltD_je28&m&Do^H)bRKYv_foDN^{n%dbUTaZ4sH(|To-Id1~I+y)i z9>h!JbIk-^Z|s}#h;Y3-oAZQ$73?Sdrm?T@$J4bwj%0t+yZl0O8GDBFIrDPnqr9^v+0F2? zydJFD%=v_L65DNXPdl=UV~s1wpEfhIrTNoJxS#i%s}x^L_2m?gCjG+xqO6T6;q93p z=L@H{@_HkwZ9TH%<~g@WZ>4Uggp=n(Y5rp{)44L7SK`ck$^Nv`+pswhq?O4*+lC$e32?Qoy;_WgE2`0Tuc^NR~foUhz^ z%Kp`IfF;?*iWe&O}=2FUkuKf-OvRq`LZmPrW@ zN7t0mys3d4Us4XTUpf89D;g)pne)ube)mW|o5Tz9FHh%`l0053AJcKo8FSL>_NG!g zHhnE2Iz10Cj%}9l{NMg)OV?$E&xwv()2vB;THpuwS2FA_k-hx(g!d^HD|p>EFwyP#ww4K3mr%z|L%hh(3B;N&s<{qH39r)6+1}eseM@=RHF7GoOb+;#eKS}i@PMp6qCoqcj;wbH(mMUDUF{|Q9{Qmh#R;c9X@Ar|ko5Ne=V2 zvYq;sTah2DT*7k8tYW*ahPaIM|FxL?QTo?{>?``~dqnS#GF!@178Ws%vjbm|J%05u zuRB|ettL4y{9Qux{dU-#aGvv(3CX2@a%TbMl)m!8a&w`OLgS z7lKA;S&GX46>~{v{GTxflU8eZpB4aui7f2~Dz|Tm~FLp_`C!Co2@j7g= z>@mf?uiMy>onC2TNBKnJguhAe=U20T_y49I;k;QA?-P%8;Jo)|Q(jLrU(WXDo67cN zyOs4_+L`rrb^)(9G9%d@)b}Jr*Vw(hkA7}A>wE5Ke!nt+?I|$e9`U{AzzgzkKaHv+ zyNH)*q= z18&DvdA=rn7gVsm4;uC@)--4Tu;<}(!pYKAFUc>oE#y2d{}X%iKdqYoO7fgA?k&-o zwc-}N@6_}S>E&Jn&Ic`EJ%Rd=Hst-d!HYSrruX4I?9NhN$5m<{&^%TzIDdLH+kyBR zJ&gAY6Rum3KR)y={73yE94A^mc})0w z(vjsB+Tl;~>$66(-w00O{m+c;4uqd&JDw1K9+w#Jmp`p0c?M?M(7cLB-d{)`&VKKw z9p&&AKBW;eDVKay>+Q)c&`8DayZU)P_pf~%G z5{M({_gg$;dVV-xMgG(JPsYy>*r!6e<{x@PbPaCAd1w3Gyw4Y1`H1v;V59}bjl6oi ze|s6?80M4lux>&0}t`J|L@LpuBN(Ke;pu}e+R&I=e@{sCyxCQmYp!A+HBoyl5xxneC z387KS5S1)AcA8Qp>l*{*=9EemmNYaB(l-q2cRIm^AgGg>5EBn||DZ@63=NkZ;Bv4k zHY_1DzNRnMn(L#S3S~s&U_^zYA-o@u0A($qfS@`yK^3Z0%LYTCIjETF47Y~GhR06} zQ7LQsLl*^pkzfdP$2sc5dEc0+k*e4jsM-g0E}^JsXao|}ce*kZDnw3I%7!UJRZ6HU zIKvG`1WuLFYFSVi7M;XWiZBX}N?gT~Kt{zv!9*2)x(?)rE7j^);(27S%)lj7$;5KF zHPj784ZF%84rtBfpVcRW>gIYPz@OP3dItx z$b@k^BX+Pp^LsSYKt?@7*+_K))V+*}Cu*P^l1XXUaUT3_FwGs^VAY+t-VFT7{U`quSfo(t(jyOOW z6^DA5Tt`?){AUSJQZpWlh(dwXSP(^=643>-U@w9OR?So?)d*ZfD#}g~6CMj?UWq)T z@C*ilvg;33Gf~`zOIW&flyag0253?5A%IOAn}L0SDThYLK21=mm3U=%$aEv1fo~ig z%T3m~gqndGu~D&;NS8((qG3R#OBGg~jlphUC0{DR$PGjx2~1S2oh#6t7zD|zgTT?+ z;+0L|&igK)RvVx;>^dYgG$D?p0?ZEw_Y@Lmz+kO$)O12S8mgQG4U{UV6if``AVB9N zRY){cc{OStQGvP&j)3aBh*utZhOA~R@HT1G_i6qbVK3vj-tY~b#;r(_lZ=2 zIKZtyEmUF_2LX3rbcQS^G(D8w0I2XA9|14{w+jOkIE?0C6uC?>633{~VGViE0liwE z4;acw6ompR@2UU@vY-TV*UjKsaL5cc{je{gR4AR+@!TJpYb03;dwTR`b;uZr##hH5 zu-QebYa9d0tG0cOV@2tI*k;jp8V$Hsdq`gGyINfmw??xwiVo%ZZ;jF48{9csy+VNw z4wO`bC)A`ds?`J&Cj0R5=^{$ME)P@k8bu95;~ zt;aHkQFI5;89R})mk|N|6~m06NA!U6fQS?tk8bM2DjSJoy^CoqC~Kr1kc|Gr5D=9r zBzq7R0SI6VHb%9blY^gW= z^g?aaL|b?_>L@6OuLG_3?d$)sKa$6L-C3$CgkxP({-=g1a@9pFQ}Z9P7>R?t8|yel z`uC`gUcJ`K|36rvWaizm4Qau@uVDYJG`r(_4q5?W3lRf9b5y4=yQ!Igs_X))vYSFx zc4<9fFB}}}J5f3I`a-z6H4=?Q6Q~v5to}!~vgYnBT8dU4Zcv2XyG_&jAGh`K74Y-p z?d%&iYarTp5FQ{|*C8 zt$c(~41_|}oy8}O2iY_n{As(6L#%^86N7qS{qLbr{k)wR=^#e+>>z}j=sEOb5%{?f zqd%!{Dw?^OiZNq*ik|-Uq?TX!kL&a4|9r$ShY_R3Pk*P0LG!QhrvuGsz zTK2M5OWU@KPna4h#I)%%gm>%UnGpfQ#jNh4e!JP@K82QZ#8+KKJ27g?XN~4+CUt_r zMMJf3_~-r9iK5Toab5dPZUkk==MJ71BIbK6m>DA$juu0c7EKxN1tqr^3isduuY~UP zoUvnKQ|sh0i(0fv2~mi#t$GTvxYN)mO97?jmv~E-3aLEMXQo%rCY>arxl^KR@Dw4& z+AgzqNEO01SS(-BM|>n^OWQVVHn`8Yu0Df7xB*@sD`P}`Zy}m$8jD0>>mXLyinJu} zIjzOakO-&rjK(UFG^Lq|80#`IGs1INz+|!7e30m#p0&u*a@0&OiS@ATWjO-^$G8cJ zsSqP1s{+tOZyC{F08i#3bVd)6;pR4F;?}i&2F#k2 z;48MZ-!66t#V8xK*ty;$$yC?~FJbHK*LiBFj|ks1cE?1oj{wXq)hf|p?554T#56I> z#WL75!@2t>zCxWC=wmZk?A+ZmsM%o4#*{emx_QKXWKx(Hl6kWyB-BiI<0}4 z>OzcLrRYCKbPEuL!QI!JC+*x6w8eLs2%q3HB1R0D;50m@LFdI{uboggk~TCo^_b!- zHefd~cI>E;O+T9~dL#vS$B4F{wwyR?>HMxDr@m#QPyBF?v`=M5+B*LD^!loclxCtlkxySBf0-nB#5cF2m8uWh@w zwRpj`9oKeWD=1!kt>D^HA8764UNTubXf#H(Ya?o3*RqZL;>5 zcJ(0bM!1%$Ezll;OKJVJ$A)Nk!|go+`M`v_XuW>HhN6u{8}!L}MO%x$)@wEt?I=2` z*QDuF^3mt(6Su%m6~*flw?f5yNn3whEw&|Dpve3{Cg_j-`v#zl{QI`?3y{HyXW7Y= zl6{-+tXT}NKsmfEJ9es;a_pmDv7RQ-?4$`aJ8^`zC}ot}&G{!vjvp^Mnq0g7J;n?1A>|i){G#mpB$4-W0XT!04UHUp4 z9_Ys~{P(J*r5jJ&KE9!JM;@-Y^z$_Od5QXY^G?H?i`nN_#7w+#ASLSj3fcJ;3E#~> zzv6s>?A+S(M<8#FlU-PJZY{r?a(+b=yp4fpLQEX=z~}k&1bCG} zGxVBM@CxT%`i#AB6PiFnOt8*uKC@1rJny?zMcXfC>ywi%<`nJHYqp%(LR!)+L9vw` zUs-m1RoU@0*4ze6D85b8C$B6zP_##{$uHVmwC!TjnZrM5^qO3~CX2BF28vd3bN5fjsoG<@WlET0 zH;k}DTi7;QyCG7yFh-jR*YcoMfwnMAdk_X%2feq$F-yB&26r~YxcjxcRoXS+E3%Zj z>^NP%3U24YjNm?$z|c``zILNpn*~Je*DV9GQ0-BY~>DF}nOo+5@^2nQpl*MYk|iyGy$+LbpCdm!;ha^A*Ix z0S8zHl7nf~KoW51qur)G0#0rtyO8Y+*X^j?@^x9u+QU(wy9D%p3PQlD9fp&YD-0*u zOO02S8?Vp_!uQg4eM<6~t@`8~ee%wWxkU%{DVy{uo6j5?goCc#1bzX>Ovjg{_>zGy zdH9lsFRSq-6JN6MWi7s}!%1o<4w>fF3`^d^Ejf{94*_GShj1PUIX5~ z=#XBMqt~Pt?M0T_!hd?jBRWT4I9^S^a`vp9k`cLzHY@qpglVoUsCX8G4A%cUtM|SIFPgL%E7BEu5Q1Yc;&#=?5jI4TK;$N zgS#02B4GPVjhbvOZ_%>V|2(`sy^sn&Uq1{t?ycS74|jg=Y&v;6cmAENEC1eo_-;13 zU^uyxpMGci*SAwN=3tH5^|~|wSe`-$wudGcqgw?3vZsQr?Tnoapx>#@)+I**pt1qW zM*zloG1~P2v^`)nM<)SvlkpBb$;=Alb?MqI5r}Ce*xV)=A{ZKFhHDQ1`ZKf}(ULQj z(0Q|Vdz3Cym#)i+)a3&eIXF4ub~T`Vzjn_g-7=YWTdZz9+}RNhv~ASx0;`8nGRXk< zg#MHQlkJ2)X+UzOZeau%=Ozf@IlA-^T_W&v9Be%!7EA|bQ|mTp_ksl+g(0?RkNJSH zW&)Y{z+fSIZBH-RESX568(x-gMI7Co zzpZq|iQDiG3;zJ_bqEG9C_gPKj9 z)Wg`;ubaQI{pZ7mwf3s%fGvH)lv8~%!2DC}C~8?(8SG@m!h(0HE&SE}EwXxKXNkth z3#(nsH*iDf0Q{m>b&eGNPx9*p@ZXsqy}q2Z~kFK;kX2 zF_)C!IR-&^pl*WUw@@*X;zI-0B55RXvXh*~GkSD`SL~0T2_E>Pu-M6&J857ml1}G!JZPc z)^ck}uo&4w(gp~SI!LU{PA?Le<;!tX4IZb>Byt$L1nBPvx51~KhO2&fiyjVXLZU(c z-Coi}(xSa2-@H&r0yV9TQ@au=xNXykJHXHIBCjL|i3GSQr>1het7(uAukn_rF(aCO z!c;CT$L=NYlxR#OaWvNHC-AFqq#(F@+S~y~bCB2+HOEHqDFga5d<6gaV*s5v2-Lyn zs2%u0Sq**^+ZUdeQb{iwb*aQ4-_wrRkREXo1q=RH1B-qc9iN+w{-CXzth z9tOd{(*d{`Adyi^Aj@d~A#&l5}dJL9-@A&=F6iUy>LW;{^wTiBtkI>~b2+ zZGe!B0NIsFBu*vLQW{(%9RTBF<1QL>An?%87Z2bBCIYO%gQdR>RKwyJh8I5;UGV@9 zZ%G_r>x@rpH2V6F~< zA8?()x6R@s9VRP-s|RS zS_&F)HAR)Wptd}!mr0vA+ZsryBR<32J}$R>uuV5t^HGseQISf+ww#Clc%6Q=GUjgA zI=Wozh)ue=nvI4p+e~sb3knN~Rx^=DpKwT9weH$z|#X7baQPmZCXeae7U8w zJPOnutyKGf_>8k}sWhvl+Mq!mBh}0$)yxC#1F!H)p*8d#c*Q+v(mG1!UMrSMUEt{f zt-86|bnfia$p?Oz-p9X#tF51pzrR16b@mDLWBSjgfYyv6190#V_x=_x@brMY-CRHP z6Yd^+%B*Vp8qvf9ob_@!>xB)vx&FrwReDrpSV}}edzUpDjXgwPTAIy&dBD@>A^1P!Faoy>j$@SJvJ@3 ztL(q#f1uJgfmybxPc(hE#f;ydU zXXnZ1qIJ41BkSsP<8PN<*j~FnTPFBu5$$^7ok|gE3q!YT9+fa#!#0^{Y?)Rpa@Y?U(y-o3D@T`lhXRKX98gsfBhucy9%~s(x#I zgGxWO)UKO1IMT1Sc5S>kw^nuS+E&zGx{h|eb&@VPP`kd`{*5kCyH08}+7hQ-Pp=j4 z;OBkgUNkPF-CzFw!!u2_>zngO{@qHuF8=jD=R0ZFCt`m;#P1&eH+oo@cK@G*PP;m4 z*QtL`*i=QkKK$FH7m?a^Z^s==A?>=TMOn`>ymM{;uPpPh0e1^k)Sj8U-&86@yM9(a zYfpadI(V_IY6tCl-;=gqHq@@m=T81PLA#!~sLdmOzHq)bpYwIYpTBI+@0Kssd3R&& z`GX&q4=$`-p9C1XDbH?>9EdRA_E-v8ffwgk~EYJO^p`;eq zuG2=$ufTfp;9^W$ZokU-Nv)!^XS#iT%~edh4({K+1k37mmyBeV|Fn4x7uM3AxtF-! z+giI0JJ@J?RqgtXQgjf1Yis-5A}QMa+|T7%I_OyjAgwCiW1%jJ*JuJ?tv+rhGW zW}Z4j-2S5v8+m!&|NQ67P1f_`AGq%{(cZ1zEdNcGZNTJwrAlh| zr^TLdvkmSJ{B>Qdc0Z)@)IXYO*P-VgZsa}(#dR6L<1PAY{A1R`t&66(S#DRlotVYC zcl3HmQ#q}jDOESGXL(LqHh&YhS^7;-W1io#?a!X)?*@z*`k3Vzyzucjmf^%Y<|jOM z8FXQe;#&uOIf$8=#xsY=?l``4eEu^dK3pLtq9 zyFcRPz7fr}>*EWi-QoL9tri1(nD9kwpH_a6PrDA=)-;oKuc7*yOZmIoSf0D9&T_FFj=#8kmE|ev9v^4Fl>BA53n|vHL4WXxESC z-`LE)ZsD_1f3q$8eqnt-mQQ%u?j`u$#4cY};5K*nnNX4Y|Kr{%zp_tQ9~;-Ug4TYA z-&4}r?)Gk5ScTg>y~R+qp7zX}>E{L}Y1c&+r;%;8+L0@*KG5zzYq4r9`?{rj;%2hm z?wm1hG5hD&%f`D{4sTwriEpmGn|R;SjOTr(`Nz{NpQg`d*RHHR6EeV6kL^7>zEeTA zP3Od85v{amM%UFl>uA@;m1T9TZ?m&{6k$2k?{%ne3+!t?vGz&Z!(XSD2U%Fk5uUAx2mpZWcP9M-Yy$ip4kKlFX@rZztxyzTb!WFBw7 zR(anl?5jVL=dRnA`o`SPAGpc;g z-%8#SwTyL1-?BhGes|;CmcMbIclW#0hUNTefk~~|mp(TYsTZhyYvq!EpRf+hw#^&H zKI)60u8%qY$v*09%(}5~)WJLKC-gs$iv2((!OFqWfyRcwR^f z=YHytD9v+p-2clC*7=)XmUD9deWt=KdG2c7dN{kG*3VaGrnfJlT_>I$@@Gx$dhDp5 zJ4o8~@hbB^;e4R%v-0&hmi0Dmna}q(?`V|H?QcFYL1CF6|LNQ(NU}u?ZP)Y5iL3*@ z)F-*z&r4+kNArB0J+paIkoNrey@!SbYuD9MoG%l#Yxl9uM*h~#1;1=zc^(MMn#^`_ zrT^+xtk3&Cu_yDm1~;60jAd@Re5NM*rFOGdcjEqBF-47IJ;@w9cQ^Z={*L>eaIFuf z^-p@oY1hW!yPH{_>vw*w@bjq;4Tsq7Rt~Hd!hM+i^uZkVrQK?M(3}qyFY^8GpSM$oW9K z&&NDvdG4H8XerOp-iOAGEVr{$lA=Sk_9tGle$-C8uHWM5OO9EmA8v2SdNO}_(gKbh zmqMOPZ2RX&eK>%}Qbn#bhjn07!r;Hy?)Db#b%^zRdEbU%+)jLx3hP)07PjoTj{EaZ zxuJis%m?PyD9HUOdFQ)(oGW^+y0)`zrmmj5gva%?aOlOx+E_|2@Lmqku7_C~R$*Bk z-}lDA_I@weynyX-^&(RU&qZvjwXL|%n+H{W#(LH5QJunk|HomMZq(4)ud=pQTh{aA znM+P`JITE#Ik^v8uVj=gr9D4;?YO^K4q?OBc-wM6+oylUZQhIDd6dT$Ft^|`_5)Ym zj6ck}wDg0}NWL!n^Z2Vg_T~xFG0sCGZ?Cz=V-I||rVC%|E0_G9bE?wKiazJ-UaO<8 zvp$Rs>iJgzt#6U*Gjq8QZwf??V?SUzJ!TxsGqv6Er<@CQ*z-Wg{eM#W`_b$t_ud&- zh-1Ope*L@iyR-lP#UG@7>(Y|m)7W=SeAsst>sX}sX%vrfy;9K5ecpHEn*i301HX>! z#=h&H$S%prTAR;nFWA7(Tr$c%YHRoZls4Yyd^^RmzYXj5s~&U5uuVPf`039q=iC2& zHj?$Ww7-v%5ihFA-)Ue8+Q&xw&Z*uH*j+e9(&oMVx&M)qPF`mJlQiq@8}9#hU&o~^=K#apnk+ZpycZ3*{p-UYonSpTjbD+@ z&sa8J?Z&a}b@s;*{7kQfQX}sFurGq|RnYolx|<~P{l0UI(^)?Gl@C8+nY{kxD~a2z z9&kCH{Z+4fYkuVXzjUFN1KBQ;vL=pUd$HV*HuAgKU;N#Bfpr&^&Hq!d@ zAf$kag>pAv!_C=Q_?1|&pks0^X zXdcVNLHnY^wC5Wx$yc0h=lZ_#v)HfN`^`ARa%dM>@LSgN=l>)gV>#^J)+v|m_j%TU z(ma;JHz!mmuC?EH{_Dcr&eQMfC$-k@_gZ>)ERT0x z081?2myQ)_#I{+w)6)>1>(PfRKj4_VwcZD2*8i1#w?%ONFneT!=R9BWl64x#BWEW= zevWGwDo0i4`Lb0XU}ygj^3$c8JimjB)lcN_#s*!hSX%3|W#G6X<+SVii&ssI)2_QT zTyUxPBLuslyS{z_&UrtK~8FYEcG+Bag^E|NlDS79GgbjNSyd5rcCbLz7U z{~R*sJdb6Pqre89Q_Jj~Cf3!Y7oTinUwt&+*_Pag`Hv6%!nXX>Hcn#MrZwBrfNi$s z#;gEtb9Uz@fvoe9jmCNSyYcN84=kmP{q?KmUvT?>Ud-6YWBg+G_lK^dC54&A+S5d9~e`-v1vabk;{(TU~zO*9Y$5~bvs(sv;?WI>( zxyw8*_sad9OKR=hZu-v?wu|DSZ$jBlFARM472nUUdHsj{+Vj(YU-O3L`Ok08t^D2M z%oaYDfaer!CT>RaguT%H&w|aeb zuuh2fOj^x5|MGYf&*&?2j$OFY=L^_hy=uF73)|+Shhy*X{pzis8`%Fey)^L(+veWA zBOh=aSzB_@OP==*uTLIfy~8%J}> z6z6&0I`c|Nwte5c{m1y3nmtyZW;s_XHtL_c+IXX%JPFB@)$)`RY=b**I9{;)Uwt<{ ziDhWN|1_GPS)F+OA%8c;x#4T}8)XXYFUK-m-stcp*1e>B zO{((qS4;Ld#q;~5$d8pdRwnQ6TbuRaO5wI8S|KxUQzUqmZiB5Qyz?M(nWh_anR}oG1~R3nU!)_{=S#9quGy@t^D#h`^@ah>po!J z9y}+g0QD&*X$-Jocgk{_eo`7?3~uSDxRs8**aUcU_;m0?_Py% zvuKL~ne2y?*6z#VdFj?e--@rpyVq>OxkrFh{4)FYr_}-?xc#QjEAL|2{`25Z9n0;i zXJ8b^$L5beoWMG{^ySdM*mgn{OE+Fe=swtHU>mem9`P0HdEZ?F4g9Tp-jl~z=J#~@ zFR+fytZ)C8`sIzNldf5ete?@>pLJtj>U$A5mSxz`v+UbCnw)3mbf3q*<#pPt zg1mOyS-!oA=RLWH-^lt?veTl8JddHZ4ou+wy!>NWA0F4~swXdT3>xw1wv+YTlz+zq z_A{3XEX>Ol7tU+Ci~ZP>66qyb=9}BzZdzLFXYU>fKXBhN2cNFZc3O6Pm*bp+?Oyt2 zV;*Cby|o}7HODwVWNWct?b;@rs&k)@Mm4_4a*OXdH@c+uOlX&9L-|{t^#fY7Exc?y z##cmpCNST^KiQ5#*CnO1&MzO_5FF>b{pF{l-qB5ee)4+Gxf9j z<*I4zKiO0u&&GqdE+5K$Uff_sLG};E%}oP}YtPS3opplSAC>d-Mb?3T3OstwW7Mz8 z$l`f9*lI;UkoKV-c0=#6+@@{Sy61U)SX`zD%Xyf-`E-6>XKBzRMC<3XNuz7< zGy8`B{D^J&Rk`PPi)qi44r=`q&-=5$Ayau=!6EGfSm&#^80TVno@$c(YeVf_)6c%e ze1HA05fba+v^~L&0PUIhgd)ATZ?~1dI&-WXJaO?Yw%^c*+Nmt7_45qHSWi+M=R32X zTpaav74F;eU#<;H)Y`u}YDPBu`A1t8Pvr5sbuZ3vKUa4wwVUU$eE7A0OKR^nf7xXx z%QhsYU;^vO!T44;3u@1Fd3Cl0>&fwD!z?_m>qY9%D5O0zzW4|CYHQaQCKNc$xysAk zGhFSo`zf|-#dwXd(qrzGYw2U$T8|jbFEeb@lZ9#+#C~{#!=nck;Vo&uS%< z((VUO&iPl;u4n({zQ;OT^s|Qx**`S@^-e?fW2FbqPGEV4Y#OktruOc_mRo(v+VwxX zPL$-aWFIV+z`E+T#UJ50y%*kQ1Luv=4Sw9l^66l#e21TzR6VT=`<&IjOS{aL z|L~`McO#yo!JR*E&2qc_X{(()@8O;)pR$cV`fcnj*6n}F+ADD`J->Ug?|F{$&$|9E z>-_p_en0oQ?B(34?4v@umL1FUKI%pIGL9XAB^umhS#5u^Zyo!Sd-KAkmeAyXXJ5=k z9?Qnahaa&VrYzd@Igj0D+rEqAV6SlxsS=6s55YU(FNU$Dy_A@wN9rs zg|%z_zcq}FwCk1g%E_#^Rld7ZjdjE6oHT;xXlByjF)YtYCl7tjeK?i&#WI%Ru=pJ} zcr3^7nN#^&mL@f}vJVOVFmMdZ_C#d5g>7efLi#PXsq$M_jbqzc{By>Lyz8lhTD8;q zeD*?!o@IXYGs|$E-%I_5P2jOSsPWlpw&lPLd(QE_SadZV7_)VKV~Yo4P-{|B{#w7&IUWBQxzrQr0)zHCz)zn*=S{Zi_* zeTeC^YaZ6mSHZ@QS%0QWCB8`1p107qD15s1v zu#b)2Rq-0ff@xExT;_S#Cp@dp@>xE3#}n4oAKQ1B!}e7_?uw1=CGhoJ3x9WW${LCN z%+pP&M)pO|cCIbRI`C)tAD3~TedG3@V4d07Ypss`ZC`s}Fwc7xPm6%U+IX`oon6BA zd-ndYj;xall^d0LezULm8nSLoQ^HTNZlwO}D#`vcHsHHfEYH!~iWX$M4%!qP>qW z_^UC`%cSU%P99g4%3*n9d=_}6FU!{5q)$E8ne!p31zG=Bm$55svqk?{b%T9lc-V<# zw$ts^9(>2o%zX6mdDj0oBLg;aANrmg7Q%BE9=dUC3r!~D?JxGTKff@ee+RyAx;khM z_hEPN;KeMfnw58V=JuW4C;ZIvyk3890LR3I6DB-j9edSaeLlVpzIM7pd+oaofBNuG5cr9?C$q&tVytbQ58}Ymp?ji+qo`0~)#w(4rHZ9jr|504KespeU zZSGq@yRgG-FXxM#zRP2boZ2si=WEKa*OC10Ywvfj*p5!fUmju|yP*6K$?<*V&fAk% zx6>NdzSUa$ZgT$P#aLIP=j@K>nCM&iMLO&J*;#AttPhKy9kQ_Bc#~^%BxvpUz6tq+ zpYPq&^MuE~G`8Gdtb2279n9sq%bz}B2gkv|*B;qeuLj@0o_98>_nG;__tM{z8#fs1l#`Hu`d`$+n7f@xD;)`fS5uQ(116 zvLc`G7`N{2vyk;r-?#sAw!y_Kr#$4j*!<1Px!U|z)K$D%0sn+nJdbng6$@7^TD?k1 z-8+Xu@xR{LdcqfVI)nw?`7-&6kJJ?mJg6%eF!*4;qQT1#<}Vq2=U{=dNr8t72BZx> zRH%w^`JuwqeRmEO2^<@ExM=X~!H0|0U%mWr@z9-j4wnc&8hE5+^rgW^O2t1|ex!8s zS9gw-kqXv6S~e*_K3c9r@QS15Q=;!4tJyv<}*xJXd z7-!4Jt6EmCI9|=Z^X~Bv+(&DFRo!<<{;EdygB4%Z9QNw&SG7hJ3_1}wHb8%(_Qc?o zCxWI#-#bxfdQ#BI;Mr;VlXd4CSDp-6?7Mfe-tw_Qr|Pestv}UZ{pyvc8gAZs?^L7h zM}xi&-FZp>b>qDcR(>6J;MKjan;a}y=XChd0K@5s6Tz!aN1l$pe>&=XQk^r=m(mPp zVy+rjor%5ayMHF`&e%F<;~&g6oK1MLdezycKkmGLw%PNebhJTR|qg?4@S+nL!U;D0ySNge+ z)%~`=@3Qjkfb55Bz8yI1*N5K@8dWId>fo^zO;_cKb=O|iPl2K2Jr9aqJ){_gndnNRLc2pnJk-o)U!mU|!7U%UR^q|n_@?oAFq zUjP1-=qr}{Q{x}4zdx<{>nHa=mI^m`Fg>Y~^}&n|AsZgdOo{#e!K`lW8a$kx*30^E zPH)qOhjaU9e*bV@(&(yd=No4BS-Zfza>3e#8J}KTyU2C8>bk|=3w_ot$-1{--O`~i zudQ1)GJm!8%g2=OyMD!lpoQyKPL903e$~f`)i$i2mD+d1ntA$#8`duJT;H(ngAv7T z>sL-owryCubdqi3#;vC+Z`!i&&xV^nIn}h$mR;9#8*TmU>AptWKL7L2M%xb+Zx;H= zv1&s@KRwxSf9Q@gP5%nr`Au@O#=9=}9ol&JHQWBidv4|a)p+mSNzKAg7#JG1@B5AW z!}kBQ@2{`}FHSXU^7*gVhq|1pA!Sn1dPu5?z`Q@q5JwLwuI{d59UrtAV zYyag;{Nv5PoNfNwkH4IgCY0NGzD|^cb+~a=Ky3 zt}Fe#w|0FyXiSaWR}HfU?7n7RwPg48j2*Xj-*6qNvFE1u;($H3vhFY0b9?A7xAuHD zvOvwfcg9p0xcBaaI!pK7n;dm}@BNS4)cowhtR4eDdpOUq^s`5cythAlylhO(eNR@+ z8o2NKb*q-{d%9`I?R`INJ5qE1k2@|7-2c;_`%Cvf+yBe${Xc(Mpw@xsM=A_D@ZzgF z%MQH!I`rJIU(U8FGyK(su3d-!dS%eZ!(U%_og4n!?U7|h{0{$kwk7@%{!yp;$AVAb z0jm^5^wz!W59xoys|xp65dTIr(iH|p06ed*7(h0qD*=$L>ySn05V`3jg$_|hhfI{R zbsbi4I%H`&tm;JjmGSQ?08vxQXQh2 zt{$il8i0lX8MO{kM2AdAhsZ@czB)u69ioN~*}N_aL<2-$9io#C*^3U5k4`7)ngT>P z9ipqQ1who%A@kKqpfyMYZ2(p;y0)MlKory=(&~`i>5wt#5IJ?oes!He7tj@S1KmL? z=mF9|PtXgbgWjMI=nMLR{$KzY2nK<{Kn8kX07jqy6EFh{umT&%0CwO2PT&G=Fa&sj z7x;i5WP&V^4RSy(7z&1g;a~(92}Xer!DuiBj0NMscrXD>1RsG(U^18jrh;kUV=x`e z05icXFdNJPbHO|?A1nY1!6L92ECEZwGO!%104u>Nuo|oZYr#6O9&7*`!6vX7Yyn%r zHn1Ih0zL&hz)r9W>;`+lUho;%2lj&l;B)W=_!1lhhrnTQ1RMp&z;W;uH~~(AQ{ZcG z8k_-V!8vdqd;>0ki{KKt46cB0!Bub#Tn9J6O>hg`2H$}@;4Zia?t=&5A$SBHgD2p7 z@D%(2egr>(XW(b>9J~N8!7tzy_!Ybczk%PuAK*{$7kC5y2LFJ6fi55Z0r^1zK+d5M zC=7~#qM#Tk4oZNMpcE(#%7C(<94HSefB;YtR05R&mG!HFYTyG<9nkWjCa47hL2VEO z>VRNS7leR%pgw2-8iGb36wp#U3^W1ZAOg_w$S4pEVn8g21MwgMGzHB-bI<~`1g(Gs zT7yK;1|)&DpdDxrI)IKK8FT_Epfl(Kx`J+?J4gjRKpN-?dVzG%8}tEvK|jzR3;+Yc zATSunKo1PS2ozufW?%tUU;`Pz4jh2W>@MI2Lx2Z(fe%orHxp!mY>)$T!B8*^398EgSt!8WiRd;&fNJHSq`3+x7az+Uhf z*a!B51K@M;1^5yi1c$(3a0DC$$G~y$6*vJ-f>YpYa2lKeXTdpe9()5XfQ#S~xD2j< zZ^2b?4O|B|z)f%q+y>u)JK!$32kwIh;30Sf9)l;~d+-$e0Dc5NfoI@n@Ep7VFTpS1 z75Ejr2ET#d!5`pH@E3Rk{s#Yme*p#ld>}t40H`!q2owfIKv6&?km8^OC<*9j2mQH1 z8Bi9K1LZ*l5CAHIN}w{R0;+;)-~&M0%{4$xPzwYC`tzC~PzMA9`m>r4P!H4x4M0QC z2!w*hAPh7C;UEG;f+!FTVn8g21Mz^ihMEHUGnnR}1!xIc0SUAQiJ%Qg0&PJ%&>nOE z9YHea1X4g}&;@h_-9UGc3VMJv&=d3m>7Y001Nwq~pg$M@27*CgFpz;B7=RHdzy!>| z0<6FWGJqX8fD_QRts4vh9^eH&;0Ku?3uJ>FkPB$rd>9xGMu3rE6!;K~24lcjFb<3d z6Tn395tsxfgDGGtmcd6U+j$!5lCb%meem0CuoNr<%fSk;608EN z!5Xj@tOM)82Cxxq0-M1WuoY|r+rcN`Q?LW<1iQd)um|h~pMiZ~KR5tB2Va0M!9j2c z90o_gQE&_#2Va2`;3PN&z6Phk8E_Vy1Lwgv-~zY^E`iJ73iuXW1=qlJa0A=~x4>=i z9k>JTf_vaTcmN)PN8mAd0=@@N!4Kd^@Dq3jeg@CM3-A*B0$zb%!E5jv_#ONK{se!4 zH{fsZ5BL{Q(w`6H2XtJjASeWA|Cs)CuqY@7ih~lMBq#;w&qK?AvY;HGBc>HV0H8m; ztOTeGUjpd088 zQb7-p26}>CARY7ueL!D8$IJSI0bn2)1O@{c=z#$kfdWjx3@pG3Y=Hjc(GDEI30%Mp zh5!%n0w3^$Oppb#K@P|TL%}dG9E<=X!6@({7!AgNv0xk+4<>+#;3F^zOa@cHR4@&E z45ot_U?!LaW`j9kE|>@Ag9TtASOgY>C15F729|>rU?o@uR)aNQEm#NEgAHIK*aS9% zEnq9y2DXDwz^7mb*a>!l-Cz&c3qAw;zj`5nKY7!4>c=xC*X;>)-~s32uSg;5%>!+y(c*eeeK01dqUD z@C2Z|d8#JZQw0WZnEEA2>(v8;%9odokw;W6ffONmc1?~-D@LzT=pE%PMXE#kiB#>)$jEx zcJXo>i^uAv*4lck^vCt+fK#Ebwsx8oyDU0q%#uAu^jw$f$`K!Q`K@01rHj?zvMWV# z)ywKJTb)+97_K|XK8xZ(C+XR?4y#?f)Wh$Uo%Dfr9>qxiPL`btbtVzLHoC|HbgdmZ zbSKT~aQQ6avYW+fw_C|9bjdE!uXNe&Q#{l_ipwfSlTMGw4*D8NAVc)tu2(!h>P-)y z;UaxlfOWzmNYE)q4} z?2Kvldg*8ZwQ80hg*&CHw7Gp#*Kwf85v6=Tl_AN9KNrsq1Am_*@>km8kf9 zVjfamW>tKtexF518{JU6;_+^>19L7!U{nQ~>e5?<9wo{iy{wL0NK_FLO7vjp)O>5Z z)gU_733?^IlO$(a#Yj@E1`7ryq~SMORWWviPK)PLWxLy={^s?mpK6l>8?cIjkctaw zcTj{<(WjDJ&{(?Yq@XeCY!7sdZX{bB4)N{QP3n8GWTLrsWB$wZ~`i3%T~N$XTL|6xrhuQ=a5<%62ha zeBEaef^Ba{r$xglLRm!zk`LEMei|BofGlRa8s5ou1!z#X#L?&k!FR?qI zms&fG9)%8S>N-O$pet%qkhV*_27QCw(mW+XP+~IEWXviJx0@vghAx~{vZAV84};4m z+@{)fVfx7~i_<9t)&o|kY6h&_CEQ&yG+fMTlH!CEguu{Kb$D&<)?8Vy8G0L!Y&Fy9 zQZRMY;bb@gt4Z;QYs@jGR_IuJ=oq!r26mLAenf#PP>*|9tk5FyE6G|_^h8M3D!z<9 zpc8pwQ8mEhR~=K^Oa<5=IlwCk zQ6|AiMdO{6OsnW~n$;=HJlU_xv5U*&5PC!^t4?5Qo*K9ILU+Ws(%C~I5M>C>ami{I z6}@6Gh;MWtJD|_QTGR_tQ{m}5TkV*A`cv^dO;TS`oF1Woh$j}8<_g;@9+(j|)J@SG zKGa_HI@PZi;_WQ^5NWbVfcUD*F5C^=0|yUMFAid9@6o4k;eH?VA24vx;QIAteLF*MW0+E*r^#%w+A`!`c84?C<&G*c#M9JU zHnB|&V;7%4Gs_Uvx^ai(Y)ek(+#sW4=&<1dtRi zYs7*ES)GCwPG2;2Mxn(siZ!b^x>nI8)4ZLQR%>ouHoKSO<2ucvx-AbWTD97k6)RT; zHySu{Rd|m+rr`^%hT1{K2IUs6Uek8c^1vC?h>4#Ns)1Z3ihT}KZOPStmWaNw$B}#|(nX+kf zktxj*ea&YsY~E#K`_-AF(-&>ARNNYwf9H5VYTVs8vDLt^!z(BCY4mBcEz+iO#f$8&HzsvU%_VC#H#<^b zM2U>8CCaUv8oYaB{G`K+npCS)cJlDO&2)>8jz5+iHBxUh9Jd!NzS~-FQB__4!Mbvt z#x&bKZ9uW^yN6ERF?@COve721uK9tL9Y1bXY-YrVQDfxn8C9D%Skq_2;-GaYdjm&J z{!|W68U9swDKL3Vfe|b7ec5kLSi7h;wpqP<<|`3)Xi2#(&H4?gQ?a?N?4*u;N;Ugp zRLx~QO>#|r19MU5$A>G-TGOkUD{kV!soM|F@-I2iq-juqDLrLDr|pp&J!Q%c8h^O{ z-f?TwCzWY6v-^&zag{50YmciHwX$A{{ltop7{~0?E&YykQ-XSQnmla%+^VB;2lR>D zU8rYtslEdm4w?FCRN5GQfyTY_ci4tR{&WcbNvZf_ULxPlkC5geztPU+h1;U6y|c^d zGrJs!4s^eZVn=FDPNywJGx9|36pz`Do8(bD_?@)qqrgu;X)aFWx%5239lZ)qYNz#~ zE=3WMBvH0%ai$w$vEm^YtAARq$x+`&c5j!}0GMh;`l2Sl2CNSd3@Gxo6^jwk8P%tY&ZuEa$rVA@ zryz;;(YF%)KFkJnp|!{1^&!VF3vW+3D*fIKpI6h?M2{;=bPs8q)=|UHD2s7y-S3xrJ)dRcjAPK!{fM~CN)Pw`xbSbM5`Sk79?NLb!tCd_K_)w zQF^r8yPJ!CrBC8jk@B<_lc&ygqALq)PQA>4VTqz2>52^Vp|&7CEFOKNdfIAQJdo`27}eyjGi*=X>SFfiC}JVr#+9wTYJ{;; z!=1UH(8DJ?;cMt;xC$B}*%#zQN~k&;7$(-XPN9-m?JF3R=$oufe>EyJUEn;2J!(ee( zjjA*7pq?UbVsYoz`qaT{P%Sz|$+8NMnk47Y=i2*ya1L;VB)1M&)!1Q>G>W$HdBTXe zd#ZMDcc7wTq29*j604DRRxj2C^h|pQT-Ce|au&%=3Vq$%S5Pl8VghLF?a(CksVkCp;o8;u0o_WnW~`J!q=JYaEQdB!@Zxz)nx`~A!iV>>Cy%P@LMX;$H5WlwX-KNm*USyxL^Q5gg;Y~=5OSzzo&6rS zTC;0y&%_!_4Vb(J%v-4UfRY(_{6=kxD4dE9A^2M0+35p4tPY`gTIM2VPSoLyVs+V- zv#73F@HEtc9?l%NAktn$SVaw`7yv4Rnt{P2;llsFm0TeaeX0}^fuj;y(2*wKZ0Y~I zn$s3@Sj$z-Tg=r7saL;2wT6vC8wX%D7ZJ%zIV|MrRcIOBDqLO61+;75p<{BV6k5P_ zPwkP`vsZe7-rf3i>D#aWfGQ0J1_o3eG&n`p8ziF=GBBY_Ye*>&nvZa;0n$A&p`E6wW>TcGcl%Ja+A z?!I8*qQ%Wk{WE;6mz1BobXi)FfaNPzt_mu=x?=q`E#ZaW!}axBg|*m_ zFMn|Fjhk{dZz(Zw@z!nSw;Ki~fAVQFscFX@BbV%KQK#Lm(tV`ei|aQSR-=0Ip0;~G zbGi48_3y}H2(cy{*HFau}UifkTxf`Z+-Tq{fW9Gcib(YBN z?_=A4RO@@W*7pSpb+~+L@ELdb{iiWwF8uKI_2DPKZ`0|=maV$P{S*_jyShyrBecq2hUvHIrRCs?VZ2a=PeUZ?Z}BO&KWl^ z%<&cR7F(KrvsK|w4|~6zGR>MC+_?GT7YldRa&GS*R`S!QML*k~(EY%-jdjs4+ZBJA z+CB8~*zbxy+EVd$$B~SUg}tqIKlDbN=Vc zw|!XP-01y{A6W{O?VfY7QOo%?e;w1tpETZ=`DpO{$IX9|c2&wLIXq@g=eD8#WBH>` zZY00(cYfmCGnSRIJnE9iW0WjbuMgQ{n8D?EzvfdB&O$MXm0!374~`P3;-SaN;|JL! z7J?B{mSWYr)R(crhd`(;3L_~M&CrE$-cVRghwdb)#`E8~vM zp_b9S@sio)GTRmW5a!Paz)uGH8kU?1lEICf(;kL`Vj0}`Asw=NWy$UJhbcxswSqdQ zqL(bLEU(XRGG)0u8A4Db8iQV}P7M-je+CayZSJ4q7K>G*gsq`4vn!JZk2)SzfZ?(g z$*i~xR-|FxFq@mYBb&8VtVyDoQ0N`%j^Yq2TC-$vvqU@&v9z^FUN;s~LQwRiJ&PiO z*Qz~9jVg!Z;5nII4>LGv-kfe)|7N^1a=M#|S}{tLUb{r80E;j~>$C#`@cPU$ z_FVWU#jCB8osw71!2S$mh~ZFMkQ6POT`YFDoup;5sY__Ll!c54*(9|@lChyxECq-B ze`;ZO^Ag)5WeFirQ~E5i*7izX)Ko1-myZNb`XX!J@JU(L467J5iNa@6SLA*Pn^O=I zKAlT?Up*4=aTD6(`0Bsp$ zt{FtcNIu12aUvV{S@~0@3>ZgFL@YE6d!5)*qaTED-J+@x5r>I#>-GFRDFvo4BK}=J zA{0$ewTFlV$)00yi4N1<3}n(Uf(ThM!05QUKD#JNMCc`Cld_%7m|ieai77Y2@P0E! zp~VqK)-k7@Ms3tnAtOQ&)9-a-8uPyE$fD9lgh|rt4frY?0X2@*DAhS4%#shgK4kNx z7kZN`JHjHl3{F+4#pu0M0Ew_lHgwPLAdf+}ZF(w)MA+W3N187O(!H#R4Dv@V+UOE< zOor+;qFNGRm$EFbFsoBEVZdIQD4aw%B&Y++)d+J$4JE<}2P<}(=m(lVi-&ePy%8?S zYp^OvI*rgWgAk?obXH!SCBiKk)KQVDI837C5-|jB$%&+zKjeXvRSPf?9{gnXlKY{S zY!0;;6XBKoNWCF6m>Kt6F{u`@(SLG6_`}mheXrnUWD< zfm*`z;talBn}h6km7Zklz=;8D>__ChoqC$&Ozrtx_+50JBtS!<>C{`OCKMS?TA@xI z4cucB1)|6Za@44C(9^=TQ~Ojdij2fBeymx9Ohh2Sejgf&!oaDk)V3Q(0;rA@84VX{ zAsJB{GVNAgI0{WPVTa#owC8yoxErc!MVj)WxF$6?Dbm(RGn*dn zhv_}kVFlayxpJfhueh8hkKZbkl7=YfP#G-JD*1BUh>k{@0=l2!7R9Yd8wP@?WFldc z{4=QT7MUSg@E&pvq+Rkk;G(I8s<`cdC{R0#bVyhx!DFLx^j5X8O@?Ni zlGP!b6$s6c5$5;OcRgOUz82}iYxt2`t4{aT6eZFv(F0Vwq3{VWqG`Sdi2(I%h-7fl zvv$&M;Rn>AlL2uDsCQPGN_LT6NpICdLExaXWFcaqf0~GW_?S;|&~700gJ#VJU2^&& z{ckm&rX5uVD)&WZN{SE*HG+6WNkwGV`;Aa2GGwZiz{qTbT&}&k5ys@~FRniip7Nnz)2-;O>%%-Zy*Q$|Hg)<`Sv&{s3uBo%K|jFja!!KU$b znm&CNYOqnU?lzE!-L5|u_Q__VY3|1%624l!uZiJdPwhCj8r&{ zGDsGSuxA>KLygH%2wHZRnljT|BQu0#m3JZtX`=n@ltm$Ec~Hh7EyE3#x5sZrV?gUL<;N{ zRpKb8WU#yZMiU*tpdJW6N&z#S>2$%*nKVY92ML0>VFOq_C5ri3pbAAwBSO&H1VL}f`boi#IQf+mY|;sllwMUhTj zkjV7u3}leFi!cXUvbm5vtDc^W#i8beQMvz5|0jlKcPX1ONowvQ}bC7z-R!Z zc{ZdFFwu4T2w-hj*@U-M+q}|g!I(xIyzdcrfB{|J2bOCEIJSb-QMUJ z$?muNSwLDmijI{`evep9(Iok7kc;e$#(u-nH^NMk4}I)%UiaP zLK>Z-h#xIWI2z$lP?dxWpl~L%M~#%xut+5<2Wzx~q784o8HpT$fdXi>QF8k| zN~X*1R}*xSipk*0j#eb(fb7YsUv9{X_6(v;5~3xRj1Vo|$0`% znWk`)6>UNCrgsSKqtEK$kZ6-3+WLN4PGeB$vo^_Pbh?lud%aGqV6glkQTasf8J$7- z3l5sG)ZOrBWTVkYC%rbhOBzl)6sq<|I}rGcd5JpAP1`GscIKtK^kpk)YqSfql&fi< zm~a|J26^OYx1{)CElB13G!=GrSsFd$zaf|WmJPNeHc6sAZ(WU|2)PKyLYjt6ifFGS z{If_tSZH27ZKXu}B-w~sLzuxrYGhI?5Yc`NA4;rOoi4pX?RiXM(siX8y z^gH*RsH644uBviOIM#dy|2yeA&4p50 zEh8vhb|h1ALi-4|w|t$bsQlFNa0EXJzbx4A>#u zb&LtlPQd~UsRXGJ{ka$vS3Fp=VK8W&c7|xm@w@mFWSq05{kj;36cHQ6pU0+= z*t&~x=B*Y;X77y9^>#GEjL0x!kf#232`Hu^uXjVRTt$UTBz2(~ z=|c~xJy~5G#(4j0M$`?r$VOv)r~)CV_!KpNC*^ji`Erc^-Mo+-hn5${Wb&$mq=}Hr zT8DI1UFuT%*Z{;PWlT1nRXmM(@lVYlea?x=ku0(cTMs<%HZ$*G#^mz6Q}ZwnTA9R# zzmtRu+d#4=wmD-XB(KZw4zs#w4&4|D6=Gr|Iq{*pz8c6nmcig~dHUbU-oK(a!cys^eS4JTpR zXayFlK=eKZfmjsxgi3O?BG&XyI3f>){X5#biZ%alR!CE66iO6pLDH;NMM+Y!>b+yF zG<4z2NFtUzX=7dJMJ@;}pixjW9?Y^YHiN>gTX+KMlz|JVv3AL!C_c<~vv}hMC8L)30>yoge2BG+IiiT{LTGE@uj(4nE%8@PVQbf!i z&Z}bkJ9dbKX!$fP<^@?DUu*btBPyeCF_&7jp*VzD$t0&QnsL_@?%o^thApM*TX z7iMzQq_)&`UaTMWMyzEK`n|5kDBK~#MBYYYLTaJF6RB5iu#3(c5%=kE*6ypI^061k9Y-4(_piU;|Fm_QQuo(QM_~F79B{4 zi$_-J6P17DiL~I$%ZJ70cwB-+3l1v3kk*MFX+_{TS!|o2kU+nbLZeU;r!P(~xw69S zIn)CgYa(lIoI%PUzw8q;PY;VZ(2DYLM%G=*V2q+b8>hg`oRm-c@Nb{|wg6~CjRJ{6 zoax3k|PcVYPI_G3J!IPd`#W0P(PR3zXh>8i;d12}**CuMvasQK#isVyU zw8v#hN-h>wm~E>82Vv-YLKFt=2uobHlmmz8%F@Ff(XZ4|l%)}zJaIYiFF48f>fdg= z#pRNy-d3Gy#>9RLzLy)16g6*$O{kb!(29?cFn4cP@DLM@&%{T*lO<3)Hh3o3HaZdi z&VGY%sOs`8K3dzs@@1o(M4isC(~+C_nEx1<7%i33yz#Mb!yf#+kOdh!4hSjnaU=#| zR=6Xo#ZV*RQ{&&=yQ3c1)KZbl885#L4kBV0alR#9kDUdFT0o$iHr0{E8`!c)-)-=M zI3*u%d|Pc2TA&5tct!GHs|)cEGlHy=v_O=_;;|;A+A#iZivkSY_i{Bh-b_otyiwU; z2ui#~@;jXLC`rg{puhxJ_TN!Thk|jYm}mVT$%2Q5&=RNESxO0-iqJDVYqBq->NBzD<|ovC;5OV>EMA zQK#S#@0Lu^SiFKHQ)mzUYSF7lqvHQ(fk+zX&}<;y!{LqI!OB#mUGXT)&~~U1)h@Hh z&S_Wa>($$NS%w5vV;|-gawz=38&%2(x5RVDXBwYDhG=+Vywsn~hg~SFEC_5UHI>7?z2{L_yTCPbz zO#E-;CFS+7A|}L;X*%gR7b~ediw>zJV5{$Kt%at@L-8Xa4ka=_?QCiZ5cVDEBwGT) zAr+HY3W^cO+7c4}Q*tHwXa%wa8OZ`N8GMS~p%0M9Ruc3`?tEA%Il_Em1`HlL7?)u9 z-yFe0>-YqtR-mOsSY#He&8ju51V!>2u(6~`*{tex0(R8ZjGvzMss*V8^V?z&-9|Cj z<4eHW&u-PrYR*s2+Tat%^AZsL{%0?M27!oAX<7p1sOn}8sg~O$j`AhIIECLL1)?<* zttk@hlviS_9Gw(S0wp{oBnjBNP<-0S1?o_SUL5^PaAH?PtcFY;x^2-WzyI1i-&x%Y8LM6?A?yDsC{W9IRb9FzWJ{#bKfHEbd(Re3PP9W+8ICprihfuMs6G88-NKJA>>nQ``NQ zBj4GOA|cy^Zpu--p-Pf8i}Xm2e#cIz4I?cf=rFddf42%l%7{v^Vw4dN>3cXEL%pWIsTGE9BY-Wl2|l5 zNo4q&JoRk8Y?ItVr>Gi?9#dOn&k&iML1u+OtgaJj#;`X>kxs@b7j|KE+ozt_k#Wq0 z7v`ENlcSZzDlyD#7j0|NOGddA7ONePpdtITS#(QI7v>gGMdTT3Wm+C0SuG-P(4$W6 zQBU5fCQ5iv1yN*g-pYm^r07N))Ur>q>T!Ta4bAZQ;)sgue`jBhya5G1)Ibq>WNZ=s zH^HPCu-ViioJ_}C-p(_A5oxngb$N2mJ9!`VLrt6ITnT?Cs-9ONMMrf@ltlI6lF^Fn zStL0mBtAoYw`bZ%=uN%P^L!w?Ii4cWxebj%=oaV;}KbfKE-#r~B zdWBpNhnw}-9JG23BmgnTR2kDFseHS?L+b5>MDKZffpcmhyGxmDy2x4gXGf|QD;1}`V7WAo}8wXvvOQc8{Vy9h? zRh%!AC($m-A$n~4`DyE%A0xRc3OPv4S9#s_3r;Y zekT$sb^lF|^DGqj)vXd7(H4LGqW5T<&JO&ED@9b{_4M9%cYo;zst{mHUGGCA$lK5t z%B5B;^!~ic6bS%+4S%44n61xzKMc~3HY6~jBB0NDH|3OtT4q6~sPN&`XY*#8aN(N5 z7>M zMTLS6jZem^2xqMfD06D=ie500H^(+UOzqvROZo&hN1-_$1CC;B@E)BH)939NB0u*k2JG_XMMC<9wnJ`^u{Y#U@`}?`!%_c! zz@X=^iv*Bt6?gVq4Mcf12)~? zEme`sV50a`j=?PXt$yKfM7p7toehXx@9mV6JS}GRPaF(%ZtQI#o;soA?ME1Fc}qm{ z7P7ioYsk=c7RW!MoUYbS479RCv==+*G|eOe)aU81Ckzg(5&aaF#D)X)4SyO)=i3Z8 zM3%ShMUIk2W1xvKxZcTL=nXXx8{Gd*0!j63Y5~G9L~I0vx$V?Uh87VG9!jRTOGYiw z7`*RpsR%1kD-H&ndU?O#LXCN;7Gv;Z^VOqQ%OW&BBmUAzJ)vgE#Nn%VjvCl_f5woN zcW{-2i_IymP+>sgs2%O2At3&UzbG-}NT|$fLE1};azic>Cb%#f0X1Rb#LI~N1Wv<+ zQK?C%kq&8U$BO9y6bVmQzY*s4AD>RTO&bdoXpB+V_=%5a6D8+}2ygt)o*rHhxhi&x zs1jq0eP0{j?FZIr?`|8Az-+2lG2%qoJ155|$>8#d5z!4@5ITy3TDeA~i|{N?#cV}# zp`bEAGSK$*(LMd!Q&%KL3;944lk>I==&LfX5sb!ns!ZhNapX_bVU0MM$*0AseLCip zW5f|NE0v{PCXo+N`wj>FNsrN-*FH%Q$1qeQFj^!WBBR-(#+_oj&j<@c`B=*}#M(kj z9E~=SZuoGX4Fz3w%Zr+$<6D&I8Z)qfQ%^n8Z40NCM(ibcMc^mRw5eyMjE=mDl(@?q z4@Ov+SntuW;0FA;Mi98>MygesU3rcZ2a9ryWK?;FE2+@!QA@H$U*4WOqA*;(Sf!JYL|Uli7!l6sbdx9x zk&tkhRNIm>BBH&2h>?^7cBCB|Frr$Lcce&+9b3f4Y_ejjQQZ$A@nLU-%6di=DS4)A z<2D)*37#>Ri|JU(;XFLftRtb+B%!T!6r3{C{~urP7HjEw-uH1+n@gM-(xgO=haAcF zIFhYcA&2XHNbF{Y2OUhwp+r)NZ6)=dnSDOa-ZP}gG>uclX?m5kfG^wvMT?|&MS2?q zXaY1B1zM*Fa?=7m06`1%B0-#76hYit=#AA5RP{rhh=a2m@~yW9lC9=ay|Yfxv%)QJ=Tj!?&Zk6 z|3};GBXExR-m)2LYrHmAwx^e3uBfp+TR-I#0VLMqF!1<+l|w|XZvylk@;um9M;uD@r0_QR<+>jk(0rE*2DiQa*>XTy-Fq=9 z-gd8`f-_h1hHSCw!S>#IS|q}4)z;?r{u9Bj(85T}QRwy4jNWv%L}Q*ic=GsN&iia1 zeYSfgfe(TM+sA7vQ8FIT-ahFLP6P})Y}h^}cQ|2JC0!PUwpDYS1qD)xsQ&}I!rPvO zF4s3SomH`h9;nPdvmpi(Y!9sU1tR-8pS8`YF`cLe2I@4Yb9PK=@TcfO-l0wT$;HF$nY(~PzY3l%sob~v=T>PH`Nlo|ExU*2h{sMy(mDh3{ao8S7ncv11o2vreTM?A zPN#-aG(zRSlVc~HTahuG9`1bfSs+nY*ex4^JGj((M^Fjfw_mXHqf2|ZGSi)a-TA~; z$@@q2fe!j410w9X&oU%U)Z{VjQ~TZp6`N#WyzGP}#| z?g!g(A8U+VPi8J3tFhw%xYuJiyTrE7ZnY$ds(`%9UfiXJu;`oS8H-&W_z9l0!z4%9 zrQSX2!Zo7i(7CMdwZ`7=@#Qm5;?S;j+3v|5+G{7L$9Y<aw2`1L2RUMky?s6`(o#KdEjIVU4c7L=qHfKb( zpX_oN^YYorc4ldpj%1z{h=UY<@AbRWu&QjU9BPlg$Wmpoy_C#*LxAeiZll@7S)$+G z2z29VKPAbF`Y@zDa>Z3U5FNYf1xImw@P7{et-80pJOd}9`TSTO(%suJ9?&fH6pOfG!Ff;_z}{|c zPDN4GuGrhV!$VCSPTcE4_#XRhy!YaD_Nmxo*CFm#cCp7%%T?9mME5HY?$PM~BuBf1 zxZvcTPuP)$?s1kbkJBnyY8{&)dt{To1Cg45oQ%>Vz-U^rcjBJO+JRtK-{Bb~nLb@d za;0%hU-;9#Gx~tX_l{C^NYieeXxn>u=lCeS1f{xaVC~T*S<8gn;@z@f*t=j$;wL>! zlH0q+;vP|O{rO0J>3&M_y~o{=0`0FmXTHbNc3p3vJ6plmIY_b8G$q`QPbR4`Md7k}DmhjV+MuI&$GmzoGkuK=LO`Ie2Q?x2+v9ndB6?9o1s_~gcfV%w?HH2cfb z&`~^g%6ahp(fTQ>GVEl!`(vt!!*;AWDgjn6_St$PoIL*2E~In2qx9)MPYY4#rSKJQ z&gx;D{aFXjXGdPXR{*v@zntn(47Da%55(*f8GrIou7lQIpp@^(+&NbOkI10hQQqHP(W%5pNpm`8e+Tg3 z@N?p+k~wJS2=;kUp|K}JU;XY$b(PzkCwagl2?a;_Kz=AsjJc7j+*_LAOB5!%S*yl-v z*51xtb$V}~&Iu3k(Pd69e~Y`=pHblZ=l?(5hI^e??X&5|0pDeA>_*%^?aA(WYUQ`H zGJwa0WMR{@5Bnbxc9$myr0afR!2ZWtwr1D0%J&y$AO($JN8@S{@xp7bB`Y{`Auw zcDg&XyI-x+1E0TJ-J)$@B)2};SdDxLIwIhprOo z6SbU^ofUi>5Zf-6&&aqk4~>0#aQH-i5QK7@?SQ9XSJ}5q9Op3I0b2l1ri~oV1tJel zE;TOcJ+MQ0uzW|u$&tZ&+oIv%tP^Q~d%5>=KuEh>2*m|*7X5%Ua+zOgs(ZDGaX_c? z@*^>Pm+-S)Qha>rP=gbC5Zt!x0qG(prJmGAJ3)NFLv^HCRwK2q_NZmj2R~Y7lR=tr zLMLQh8bPcIGzUCTx7>P?;OvGR@-!Wth)ba67SzfCWRhvt6yq~8Q4z0=ZEQr_Glk?SahmUv?rt=k=zGYeT zM=Y$p?%3nf??)ZtMhaCR9daOK{h@tL`T;53$A_ecPwZxS+xA7?N_NP;^?K()*UMqe zLxR-4k2$;HOdg-*b5!VvBgh4HF_D_*h*l$qo9p3Pg|J;O1~}r`oVAXGcN|3sN0)L! zHPc$?N8`_GMuXW+@qD!0z246Ye>9%mBOY6=1AK`Tc5zRRW}Ixj&p(Aw$FG?nZ^Pyt z3~5;$dERju^PQjW8;6;XXyDhT;Dc?6UA|Ta*U7#tnur;7dlN_ZpFHs5WL1G4Js@nh zmlG&+&W|BMgmkoxv`%efs9C?Vn++Hp?Og6#8<{xLmM6K7cAwngQzvXTUpzXZ&ENVv zO2Eh2@uDM+jjXm|1Sk9BbgYjKFreM-2ONKA??4jN*!}9s9Ub1`h|t!9-P-k12<*aa zKRDv->f#T@E(to9N}eaFSn9p+8=Ja9$nly;3$2)!piGJ%sT&Z^k}(r;B}rk zwIO-*c|MgBD+4#8Y zj~(-Rl+{ZrocS=#tmB9)}vyv!#eGH zoD!^U?|6MX+W^NrZ$s+4zmp2p+1X(C1-ZvO{JrY(C|e(Gjv;cypLyDmOIhAZHFf+E zyIQ`yrc3M1*zR|a5FX=RpDnIUc8`;t9CI8ifm1;>H$ML4l5#uA`e4oKkxCigX=h(f z`Ykn)L6QyM1b#xvwaiqNEzlWUIvLVs^3?*}GgaQSmlW}2w7%t~l88myC*wPx(t2A` zc|Y$KIpNr2x5FNJS2OH{V75Fwqg>kq@+Um!y*ge{%(nFK#PqOB4f*#nXbGI0WFxJf zA$0J0?G2saYOVP!1o7AhZ>~7Gw`N&!KBMXh&BgAJtrzcC@_O>1>-tIbc|H5ZJMk{t z=22nA3BCO^RkZ_m=jo@M@OG%Nj-^wvUf>sBD;eUPAVQ04KB&*I%tBk9(bpyCcJ;m0ZGv|krWO(Cke_4by&Sj zNDp;W#Z>VLB}m$XblFchqrcptl7i#zMAvE6V#_CE5J8Pxb}6nILwD)S16wJ>nXx#1POIYqrK=k%VP+U%RF z@77m4y}zb!g~q;{uQEU7WeDBN=^TDs$-?RO+7TUxw=DXU=hM1_+gz>k22=fX>vRu) zZZGqbOltM+UC^idOIKI)yqn4A22KyU1Q!eAX)3?soi%xD`6;E;+JinNpE~q*dejax zDxc%(!=D~E*m2=Ul>nSxew(BQ!I5=p*Hbp2>EEB6k}Gmbt+Q|6owR+*(T-I*tUR>E zPfiI(29C9-@^-6OI%N-fdD^&|9C-rclnv<5JSHr4&A8~kuY0`TJXp3zPU#C`Z`soJ zn~Sv3PuY)N50`#(QqS?6etc;YR>SjjA}Jkg<`qHhSkirus+{up*)pG#$BUL0o$^AG zDmiw}xtxE-9`4w&K0h1$q{s8>I5wETqtLvg)r_J&?xD#Xw9f4r+h1#j&ZA)apPrct zws+r1?)~`O*<|(XhlCvz(4S4$vKrx|+bKKy%yTZTdsI8qXKRgjZz5r#9eaM}N#V=; zXmJMv%^B}OSZ(E&`Z>Eq2tK=a`PAaETm5JEDc#!Pi&$^h3pso6pR zS8XpKJmYA7_YwkE<+URu>RV^KPi#N5+UyKh<2g_&s3Zf+ReikdiMPL9PbqS2B+yoa6Ovt2nYdU1z+5>+<{B#7mwL^#P?b zeC^T;y7DM}JHC4MlU|J%9E)%tcE-4!_w4cdNzWUcov-bZX*rM5dpV==-r1AuU!<3K z#(NLgnS0%*lz6!TI3wBQwCRbSkp-@`aGh+gwgJwFS?#2+C3d$5c1CC8iRa40Yi+@v zc^ZE`d5nmvDmwdQwRnypL@#_kq_yEET1PA+dgjm z*NYE8>g5U4dv#9#p%s~jee?vi_i@Xa9^UT~2Qw6Mek}1J$>I~|RCeh>Ak&M7+sjP| zX9-3=%qvOSs|9p{^Y*f-hdeFQ_Kh@+N41arkYmJ8?nTO89%+MZx`^xNDP4w#`@z+R z902)|wMc7h9n@n}57~$2ZGZJ5k-hZV9#V}FpUMW%k0Ls3J*0=nGz&gGKCO2w`b|BK z^N{ydt{2>jWBDTNhs%!rS>AZ-0Xy=6hrCt!$-@GBX_P(W9SF+}>MUO=#KUv*Oa7sl zI+qx;ug4o6dJJprZO^X%fd04o;Nj2Lm+$oR9xEXCbss*ybNu+|(f(O&IX3$|fAsL9 zYJ9b4y|im^jMEekY2<(Q1&bHt6aU05cXO2cRgIpnpK_$dXF+p5TGyMLe%$4(=VLa7 zF7kY}QsX_P=@y<()?Rs$FX}|Y`E>a%nXW}DIG?j!)}G06cK!__j{ThTcA(W0ZF1N3 zMa~!9X?O{LU`BerwG7^hhf1F;{M_fQyI0zYM?8|9XXnrFKXL3Kj@%ymeDeM9ph6kY z`Sue{2x&U2H=&*HEd9-eIHHil-{*8kJotwP*ZZa=*vIQWJJ4K>24d@$v&>W;`w>obXY#? z&%e3$+V$7IbG_%koa{dn@?AjAfBoYdymjnon_t*9yZ+ZV`Lq5{HEufW@=N=l{>yj1 zxB1?!55M@;Tkm~u^LL+m=7YP}zxTa&Hox$N_rCq%2X|h1=XdYEbLZ`MUf%u>Uwr2J zx4-ubfAguk@4WNo^$$L{^Wg{YJoUkQy?4HN_pg5N?GInv_}=x6pMUxb@BRE!cQ)Vo z;KB75uYdT?^$*_Oyz}11J6j+A;QGsNzkU6kTi0KH=A9Scd+Nh4Y&`Sc?{04X_PxLK z{dcZ!eDL;Hx%RtHz4xDAf9DI=Uwr26XMXE?+^cu4zr6X*#@pBL zy!`5&&CTntytsAe<=@$U=EJ*pU;L|Igf9MFlwbeefA-YNKX~eIzVp31$ms9=ji>#) z{*N78TP$ubrnhH{+tbM_&-HH)`lH*!$?d^>rloiPCdzaCI_NWOczZa%JsWFOgUR&v za6Gy_7;)Eh>R~p%n{e-RetR&Sdtor2+@24((!V{Q;SfthJ(TFS^xH^pGlozFupw; za@%5&OA9ESLY#{aW?mYOS+c)iBs5Jj5uDFPw-=B!nq+0ZW@)Aw^+Os%`7GCqfft7T z{_P3;bK`X81@4_7q#?2yW&~smMngD3teJyH)CUgfGjib~&qkP+}ZgfNyG%$kb52eC|Vj}{p+Md)aBs(DPk;)N-?l7(Ry z8p|vbV|>HOz<(c`@3Fbts5N4oG8B=`vy5{v{Q!Lrl-{7$L1GK7X)eu<87ga)%F6?1 z8N;(=G11usYl(?skkB?9Fltgfa|2T-zri$y?KE;U9P@V&4h92x;xd0n!|0h?kQ4+C zheH{dAu{9$Lxaw8m=cx-QK};B^I_x-G18$Q$C4v)HAo}D|1kK$DDu`jG|@RqX)eVK z3v`XiG-IDQt!mK=%FB>Al+Be{F^LnxIS$5^7~O!G$3rc7F^GTYDl@)z?ZrZlya#re zBo?NwppXCW$9&+M3tsGl9m)hVAK;2ef`wuVNRdS%$Z>N+m|Jgm62|$2^0m=%^S;}Vhd77h@Hj*Y${%7%X+wr9 zhXL#3gNhq(gaK@79PvtnD!gCM!72y`Qqag zjR{nbmN1IQum?>U10Ge(XL>^<$TE(?%{s6*L+4@=V~_s*$gT6x<^o;p8CQ~Kgp7YM zamkq_yYy%g>k7^~PU*Hd&oZEb8k|nNO`kLdh}}dCm5eQd62`e{g*c@m*gz=k2kk{M z_(V&U?d2w>aM%4;krj2b1gT3)u+ZiNDF|&2N>MAqIp~s zB4K`<;DS3yCFVsM7W0Dv@lcPOMCo{(G0qGokuUy@CXyvg%4yBCFcdGwOG&B(Z>C`W zgo+p^%F5Kr%a{y`PK(1|bJb*Jf^!D@(R@Dp`eH zlS*;0oXk&Js9spo)E$E0YC1N{cOas67VAFBpLqC&&lc-9aB{Kjyn^X5CahI#d(FyGu3WHS^GM->cX8N@ny zj5A3iX);Drlm_NB1bnr$A(WXyh@ta}NwOFo8A0EY!!EOLQh98d=<- zd<^L)5%AW6EGTmhB^CRYKp08jFTmw%1t}4eLa_ukgoUY<+5!pqh(I@2R3;GuF#cU^ zTU2K07D81ku%Q_aX3<&l4^{^xrh#z?!PB&eD#LJ76KB0|u*{Z}tQx5LP~RwD)mXw0 z!X6Np&2*=MT&+;47^gKX$2j$pe@hssTA;C}b%1Y(1wnQ47U=re_A5+h5lS+q#C;5@Bh}T3d>3Ijy z22)HO6C%t7`psHRE4A@1i|1F^hNf0ILO%e5M^DRGFl`F~6QD`K7K{)>g6@@3X}5|7 zM~0lNB%-TbVP_m20GUaAwV-k307yn9z(M6pWnpR;We&?`n8YF~6=%?mHNY{m=|RG4 zrC;(xoYU%-$m$SApvafXpsCYNP-@WCof+aMM$RAN&Bj>fMMI!)MV(7Ov;K z>Y%bIyufe}#2LgAi-E*5&|R=COHFDA z1MpD^EYN5*D_NRVv$I0)*jU6cJ^t!Zm{!#SqK`Sp?D+RY}H7 zWQB=zZc)Re$zDm^Ke(-D*$D^)CtRQgCoT~gDxqAb=r>Zbs6*yWqY&E?ijq90LQYWk zB_0?e1vTBg8bgo*Ibwe(;d?_2AdHy@Mvzh58z^WEGb>L6iz;jiC2us{gqBu6k^Wg- zNpOWP1nZYlUvi63lt0!{6?X_@7L%QzMiO)D6pM_MKNy|T#Ur34R#U;MHP z!{%hv8#0w)YE{!P{RXxR6AU`CB;G|1tvOKkm4yUrzBaFi=DOssT*7Gpmw+;<930SG zskR}iK~9iX(nstm02xxjOsgfT2x2X&^sHj<)K|h(8l;Iu1dJ+_+rifr} zT2&|?4O210IG}KciH6khYXmZ&YueM&k4T4W1F=;cRV~Lb{k;QmC^bW5=}9%d#7L`t zLt^W@t1o4xA&x4|LTvDv)V0!0{W9i*Fz1C>s3NTqEU|D}Ig2D&zXeh*Azs{Q9@fo{ zG&zR_CNy1B9lUQ`1pw4)9mc`db&?XD2!JWhaV(;m(wNjT{K_rB4Hc};C`wq)2!#C- zsQ$tt334$7Gh<_8;$wLu@Glr)vWO;54NH1!46SNg5=^xc?2twNYA|U)m}*FHmc_sIyO?4n<|Zk8FaE?%5h&b4OFxk-RX%i= znH259Tht1wRY=$3k}lz{WmUMlS_k-0Zj3j|s(hzfP}(&b1IG)bb#_PvsHW9LKxhGO z3p+gu1L14Ts|%P~F4*rRE!?O{rd1u`7yFkk0jV{d1zX9r?XOgAxtVGZWm_SD(Fg&$ zM8U0@p+e!Vs^JsGH8hietb;gIy9QbvPm&Bjnd~(gamDmh8)#XX6Phh5g;FW%Q4_I& z#l*A>GF+REs}j({F+2oQX$2y-X=io?Zb*sML{Nlrm1+|j3Cq|{=ejIn%CDo&3yV;e zHe^&CSIkj@3=vHV`}3ukC(*N#3*YLQVt@7Fk(*YI3Ds^G5>X)hsbpO2aY|F4Neoim zxvUmDk3PuE^(Z(UH=yKx6$WfqcR6VlOt4O+Xf_yhj@0SZff7ZT+a!9?kdPXZ8{!MW zXYwL7#<=Q82L;@P3hh;{KpgAD`E+_1McCCfh7VIKv|jC^nu7+;Ize2A#Nbod`(fq2DmaPR*)o?$L zA6S`7kGhzaX9Py*WT}n{a~ctXj=9CCalWKQRvv|Z${39c04=+8Ml&%em}i;M1vqg=>n@UHP*sPnutWZ$3Jie(Lw;toX#$)(m5`-hz*sg8~TGDFcrkmMN@up zp;7`&Ne3};<;yPK!zp$;X@Y>M!b7ktO9{-Av$_^+?si4fG5~4^r!SeR7LBu0Ts zofiXu?dWt`Iu&Zs~F)4F24>VBCcq+Y_@ z3+T`WiZmS8MyFD6T7Y7la9{zfeUfyIvT^0_<|`OUj10`j#HF>MlJrIY!slz7&_qPP z=I^X5SL=dfO|z_9)~s8 zSpmxe5#0+ZSZ@xJcJPsAkggFKNHjE&ya(NTq^>@ZWwx97ZhfrkSIJb6M1uQB$i` zP49swWdqtIl3GV28?uBJFc2LcMq*SuCK@F?1honb6ehE3Yu(WTl%fyf7_Ic?`=q~I zomRUX^05$Iq`EdqvoIdJ(D4wh5W%Kf=>;elFx)EUAxk8Sb{jwt@=A=LYin&u|c7o1s)5Vk&Z(P zxQCw@YC@`YB_ONsCrri|;`$Y>l7V1Gfy-7~;;|$*&@oI5)Fa2XZ))2^Y3t+x<;qSC zv)Do`XjB#?j!7-O2Q7+Ul@`=irDs4=JW1_KZ%}}T=wE}jS%p9AC~265+f)UNbNOoC zAav7stbEu6?VON;g|58O5F%t2vO$;8%&0jjWK&u(EAFcuL7N(&GIA*~YqG3iW;Mz} zt_T>q!OUcure@-v2UE|B7K}Gt6`iSiS}>UK%Z;^%?r4Nf0IqOm?O{%cy;PP=+C$il zZ_O+1GBlGSn@p##QPqg?9U}X!wWN`djI&NNK=q5vMaFs2A{64X?i!aYnN;fnSO-(< z8gmCr*%paKQ@F;_Mg>POE3744MakTpG}luON(AV_6DunSj$rOK`n@=+UJrN?_kxao zhG-X%DlfHTj$Y6HQug!mh75XMUnP(2mS`jZURB3?h%9I{a+99(8Yl94BTjBts27g*{=Wk@H zQQN4pSx_x43#t#qpueam&>tJ@HYkguwUF=EbeeVfqDe8c0c3_yAHh?Rhk0 znt(e=az$Sp5*HG>T4EzeY1f){*%E6YCO$D&wUKZR8v!|{FsNkEUBT2cO0$BerlA_u zb~(Ls=n$~mHnVUB;8qL55yCgv%*g~y#c@_<7chb1a3HX#JIKQ@Rk;-yRw1-hHKNE2`s%OA44=`*)Opn>u_^@5kVT=9 zn*fm-799*%5elDC1$Yr4_Rl^2f&eW5`jLJIiaI=&LO`R+5;*+MbSc&ln1EYAk(fy2 zR()x%z#|#MqI7Qj$@gM+(8qKTLbynOGgm}emxt_Gk;kN}&ViyDlI)~8!fmn-#%N82=q>pKt+265< zV*;SM(5ZA`U@Bivo&rFaMmBVUL^w|DZhcx(H&|5DEvd9;mh%MdfXO$ADEg+8*BuuM* z4D=d-=-N^M70!*oS=T5hB7)O_DCn>4$W8O6dkk*>Ira0a*46D`RX*_HOT z+|UkJ1+>%-)Wxt-$F=ZYLD88eDS_k$QD9Ro0W-n1R<6SwbwC(eAfsXz&LljmMw`@^pXOo5gjyjN6_zG~#n5C}YnB7^B9O~6y=H-_CM89wwGmUMrZJ7P zbIWIlkh8*W%|mEVCc{eO86qg-{#5DZ$J$4!p+H8VGbI`vg&F2|e@k>r&S0n$S7Tsx zMS*Hr*hEE=q~N9@7Etp7S`C1|2}I5Q0E^rstLctPe|Cu$6{rP&(vNHrS1Fwk1qW*| zN!STOLq!D_;n%FdQ3c2FgA9lrRhX!KwVRx#ieLwSB6|b) zLb+U;s)B++Cblj$W<8iz9c>a&L@~g$mCjj+K0Y3RN>#tsC1z{=)2IN%!qCL6%8c}D zXVRm~c*%EjVh!Z0G6x+ZNo<-yPO7GXR{IPL45H~gaK)H9T?DbFbpq5pC9QR}&y@e6*>up zL|SbHO+`W2Lq5lOuu18PzyPFl{sR&TmSq=ezn^u3sdC1UN#&9;4Q4j|Xor;$CqmQw zXK7&RKm-p4R0K0jqF)3xOLNCC;tlwB6A2lHX&8puFFla4Rslz_m)7)JSd~%jlwCrg z^&NkkkPIW}*DyDVHyhtrI5D+?O9D14F?}U3>F^1~2!9rJ2$mh+lk#1tVTdNzazJeY z14Wbb7=_a^!u9%9T_&|7Q$!=}OlojP%UM(yH)!y+C{RHFr%u6|*seNaxyY4eM`hwk z-7o=VA7D(BN$RBW48?O|1QyK4m{RH`KDch+ffx~(6}|$Bd}I0qHS@xPQ~{;Kq=;D! zlhD)KxnkvRx@XB6Q!*;e5jbK4^qTH?a!s6A$4{-+lt@`VE+RD)GW!RugrYJI7!G?pyBKwk5xC?1>B1Ql+$ zBEQg+fo%|__yj4CRE)nhRdpilndz#f!wfLsJr%l=;6NX0Y_r&XvOL3LFy`Q-ax%u5 zgO{sZ;f=qEVyGdLxP|UruIvQNjnzZ-q|5kkr<)+MGh7KALtyBOiRZGQz>T*2~(g{ zP{&QwYxyn`tJp{CS67VLNX$ID!jbj{2T(H(@Tgxwnt2dy3?;tKq>80ls+tUgjEx;! zK@A>}kXogbc_J%mg5xSGa5RG!CKWT*w^6xJ--0p#pb_Yh)tM7k6`n}gG60AbnE6kg zR!bWKr2|vb(vbP98e*DpI}L~(nYS~4vvmF5;9fa$gvS`64xp;U4Upt_4X&OoRq_yq zYqfkiD+5B}ZF?#YQ;{i_3J}@_#g`Mw3V`G2Xc74p03#hg=s?xu)kahjs+$$8BV_Ai z<DMA6o>MWF>O?b%WpftHwy4D0?ZB#pyNn+A1e;ES>rI5DUw zsV=!6U`#P$W`eC5553$fUhm-U*K7y*RJL1y9R+mml?^R$V%EGmp0WNA1Ki zqzm~hc4bS1Y(3%Fc*pX|w(IGsux8NH)9SG@sf7@t`l0|@@`%nU)mopB@6DKk+r_pO zg3-9?J%dFFyKylDF^=V(sPL7qOkm71s@-RyXDH_0@|YltJ!eLgH~205qmx-2Ca{k@ z&6!8#R7gIgL0)@0o8VZ8R!_ZX^I{<0Fsy0{s*|LU zxT1RP_8ox>oY6X>J&6Tjs8scj8kXV(jDkeIi2opIeV!z;B@&golLj-Z?YWKtO%HA(&_+6a0V{U65oghmh=XUX<8aUVnQBwh8?HW z!4qdQD;#qn6-W2L6W=3PYjQ%77UmjBEkrCY1h-t(c6+7)LXy}Zm|2LEJFPAa;EHA@ z2F695!kdg;Ru?F(+uKMtQu_i+s;vVmXv=&tC@~1NkcU5X9*v}(TI}vueFzoFS;K82 zbV>{cBHtFFv2?IBm03mTfGO4vGIgn%BEXil>Q+E7BQx6rnUpyQM=ldqBMR9QFZnyI z*rTbMi!*Q-&Zbm~Ntq?>YKx-E~ijh0!tTs^S>i|Q|jP9oHz zesghnkA-u!pwaXZO9`PWC&EB6s%(%xfX0XSvPK!HehV)~jIo8AEQOiY#xeRRx|RcJ z@99o(laesyQBd$xbsN8^XU4}vbck!^oYl$cIu!|BXx<4J!GC$q(b(7+5_TK>rTs6XjbdW|Qu*<>>JD_@E; zolQqf1+FsHXhDYKT%*ZoJel;_;9c|=lYZtOO{SyqXgV8>M)T=>vGBDt%s3y;=JUm5 zvY0PGi$$NSPt|hc`2=5LlErjbME40ci}46&TJ%RlNBUC>P8N&VV!D`4xuHL*Yvbu? z)bG#7vjt+!%yoT6nm6u`#}l%M!NfUgMNamNr?UkK#W3tUdfcBWjmc;+8#7U?Z8RGX z=OcJt%tttc6F79zm*WvqA}&zg<{JB8tTO2%)%k2Ol56z?zK;>;WQG!udC@f{c1_5- zCJbCGryWhkDO;&1(`)1Y5XFv1V@v}@ zMnLc|oz0nSJ{!*Gp$^K%b4Z&ku=K@XP`8dj>iHBqoR1gNQ0$wBP&yU`zZA8zJ^D`azA%zL+DG2)QXAml%_m&HB@3 zK6ue^)@SND+6r;q?1qFG!F)l;n2b<`UzLca2xCH3j1^$Ob#0C%f_i8hc}Hx>kj5HD zfi+_e6|?&|EgG4jjOBVY0j!MBH$iGK9ff=JhK(UPJq)#$Wg&K~Xbuh2#dtdDwu%YZ zl(Jl#U>I1k^B zOU#qScsTVYgtO=mN+JxKOAWfG{2wos&520Jw^4fSo{y~n#@{1vg>c;!u zx(AQMG^SX?crgmIb$x{4W3~ivfO9FFF$j)as2>p>Kv84oBd`qP#W9A{C7Y==kT3H) zHHI2_c}wgG046S==86e;3uW76I-iWDm_!_zYZyGzfRGW!vmzSV6YT?l z$3G_+?`#k|(b7;o$hr{GlF=Z_DJBMGSo&ZIILM0n2c0d%%vnKdzduulDhdl+BDJa| zuVIuyY!qBy5l18p*|37!cs&F{8n(5VPN0d%R$$)U1y;<)!a1;suo{5i)NG+lW^}cN zt1wxRKU*%P@vuGJ}i+awkdvi)Oib!!v9}h0tZh<6;)3`oJ%y4rnnpriq3L8E6zE zUyLWU47dTj0X%3G8Y*KD4RBkkC0ri3XriF7fFtYz&WA6#1h*gun8WPmM4|Elya5;? zI^w|m5+5xsVc>E@GB+JA?SF*-gjfWC60#Z$15q==9es8dS^5bhM_B)G(cU0}!z?t1 zDPBH{JRnLmnd^R7UW`FPaa=+bxf#wdP1-pkYhW0DGGeJvsAK{XP(Ey^IY;^Mfrpbl z1)88(P&ZftB$ZlYt{6W`8DSkIFak5#2;qR-rnJwEq+xxmml#E0XsECt@0l)$nOxWO zGypV-ubEYWeG7us60X|hfHL;dCp)4xs%tp?c!psRcUu-jB%XoBcsKng?5@TcCGjPq z1!-M_Ey99{2R4K}!+CHCI0kdbG5VD^23Jrb;Esk!%rd3&C6z&aGmvu;WRMYm8o34u z?4eJiW)c-cnz*r;6D&dLFz(n|mTY%Sh61eRS`s{>4bX#EbV$ooWI2Y%;j9_yl%^13 zqwk03Es;n%qF>Wmlja$1i9z4X{$vS|cS1QtY{fLa)h*18#@ z7yb{q28CK`h(pmJ0=HJ_xE@G(lZs)qSac{Q_E57Bs4%o{R^&$fv=kyKWbV~whCg)QM7<0$pGmtJ?v8e3URxUQv1Fge;7x%mfSksYKHp5Tn9-9avd< zNo)o%pi~?Tcw0&`a==C~NrchzX+x|)fsEiHuv3Yurc zAR}HEKPcb`(3CV}bn}drl5&hO(FdIC8#kICpeUT%z{>T;2)3$l5e{w?(mH0aO##V@ zi`=C_J;SMANqUGm^YqFE5;C~i5Hwq?rL9Oo05;LZ&sWkUf;%xi1@eLv6QP%sCba~` z)qE|~s9=RZUz%_?6P=wokqdpvR==yYa2vErrqy3MFwl-PVFx+m4p5$?35&DpH^zWs zly}2L+{28V3l<-JQmLB9Rl9G;6j?)(Ino+h7)kM%0l){?G4C=E)Ww$GnpSNu))>YA@R>Zjsaj;T^eI1Nfflr z5dU2n1vwIyLe^p4+z4GD53(LXbJ2`~^oZz2vP9B7?92Nq+LB*^D5P<9yJE6+g>S%q zT_g9wL@5u+rxt4|3@qt|`P4X;~6^f&TU7IGB^8Xc$LKXQ!C*X zV(fx+A9(0iC$^IqlRZ#gW?r$GM5Iqrk5hF~fz}n0v;)W_buXRDj^`(%#O(xkUR3D+$b^OT!70fw&Qk86n?6txsYEYu9BvX&{VkXS%s2J?T_ z;$kK{6soC(O#=qWKHjp73Pg2uhm~NnYd~#_(_VrIIZ2KXeyxWIL!vsJsLpUm=P)-C zU9!aGSeq;ux1FB_xl?HC5*K0{NRQ2vKt>oXY5~y{c;LE>xS-Z+dyjqj&zOu$M`X!gXu6^@M6$#Kz?~9RxntO*Eg6f& z!@`^zhfaRA#=Oob(p54#aLg*5OJx!mW8eCOIq1~1jthVc%{2Y2Nzr!AY$Ib%%{w*k z&EA`-7c){-T6EPqDu#>%djP&$XNo=o5`j;!xj7n=vNZ&a1f&K5>_8Co(wrg}Yncz` zgIS*CNyA=l)=DnjH0gFo)PB>(j;hd=uc?JdXOen1mEFiUhfQv{09H00XPAB z9ITgs^7@`FrgnaUJQ|?DfN;%l3OWnojCKYlHfBde% z26dWA5ml4g*_MM$ya>+$wJw_=Pyupc8yZLnA+xxTh1pw9mPwjp<1EO4K1NkAYN5}} z%)S8I))YQ-X925m3uoHdn~~W7j3M;X!mNetOd4bfVqHRsSc$Nt=a@tj1^`Aj#>n9U zFbl_xX|qv0kBpw;n2EaY{BH@&D$H)55uxk~uVQ+dO)22(n5;d*+Iyb-sky0v7-TaD{AnVlPzDY4KfJiZ61SLi zb5rSVs?LNkPAXFSt)$LXQHWfGSQ9P!6nIg{GAdB@ktontY&i*@W~N4}H3I;;Y?3;O zqz2mUYZs}62}*3mMVqZ*7g5M9SxY>MLg{jBCD3jGtAI667exq@mR$gETMIPgI%JVo zPA|D-H(wA1d&7C%S?RB?>)-5kS@n=?yS5l>-DS%YpzSOaIw*L_73`7}KO&~V7wZFh z+BL$LA;wN%z2ZM$h-1(Oz;zRe2?$1}p^X5$sicm}sE-)YJ4Ojr&Gc-Ikm0&fOG;ns zfX;R_?6b6N|r4t|deLDX@ZfZ$Av&3YDdttUz769Mr^(bPI~rY@x@ z2h8cHkw7_LfW#8e^8oBOH)dGVM34A@SXP0I{Tg>;y3Byt!AcR*q$ATMT7WgUobY&A zMwE{RMl%+K)yC7K!N}P}1#0?^FA@+nltTq+UdhDk0tlvW$R^^|CZiw=LJ$bt-z9gk z`5&6$h>#5IvbA0QRJcjAf{8sGQES=GciT5xx}8q+eO8d+`5IkJrKwr|kY{*5$rpJf zxg@DQZLauPD`&|$nIt*TDi+c+H9WPRF6o~|h(|0$nj#2LhnS!ZK$ir-pX7W@i1>Vm7mp20wHm8z`7ybB$ylN}KLLc~Sz*97OH_8{&01GIsr{ zgv9**0W!!Taxl*@N_h#d0A!OS253G(T0#tMHiYS$VGx7LHX>Z`lkC78I()<<*(XGX zEYnX^PA>_)V3cH^@MsHvndf3wi3!r(ObH82&zgi0Eb2soy_?Dqf$3{*L*+3B1 zu2%Y8MnXFVP@)7UWsW$zd0@c=jlL5Sz~maomOxbNlwf2{b64loP{>oBMpHW z0De*L$pOX*oY*PlA3AWEgka(a;EJ;CNg;|B*i5qw99CQN$fps2)f#0$4)XYpsC24n z4`MALl$!|V#I1y^QSyr#ixh^mGH@hwxVlCJOEjY5Ai?pPkrCWXZN!wxBZ>iXZ0N;S z>Q;dr<0ARTHWhFcI+-3W z^8;L&QXbFL_2JL4Q~~bNf^y`sIDM^0VJk@5+CuUf#~tn$kp|f4YT`39H~FDFpmeW$ zP0gun&^1f9`A8MfI|(M+R^xWU39_Mw1B@8JGLF;F!`AU;{I;DRb60LWVbtdzn_%EyR0!*z7J)2}Lv(i?&qBE^VD; zvxjgAu^^Y5Fdl>Gm`e#|j5k%mb)6J9w^>EW$$<;_%Qf*2XQtkQ;$>|Mo?AVbl~yOO zDnPfTFq2W0W<{u#GM-8mE#HlJL{C6K4Q}^lo#X^U7Lk+FXVTgI)IDyi0*@d*#3XdP z8AZ#|oQw)*X__bvi$pl?F1Kp3(9gaR!{IqgCbZCMBKc+fG&mq$S>2I3qAW@u6_H&p zFd0DMS-dsO!dL-!Bb2ljoiyhdhW(4cozH0+009CA;T#99k>8k8P;g=4%UDBgE-omC zF4lmQpc6SG>D@YpP#xH`GK|g}^^`2QJPlp|6GmDgk;cBYKQWky(70FGHZoH)wzUYB zc)Oc;7T?7XqQHRpL$ch}H?|rn0Z1Wm+b|iR#*xfVkZG(9FLN8r&2DW7de<2tmEi4KXp`1wC5!X#i zhc*pnND|55YzoH=ktUUctwvLj#t?!849O8azR(uLIiZ2A4qMP#r$$4qfg3Opfvk%h zl-s0G03bt`TUt~F#69z5k@sp-klP*SB#hF0BmW|QEV9W!Ap;7bd>C&d-Vk&_CX%YI zX{%{d@|#B3IBL-yheBdzRHRrnopl8Mhlu2_Es^#sMGgUN*t)W458R;QC+ycKoD=<$ zR?+0Yya~0ErHwn=z?N3EJy%u=1sH?Wc4LzZP;#M6;@qI~J2X!ALE0-$bz{*S(?BoL z2s~(1Q^FD{A)Sx$>?!Jij&|r`I~(z zdS_TXl5V0S*ka43oPu2wr`ynsC1=0{YR3Z>D30tIblaxL4RLUYUZJ-{n|(rr_isdUx;h4NA#&_**XGMFa!*G619{cQ7m#clzY1U zXW)*k9$zCqbhi>&MGw%vdp9%UB+)ljr7hPDGtu>|Bvuo!tLvVJGlNE7xZO&iKy6w% zL|}+>Y)cscFQOsqt;VvAL@>)~35v~{m-N&lRFnmt@%NfYj-TPDNq}>|bNJKlVICAq zULmM^t+Flb5|MFartm4jk%WMR4eI${-EEVGdc`^tAaK?S2Oi?r3;5E;+7e;0Z$Jcr zC!wruNAJ=!DTtsOA;T8NEJd{lSpv|87g*pIgjR-RSHL*Y&<%|s6O5Exul-|dKmZj8 zd6})*W%t+>!>Qqh{UW@aLSRs_(`)XQ;K}aP5jBbmzyfWNauV$8U;HDqlE70t5YF() z8U{cD*7!9#UL89#^Kf5=OK?#yHz012esG2S2k+>J!mv!O!FMuQq*!K6qkxT1&=|jM zxPm`1A*Mx}kn*?5$|T!K-5hL`dyI|j!w^KO-K|q#>L~;o0x(ebTRD0x6;mhjcrD}X zshXc+0WI&eVqqB3vWuw%2)4$6SFL-A&9()(iy8!8Tk8Q)V~*e_fQfFFp3(Uq0IIpJ zi9}Y(uZc_ut9J41X0lSGG+Q$;Dl*S^ll9mTkb~ATMtk)6m(F7KL6K-C0IT6NTYY8} zm=QKz*UUz(MldQ;u1>$@xX^K<2wD$fRDVE%ZkH^D z{1gqjd4%ZbzPOA(U6OBlM_xi6)dDEli=8=x4N+K1u^S>W00Oymej6lEy5X9b3g)mF zm*tR0nHrdn7y}y|A_b39Vbs>zH6u9(LB+5_s<&(#*LQZ9?T30&yH0aTaCe`{twj!j zYYkeFB`yOXe8v?q6P(vr<0kI%cou0GRRG2Zw}~d*8eB5%2IQ^YYlo!PCRrliKo;P@ z>aYqk>yk78fGm8b#&XePNhsFVhSy@6*hy+i?r^>Cr=SgYvsAZ>tFI@2w+<5sk+to+ zOe9p2c#^&mX)Db)7pIP+mbOPz!_XrtfMvn0%dojZ5y4kP!(rd`i(dLbqys<_K2{O4 z0)*IP-rk+pppQX%Oqxg5Fl?c$;ti#qEjl`7FIIUIi2ndE53f@KXZF^Oi zCCOBde32s6ND#^X3%Md>Mn7JU8&g~3-;g<29!5Z4*6aEvfY*-7V~eQ8T&Q|Jn3Z`o z1)67J>%^b}C>W%hPNGAQq#W~V6AL+QN?VeVdBb5hKVTV&v0c^yA(NVXlbiw@Ayq>m z6k`^grD#Vs3t7Mi`=xC<{FTZEC6Vk_7*5EtJBLX5lE`GrAKdF6lK^eNT!iCND960Z zUYgC6LLAt{TCqOvrdh9r(N6c!G`$_9OVD4P5tCtmifP~%nIQ;wa^qv9c{H2QGQoy$ zm;BRGkf@DRU4b$vVoN0$Hi0(#A8UOwT$T)za=Eq#jZy#r+ym~zK=q0SbfKSNLqJ*Z zK@RNBd-fjOp`B;a5K$-Csyl>@4py_EP+VVy6L^~!dJe;#LyVPFpyQb8ikQQsWNa%Q z9Az2bROLfhR^ONuZhC$5`oDOUKi|3j*Pgz<`P5TA*8TRy`PTN4Z@c;S$%E6A?Th`b zXZi5f>Cx%&z5Ok}_~zrSN886+M_Z2n{^N@_BTjiT8ZteCy=?w$r|Mdj9C~?$(k2u*rLS`$zj{XZx%PEl<6-eg4?N-#p*m zzQ662w;tcy(tJKV*?+YC;MV((AR|M+eZKY3+1`1yw|{!Jza<6l?0$0gND4kYJl|qY zuf6}t`Tmv<9>0J3_|e|2yF2Im_cP-+w$4wtZ+-hh@-JNUy;Fa6&TpNbJa~M*b)k>F z_38Hgy<6YkK6`xcX#c+B-aOy>bpOa@ez3p&=w$2Ii*Ie6Y(3cWdFb!*-`%Z?`&;K; z|JBp;2U{l+@+LAl@vgVdPq!ZJM^fKCJ$i8ZQ6%-|-s4AG`Tm{zkGCG2o`?9Y8=*{^MXeCs#1(ZtCE7kGdB92G^bTjyI2^7rqap6s3;?QdP@_xHArwl5y- zqmh$aA8enW?>{;{|3pgP-THLvaPNX;UF%o3&bCfe_1*K`?Gwgtx!OBNx8C16`bdJD z_sz#gyITm<+uu6n)?434oKgDGy)Bl=;t=-<2I8#W-8y;{145>|x8CLdob~R`?jECE z+8aLDI{DO_z2V*MlTR|?Tc^jT=cm!kcej7EfB)1~zQ6tWWdAhuzW*4(dhMIr=f_(o zpJ*+twl8VldHkd8<9nx%&v%{j*Y3#AzwT?Wkucd?bBm~b06t+T9&4_ zwwT~Ssp-w_qpkDD7YgV7^Zi@j**ZCF5jOdd%kb{4)eX{-OV{Z1t zcen0u<6I@8H%}j3e2mE`j55r3PtUjW@z=H=?QNgODjOZ!=clJ98Ts-4qfhI*SoA*H z+`9FhZCqA9-#^3X{RK}v+LqyPzP}|j-$kWZ$1Tj})|*@B_mG|=zWd46$#I$Lhr4{Y z_0wE@^Yj8bGxS^A=bvuxo_^F^`^~Mrt>di=?|lChIOxpy{Ph0)Q~gxyd<%mMr>f$^ zPw#D)lvEI28#MS0q+1B_9#S}t2fTZFar#lT{H@0)SlK7C^6T4RiOYR};;|`z{pR-R z`ELFCo$ZU$M|-*HeS{6FIN&Xu_x{$Y?(u7<=O1r<;&1Oh{&;Kuk#hoaO|Q7fM`g@+ zk?Xy!{e!I%bg&{8Ce`2BI=xUA?>|0A4#(TC`Fn;mQX(qUcB`(wk03wZ#~K>CxabF% ze%QoDw?5t%S{kOkyMMC#;PhC+e-%++iLUh<`^WdT?tL7@eE;b5BN0_I`p*8Ny~jF> zJbh>D5%hcK54KJ~=*LPNsD7}0bo%&gTO)b%@%bS{-}=VZ#i=&*?T_&OTW_6iT|9D` z&iHTn`}Xna{d2JC{?Zd}o$lO{ueYH7R4{oT6MJ;)-Tg<8F2eM$ZGW^M$N26R!g;j+ z_`*eyI#?T%j@+Ps>#zuYds}-usMZS^~%kk`qIXiH-Dyg^JjnVR`2I;ZeIIiS2v&g%Enip z`GsHn+O^F;{!5!1H+x_C`g6UFYk#8Gd+lbgxA8i6Z}wihvAKEs4N8H}je0k4_Qt(y zUzu!N>)rUp=U?eLh ze!lm5Z_(@ZUg-VGbN?2H~k7aLc;eCOtKH*UPp+r0bc*Ef3`&ob#ty<2a+{m#=j zuDr^iXL>h!*EYHB`WwBcdw0I^+BFv3=v~{`yz$M~d*AwY?^lPtjjQkWUij7Cl`n06 z=jN5kcVD`>dGmSr*nra4UhDnxv%Tv#H-8OEHaDKXapUv--n$#UpW65{FJ155xcP)Aj1($%lM-rKx-72=-emTMbtfAfWJApbWu|J<*?_MKku-D~gu#+56te4nqF z>y6*Mezo`X)!q+#KlR$ihrO$Reze*93%xJ(-n)8Z-FcZ-h1|i-mPBmFCpKb`|{QMy{o-zS9=eh?foXgz5W+|cyr@ho0HA? zOK|(@_F|*=)oXwJXErxCHm+Xz894dc=F?Yi-rW3!otJOUc5iGv)BARBM#FtZ}ZRhp5J`oXanlr`qJjB zy=%|)HlOajaOIti=8Y>@(~XaMuYTO?J$mEDAy$ub{b=)rXE!!Jf#Y{?yz=Uo zU%-|=9b62qZhZ08*Ecq<{oF=xaP@2VHhb5<@u3DYeC7oV@AbuVH(&i+?}b;dZ9I#i zY<&GMZuAx}ZNB!x)qm%Ojm?+-(t9_qU3-erzy9y`zV!1~|1vyoy#8l5ub}&tgP}*&Bl)A8Ies3!^tieJ)fvP$M#YKJ>%*jp5vx(k$ZhQ{DWo zHtRct@13!#6G4w9{4)3RB_G>q7r*3!gZupYl%FSWWd6`Ld1D|cbu`AQr?q;W*Ym>Y zjp4`<6F)2(U$geXdlw@=Fpa||i}sDg&c}XWiO^HS1{pR>y^{NCy?Wxz3&UD(67rnV zSvwgcW){q}2p~L%E`F7#nuSU7Bd?I*9pSwwi_&I8zZ`~^MMMhy5K2d@jgqrjm_f5) zCgoS7FzU;z!C5)Voc3$R(6nqJNr$%}L}#BhfkfMr{2L|Q&nI^8LIupb)*?*tVa$i= z)EVYA!(vey%xo$8yCo(?$1GxIy_jw);@A(9N%UlP$v&4hF)C9J5ojw05>ZUsw0UnX zR#&zeK4$fyjtEND;0+aBhAYhsh!-^0$_wU>9A~+CXk|`sn@1(HH{^d>qG>9wL+wsD zX>4UeY(w!(A|4oykwtJ^jy2?+s!S5b^DkX$GFfcdPb<1(;g_zll!U|r@QHkgdv#1j z1gxYcCee!QqsXiZuadBOS{CYK3Fz88rb}yTraNu_utce88V=F9q}K-|DU}5&u;DlL z{D&+o-cS|=0FB&oleS(toJ9E3OfqKOFe4l;qH=lV&omwgd9ldQ>q@Z2mjzYWZZzI` z0z_%aor%SY(nxOB5Zx|apG6$8$eX=7%@n{fu$b+rWu+*)%omf9$a(Y6IN+qIJ|9*# zIf`2sdZANit>-@_Nqgo(`3$tggd&gz2h%8%Z{)dNspNf)ypj-f#e7O!%|S+`lt?GY zFfBTAeHvv=rjD8A`Ybmqb;$`^C_i_{yfrMoDL{ps$gPulIax4A;^0VX%NG1CI^m1_ zgzfU2SqUEC4tMdtNs)P}MeKdv*2FiBk-)Mk)RHDR$=x-TnpYW_@uDx=7Cu>=p*vdA~cz~7fX<~`Fw1cHF< z*CEtqxeX&+4js65fiMz?PFj#CpBd$*E)0Y*CX}&~l-h8CsJjT6WCCW3y5m|3x$Ggd zWdQOC&PT?G&9$dp7|n;t>Xuo%rACeYqM>Y&)Gx^G)KD2n?q4JfmPfOmlrNHeG{(xj zGfN|4k?AYuu8<5lN$$KeE4>RekTWHTHX^)|SLec=d1uwKXlz7nt#Xp)jP+80W{FCv zbBEGH{1yVD_0Zq+7gfYP!Vq(lVzq$lcl=p|4Adm#Rw!l~Ep<_L##d2dT$7vps%0e@ zP)xNmrvj>o3u?+Q)W!hUTB2i!z()!+`V}}k5$B%u2vE6OXPgST^SkD{ata@kSeu!( zU>NA!p@6ZYGB?h`Ha4luIyY<>=?v4*Rba};{4`a@AwxaVh}yfjr;;nO&sy%VbXDnF zsg;;5r;8*hrK^gK%_^O!_Kl^bfV?bk7DrzOsQC6$<18ZI6*X}od7BNKVjOTQ+pZ~N zXCb^PWZn#+EU-(Kf?)HIHLm12_n^-hMLe%1Xp<6fD*!6)@Rj0PhVB5$G7Q4zWloVM zqwC12Vrj9j926}VyM6 zR3pnMo67jgn#(UP$A?N;D({#E8&O7=kcGNc&dz#Dpt7Z8G++ujagd0JnUv(Ja)XCxv0FFVC_F2ttAAXcDWa%( zOWG^sXG-P|f9pP1B@*-~%=u;Hi0qIceC*c~yQ+D$JPes^ial=fCyUNbSO}$drMe@pusYRx19^AQTX01XW zS**e*gh+5h;;MOODNCKth}VHov&E{`m;?EAl>+z{9O*K@FjR{n9$8(4-tI$(uo+iw zj@%trv!lC6aT!;-KofK**Q?V(<)#(Bmsyw>u?8)m<>zKP_P=?Myz+DdHHP-m`@V2dgpjFugD zuIm!zYD}UvbqR1RxZ+jUvy@_IhclO3$H4HkDrU_Zm%@dktP&sg{_ethj#JRZ%+W(^ z32X5~YYPl3(MrXG=}30VZ8NF?A*-&KV1j@^XKoQ^oJCIji41p!!NXFnivp6VhM>IxCWzE z9V}U_`&o_OSLJDJeAxtaojUm2sXKODs|_o%EKfu=&3eyDk<9J_^Dd=JIWX-UzY@Zj zHN>i{LL00hcjX&@ed`*5r>UEq#E zRV3y9crsIBK@9|vL)Pvx1#M}zR%%CcUGGDBD$W>n`7lqxQ0Ynm3ioGJM@>AlgoL>K zs+3iVo8eg3gD=%q+7OcFbdEEFE&o35woT&$Bse zRNRR?@@UL7AJkI$QwY@TqEce?r!7?XcAB7B*_QcQXD_u%AuWXJ&WqG4(=b@|7K+Il z%ZQcCK&h+#Mc{B&-6t$DoVP?Xeza`2X&5XLWLQElxZ|p;UUD0y0hEfM))9qc&2Orp zi*TSW%1!=LC{*QE@m%523HUP&#bvPbvPQ5@F;(Qo?4sA^SOp3lsyM8wmBz%f#TdDj z?>8r2W}TCA>Lm~=k*YrsRX&vZ`<0SKZp}zSgu?Qce1M)vqUEq5HG*uQTKa2cB1AUt zF34cD&cDP9zg^GW%2QCDE7W#HHAq@L(K?CCEx^d8IH5ZjMF&^;O?7mUyc~bon#{7D zTSvvqyx4WS6t{(Z3CBL zedqcGVlMk+$1`}83aKD3Cbx75MeFSyGx=0427JY@R$G8giM0#XQk_*yMtlyRwYGZX z8g=uV(=7Av=9Kl14HO58rp}SWK!>UlURH}FqnT)($uj&>xzTk#BZ?p&K&L;iHrBkU za_Vjku7u()s>WPP5UqLG3XQ_dPLYN1LDbHA%fZ$^wJuFF*Gq$=kXX{V8gV6w(p`+W zaJ->FoT3^x)e5MjV|4`98_`Cljf9X@6xXE=a=zTHbXao*BpJvHE!Yrb0n7Qzl)T`QqwA)RiTi%gTNwgNtQ(~(mV zv2BvnjuZF9OuDe7K4+JFtb*mGHf06uX+j6G;g+gVS~)XaHjnclFea^;rS)??_->`(b~B);6XgpwFSY?=>|K`UD# z@Uk0i20v6CT^nl6@>qH)2ZlJR8aG`4_I8H2^lCm8&7al&x%#b*dzK1SA%qW^K89Vb zpe|d?sM)gp74gKInR_(>s2Zk=Ekxrwft?lv13T4KUKSx`8H%m>i<6h#L=atsfd#+m z^0GKZWf^?4aw|;TWn1#V^)MTcW4bs@>Kbk;1(hj8l*ysE8vAddr*7$5wt@eZmquJ= zG*0HaONBE%cHffdY1JcL&`M&r+$&W-O*u(+yh(X9vn>kBcUoH^b)JN?0ymd4w)Czs zk-J);MH7aTYCs@FqhD(_DmebkmQ{~@tXc)o6J1{_q~KZ!)gBNdoS=M@RjSt|`9)tM zZD`^i<+a>Hk?o2tD!#eI%4$`Q6SvSF6?ZTZn~6@bzNoGg#QMskJ4QqfvEsTizE!?m z#y)ST5lzN0AWNYv3(~5vmpzg<>^>a^=l77|66T$borrItt` z1wC%aVxvrKFuPR4YR)skG;@GAiM9E2Eh>No$SNZR^EMwA`Ug47^MCW2sB1tEdqR*NRAD zu@JtN(~tS%2x^(svUfPGU zda@ipcd%NXzJ&dG70BIAbzyyiYZX|l9v5p%Pi?DIwNeW-A1e??*2<~Qbf`52Fss@o zhEAMO8fC!MzgjD7xYsW$Vpe;sdK1-HuihaX#R!rdG?lKzPuP&(w!Mm~GIp(GS@xv0 zi|Td|GW<~f-;`fhy4*FsR6Qm~@~5H?cIW(6QNo)VS~ZwkOeu54bNF(x?DIIZo!~6v z>dMkWw{VB`dQ+hkzqwX@K!^dNwQ{@O7t4v-zxOeJE}f_Si!cA3Z~p1u{=(f?p5>Q+ z`ssi4-`@G@Pf^TY;qO;BKL7Xs;KyIw_}q^_;O~nY&;0oR{`$t}{=z zD?k46zy71wHa_=ivIBH8+ZNh z4_|%euC#9d;j?#t_&5HW|LY(B_b=T2=imFgKl_`Hzi{{O{_OAkvxk52`MZDn>{qV- zt$+XXcmKz~b@nTN`1I%R%Fy3_;rYAY`lp}1d_H>W?)MpZ{eOP$?o|f-tD9fA`#b;a zdw=(zoIQK@SGe%(m;TM2pX0)}{`zL-|6_mWb6M|C{TCaV=O3Qe`2XRb{4aNQ`1zCn z=;_@5^?$gL`Tmo?_W8U2@$dcK@BOR4^-u30yQhBtU;fMd_mBNo*Y5tK-~avJ|Kacb zuXm*5_V@qw9oPNoA8ls-ul(Wjq3eI&`Gfzrw(kyT>T3T#>@DD+T1T&_fC~_%D2{@P zN?j<9+Se5!j1~wc!BMpa6$J;P41uDcpw_)DuIh^&qBnKbx7fNGtP=%i-Ts~thFbgm z>le)(=brJ*&-0uUauNVvD(&1p(<$)iBagA=r|Z$UKQz4_fc-A3x=ro6B-aak>;V!O zRvG|e@K~53NDgcN`diJ z0{MAdvvQ(ye?ykjj8E+Xf$XhG4V{SIq~lhBB&Sk~K;$!PG0XL(i7Az*xnB#w`cG$= zkUZqRPQ-s}@jL+K9{jfz(c9M7l+L9?ZArgA%KHIrfvr7$F9MLi&&^*`Kij^r3B+>e z;zt3f?|msY#J`~}^D&~?8Itp~FU?8+*KMq*{>YQ{NRQJlI}x2@$G@cUX9Zi6y)++Z zM{;`o#UtXs*LY`Y_sISf-5>Qd4V(;yVdW`kJfHJd1JKToi{(UC;cZ)ai)IKKXW8`9ejO{ z^gg{a+h4ywOv$cI|8p|{?Z4S{3!+zPb1wkxyBio_IK>A%irz!yXxS4B0 z&-=fAPIfak`T~uA{+tu_lX%6H^e{a1K>*ro-(M z%{wHg?gO6@zr)HN(DTA#CmLTd!h!hk4>cqCJ#J+~`njBYi~3(Y^J)P4=aWlM=stY1 z8TpYz>RpoW{^8c-U!B^q{>ldZN%noq^8%eyi{Lv#@cQ`vE$T;i#fk1KMq1N2LpMAk zeccWbM2ES8?fjGG)`93ZA-h-}4>GN(o#i4Y@(=$QC&qG+(%-{cwxx^!%94 zgq|0hTqQZ!k8>a#v2T8#?94Ov8R`GoMaGTT$eX06?VmEv73P=`ox=`TksMAOups{m z`plmEx*noQqk=I8uE1CHd>^<`0P9t-uG$vEG=!h>uAiPsH!N zsWv1}v!|AH-W6v?{f(|*`G0uw2Kl4^)Ei{imidhTqxQ0YB_FdR`&%*GndqNW^asiB z+1Zz*_o-hw(zrA2&54h3tDg~n=O#ZVeJ21OU_7|!XiMWao%xt>GyNLlpZlrnPgd$ImHjhwj%Imk#ZJOzp<@vM0NVn96k6PIe-H=y1@H`KvM|ep+^P zBzw;uV@do!{{9NtY0l~Uq>t1LOOn_2N>lR7N55NLCBKSWWKRA4`1~c~ z>+d#XUynw!pUrGxO5-XwKO+9eHnO4dT>9K4yh!@mg5=}#-6OI?<&3N3ccCd)2xpG1 zdq#RN>-CW2vpL3|#(klGMfEGUSrdJlTzm4z4u94o{+$575m)o_uTXo{Xd4i$8c7mlH^_#Sm^8||lCM1Ue-fYKDp0K?v`i61i zmq8rgdJZ=sx)gt$4!}HWc0UWEYvWo6lFzp9%*bEt9V|(H|2=0#c9Xa2GWmsL!;>cFxM9DOy~Xc+LH2E5pY?QPXgSIA_B6J`SGQQM zMe<{^a~mHU#@|b?$*v=d97(=T!|ci4e=~hW^lN^wCwiZR-Y5Dro1c^4sRvsTj-Ks* zjqKG+X8b-`=|s45F2$1Kf9bKOBwxL&J;~cV$B~{7i{iL@E{FZ!E#VdM`N7}!$vzx5 zTammf_j7#M;b=*6#T**rq{?uL`0bi)P5#$rza!P3di8%)K1f&+&aL!#KzhBpjpN^x z$?U(cFL1s(~9Bu ze@Xe&LjRW}_rl_*WPj(HaNgYZf0o3zgS`#OIc@uOlCM=+J(5$-hh{{7*zt!X&$AmX zXxs>+{Co9byO|Qj<2F8SPVyf!fpOwHJGP78+X=Ea``xDG=hmt+&WF4GLE|;>bEa|+ zrzgax`&m2kivwO2R4-2VJK4wi6R*f`CysU`dAD+OB0DYk@*ermoZA)@XEy9Gp>p+W zM~YM7-7JW%R`LzPmC2`{(l{MQ3GydhIO9i1caAsB2Xh{lSIGI5?eQwI$0b{?lfCIX zJ5akLiEKX+VH{7LU5xqDPDirO&#nlfBc^F3ji+>UB)=b$a+>g?tNIc7iD-X<>?7@^ z4e_0m&Us~j?K6^lpFx+%UYjm)qH*IpvOI4LenEa&(TDG+^tGaKJ?}Y^{u~@$kzY=H z@s#A#*Msrn(p=7$`u%;8|{}a}5T$=Fd3$mL&vmTM3*`HvX z{LI9H?8DvR4B6MYS=_(>3~sm5#+05vH?bqToEB96HOA&S^BK=^>%t`ql6y#*J>mV$4>?}+ z^SVpp{Iby)M=qI@Jg20y9amixB)3l2&yZZhuW+2-vXb>F6+R_B4UwObT{iB;c(B0H zhUk6P!It#*pp6aLod@6+&J*&^FmAnU&Nw&SublY!F6tu5t@$dR*FJL;B%hKH#@}Y) z%wL87eUj7O(^rW8D_40wv$~%djkoJG%e!e%71_zt4{T}tt0y0lzH$?vk^XOee4d_n zzsCN4rj+yR)?3-{cKrE2vU7_OcgfBVpJuvk26Eo#+J}&`uVF=a=2s-@UV0&%^HUeEUxqj$8GmT^qn)DR~^GeiP!BHEMPuZd;q}L%!{~$R_D{RRxXIgOn-R^c3#nUd=ekDC!FK3)p zSX)zkxRYZ-^`DeoBs_WcHP0gkT;p{S|Fy5E-+8Ys8P0~}Rus=!Pc3XL#vDBiH<^P)<>1mph z@$xfRf5LtrLVQ8HpYh0v=wGmz*DKsIIlgtOILo*g!}G$Zy&Ml+JK9iv4a5NfuU}+d zH<&)2?W)w2InTq_?KGu+x{h0|oUUkR^%f;flmOabq4J?iCn&LfsB;QY%e(t+|QU#~}G7a#S0Np$S_ z@g$w6cYjQJwRvnu^84lm=UtLd{4Lg*@XAlg`P&4U*GV`3_iyr(Vpw-T z{keB#`+e4!=l_?AdED?XYzg1y`&^}bz5b_{$ZqtlOelX^dhHR>t-1A*^t*GzYqHPl zYQ~TFb5$JY)ds@x^p}5;{2KxvXt%A;RS+)ckLLOJ_H7(z5*t0GejGm%92YKFlb!GO zdrEp7evjAT;vPLEzPk^yBmZvN_tyaQx4ux0>kI=|@Os}h;1ky)Pr0yv{c^~b;y~*m z=EQ&O44!WrM%N>LUp3+R&emD1&tv0wedF9$yw0<-*$JY1##GM7cc=2Y*W4?W6z}SL z-zNKRA7D##g+d;LdE=;hY!40gI8u2~AmK)?CXE4vNp1jB}9h~I7Tyl&q${vzp9vgdU@H;BK8 za~Hqkd^sSQ<6bi4(K!CGgFJ8A-;(3!C$Qdyd@i`h^X}QEOy8a#c|EYB-!+PhZNB97 z|I;d7w>meS<@EiYdz??4V|>e=dxz}VA3p!Ud3CxO$E}7d`16cYt?VgI9~;W^4cD6- z-}fGTKz32ql<{-yu}5Ub9d`Uh@{M$5oNc~~^U|oh=7bB2n%h(UFgEQklEabF9FKe# z-XgtTZNuxlS4Q3^I(>b3{=EJy=WmD2&yrteePBv-kaHPNaw8SI?;3 z(AWI=)3OT2qrJx~XuMA$e@5I{>0w6tZ1WMXFaGap1+^PC%7o%who2ayuJ+({o_Rrx zLmq!wkz5u>-6i~y0y!TDz032hzDYd4`)I&DiX+b&)+2c)4CZ`q_Um(m4`J6i-uJ%7 zdF3HBuXiM>>rtM0z~74atUAi^!MpVnilgqv`C`EIGbG2;Jx`I{UfyIudBvT_f0Mqh z9Orq!*aGAF;h|Hc_pZhKxl`#GUN;~9>J`~j%Y`h*8Huk+4j0eqNzW}V^XEerfAIQ4 zn|%)C|MQ5ex7@qI%gLN^)zmr?}bIK3k^DbP!Z<=aH?NZNK5}wTcfbBOq z>@oStgD*KAoc)sRx63V_Cs>*BJoNV|yx#R+jTy;*l?CU2jnCJke7VUnN5Y-2tZozC zy+JRyu6O+z=Yu9Hd$N<+diGbRai_`7z8-592wQ+&_yqnBYIK9P00kHqxK&(VtM9z-|BFP}n~*EDHBZjFAG>VNtLpXPCADJQ@r;x+!7H$Ve#=b_T_5 z9kuueFCl7Ggi@nXsh!|vv~rTv7q%9SjH3a9aRAg8F>Q0Pz@3rxHz$|iN&jDSr<>o&ywW<#}#2oPjgG;SEGAyWv7 z0RiJ4t1&f|QTwp%pB9P+Opk=RP!&ggTZBxk8V#ckzd$0{66|gogBv^|+eS-}f~G0M z6134%l&CIX+gJ{Uh}5BlfQ(@WR*W+X8bXeH8GDa2ohL)N^ai~@e zRs*|dR@+mwrbdgXvA_f^?E1+R#4FM6fIo?xB^0eTMjEXGBv981v<6Yg%vkzwGmQIJ zj!-JXz)R2_2Pk9W(RaVBMjH?xb_g>00&L4@(_|)nVEfKmJ3}G$P6&@wYQ1U=p;}Q= zaC3MJo65$*Mxx+*Lld;H;VM8+XbmH%%UUEeiWWPq;}&3RwSqMYv&IUgP-U1}sfDde z5l(C2N(x5d!r1W%S^$%3bE@&=;9%5A9pP7N3k`ob^qBxiTi1RGx{wZr3bdHuIH-bP z6POT=JN#nPLD7@cxLa==8f2|lhXTZ-Ly$&mKyR=T+(Zh2jb{O%adXii>W3(+#ti^0 zO#*D_8>dBQdP^(}qiSqW3#Fj6+7R$5Zr-b|^;-Ocs%loHU__g0$A+DF)esv1Gtj#M zrqIESMvE2~9E=w6mK&q-uw>qBj>@PVhK2nPn2*g-N6I)2o48Rw=v>t%YeeiiMngj6 z!1PA^0~*ob-p06E$p8C{z)l1iLpz zaDpV3;sDr8S{o(7mayOr!J`m<0oUsw7gA#cu6N=M8uq^pjcV!-JM$u>7(J>56on|J zGm3_Pk)YAiB?EOF8YcSOV8}FJn_C35YJaKLAu8l8+p8m1w7+-2mz7@QFj9?Kq8$%O z2#bL<1om#83f@^g3R(?>lo~)lqW;B&QAj~?Q=-+XIAjOOt^pPl(!UtOD71sR2>^g9 zxENRvN&cT>b1*u6Z8|m@Hs4iJo;6$<3GJ0?*e#vX2dvj0(vK+E*0(zULan@oA>=&O zeqJpDFo%DPWklF}f&sPQ#Goz$5{|rUg8zs8j6#SAiBdq^3j?l@m^X!t5{VRHE8b50Mp53($G=Ec?}iDS2UG`8bfY)rHVOx?1tTNkQAjlEx(>_{ z%Kvjl6^uDiAf#f(T%wK=383G^Y=o*>rX-@=m^Ps3jZ{#4ea~9R92rk|T z3BfpIKb0z6B74wK3jJo(AUfYPiT5}Qbyg?1k3ve{H@zd=<6Ona7uYot$k%u}evZk>xqbs1`-Y;CaQUFI zDJt$mVb=7+X3a$li;v(=YU$dtMJt$1wXqj&4TY=J(%oEmh_>z8*YD6#(3a|*;h})v zFaFro4_kDFU(fXK-b3{4^$FYs1bX!r=CB{SXej#icM$EHb{!yE28%Wp^*FEU7GeEHoR${hM_G(%w0x^p(A_s9cAt_8g}#ltl^jr z4V*v!PrtG4#klbk#OD)*Vp5ARF;0XxRf^W4eqeZ8^N40`gIf3pM0OE<-R(qw=hjit zUqHvfuKspkigsdBjPM^FB6`Qhia7TU4OHsaPgN^U%OaT8n8yEbw30Wwu!F7$m-JA(X8)_zJP{<4AMA`eQnX^d_4``jDml zg@1N;|MANd&KB`siT*xCLBhhTz)tuL09k~H0v|gO(baTwd^^!^OIE`VCXHy=zi3{| zB+)Ca{lu+yF|)&Z+VpPFJ6d%A&*)8(aA__^x=iwq&P~GAwd8GsM4y>mL@Qyx-LFe% zLA>zZA=!vA((In1gQ(ZPOM`xc8`c+!X`Qm&W=!hh7_lQsC7fHu#fceS9To|Z)Np(m)pxl4;w%y%=NO-!ZGFGQwZL+Tixi@PAOF z?I!s1K=|^2cUAtf@1?5zoCR=Lo`_dTc$kleMR-WX!x9O9sKJo72HmiSW=dqQ9-1(9 zbiB5gcaKiJVEsm|^>F_zG}OIq4=>{b#ObR1v_05784oFVScv_U>vRa$RRwve@ZM2X zuyS8j!H#rz7grVR%&IEbwG@Hh)z#IV|GUH46^Zut^!COK?8oH>-Kvt^2Ho}(3yvn1 ze0yU4(QHHVQiE=#L6?ISJ9Y}9uY4JF8{l_^v~XeuR^z}wrW=x%mFzCrYS0ywtfkh) zCv^s0ojq*Nuhg>AdSz7%nd8Iy6-X#~x2jq=W@;{YIwW~M%*H=Py$2y z=dOwPoDx!w_(@%TzPYxUWcUWQ-S*|s8^)bXG7J^`Xsps7&|C$ zi3X~6#OVtn<=y%eNxxK|qE8BwH_Q1^`qc`3w!8_(+opmOcCZ8_2g7K9B;e3f{#M?n zPnHYO4&xGHVn7qZ6%_+U>Fv`2E-JszuROHYkaxIz?)QewogS5kRvT7i8gz%@2-j^5 znLFSiRDp_^ko~oM@r}Ym*AA|^v2hh90Y{ULE;*Wdbm@teN7IjHR2CjSy8LMF(fNk# zxi}{HiYu-XRUTYcd2o5D|%10=Nr8~D!Pu-WAA_F>LfUMfUjKHx%T=u3*lIK zFa>Ta4;+>Z83zm*iEsqW65f@?OAT`irB24PkMZ2ucuKcm8K>9G`BRZber_^%F=x>6^fUR zFZg*S-%Tz}i-FrXcqhcgLkoPDW+cE-g395g+kReoe1R0ND&3}ugFXN0^C3JyHGuMm0zm_-m`ub&mZ7IH)gQf%* z*9$VPZ`gY+MThfogKiUp<)%S+x3UPtio;~!VKE*M&X%vj1ESk<#I)szZp*Xruo4gX zc*w)UH+aa!Lk=PygLyl+^7Qoj_y0<5m{$}mvuiN#Ji7L1z9D(ePs>X-oX9aG&p(k{ zve}?pcXS<*oVboiPF#;2yOwP_pCp~1e?GBnmsGav{G77y$~H>plgqv>TYr9D*~YRh zW!ug#EZbJL7~8fCXw|ySc(-;QZHYW|8&^zJE9Pvzle_rVu7h_nb1J?`lPa=ykY}dhU85r z@=Ep?Qi=>IYma`{65ALux0P%+WUVgQ4juwGmBo8%J*2G!zu*JkI9#ny2QOU}tOv|S zsE*SwfPXntz^a7AgU&izGxosFW2U?*`P&lnXHeWGSKXT6sf^K1-jW&yCg>02R47IO5$3K*?S5 z)=2#lN&Z%)Uky(-MgVPv@@9w@&`TBp_tvm8DKOY3Xp;^kXX%ro0Mv^BU2^pq3VkB* za}Z)grV1bzM$_om$U6Xm_CpuzxJ;0Wi3okfk6Mr_ZhvCRBd^jR(&B4T;+g ziMtJndkk}QhB=9bIdf7_Vk_kRK*2tFn?8L6MlhgwEsUQW1w%r#T1ptd0#F-<)n`Z$ z0rH?4a=1jFGz3`9R6-v+z5NnK-2*lBG0$fIS>qNX31IM z5Pu3FCTszTu7r38RBV7=Gvp!#l&=5RdQUg63qUKl{Tzmxf3wj*_yU>QpV`WBrqs8Z784LQ)e)oT-_ zPMj#A^Yw_1jg&O%u%6Q-Tq{$n)IIBjG|8(MF0#4y==F)etLuzeGbglnMVNpX4%rpj zUZ?JThYt;rMg;aA6eJ~Rlxhw3T0VDK`P_r$bLW@ODa4D!;v1_MmnSYNPuy6ZI1es3 zJN5E0rOqfw=@w0d8~CF5|JN5xUd2R1;yl9~fX{sf-TunWiItn@7<7O>CEpozxdvTE z$qwYK@{q3b(6=6tUnj$b&XBwTIlG>*{c7=+^2E&YIqBtzo5~aClqW7PPh5Ak7?{fh z<}l}|aY)S4OI91^ttlxiSz}0ERkFThuR*t_WMj#GgD%~WQh;kl<#P{sR30wGVGb9z zg**Rt{wNV|FK-mnkdcE1p%M(bjqsmC(?!9iFBsj!Ft zb$@@Z-kbGd4FtLD2=8kq@D=qQ@IGS(hg7_SFR{NG4(}^?Q-KF6zG`A()mEp2Hu%e` za0dF3RDN}p;4FbDLg_>}@z1Z~xq$ABHGeh}c-wa#72?zrUN*uTZZj|i{yUwMYq;)X*+lqIaRjE51>=McGSTfOp5h3qsHQet z9Wk-g;c_XMG*mRJz$?UUSYCkFL_84V1yERjfUs+YC88mvAi}#B^a^x+A_`E>fgcu_ zIhnfE7gkn7nh+-mrqUl%>6jsfZ z$QBcg0W(Y+AyjYU)B6lBA% zdBJ>cY`lk42#{4?{|KmNFlf&71{9$HflZNSj`?%|%H0yDkJT?XU?vN0oP-E*ZbGa+lXkjMmqt2XR{6TgGDwminmHEpvUN#>gSg5 zgSFvGb@i=nbo>NGcsP83tf?+C4GXKjw4y&EQcthGx0w_TKUNv8(9&?WFr1}E0l)V; zoyWG&Mr&hgD6tNMKOlgQ_poD^Q;toVHM!ts-K>#i6JKjf^Cthm9IT6;a&*Z!X@YMz z>mH5m#n)Z*w?L#rX15V=r#lj~6V!`$wB+iRchaO8NDn#`O;9S_L)IrQS)bsu9*xa! zKCxC?4E)(uWMhlKa7Cja{ayRg+-NN23l8 zh{6vwwHi+lVD+YDiz}pR; z_Gs(`zir;BTbC}K;0L|C_`y$!R}(((u}v-E)%L_4oNDKCs+}8D=<#nqXX^HAfo<*R zwH9dPV~dGP(H0Y|1ie)69$r286TMxtMz%)#Fq$g2TRzQY`7}3p4z1p^uZ!ElpX_T% zXWQn+#UU=mA@~^he$S@?ZY5a`wT)|Bf!n7Ax}*hSjUJ8vIgYv<|IGn>L3jkmE7X${ zl-iE5YH13jL-_YhojkjGc9J|MB}B)BOI_ga`nrTGlzx*Yd53pVhEEEM@ayK&S)uII cxpTJ&pRN(%og@4r!Xny=2!P9wz~P<#A2hA5q5uE@ literal 0 HcmV?d00001 diff --git a/dbms/tests/queries/0_stateless/data_parquet/userdata3.parquet.columns b/dbms/tests/queries/0_stateless/data_parquet/userdata3.parquet.columns new file mode 100644 index 00000000000..476bc09d5fe --- /dev/null +++ b/dbms/tests/queries/0_stateless/data_parquet/userdata3.parquet.columns @@ -0,0 +1 @@ +registration_dttm Nullable(Int64), id Nullable(Int32), first_name Nullable(String), last_name Nullable(String), email Nullable(String), gender Nullable(String), ip_address Nullable(String), cc Nullable(String), country Nullable(String), birthdate Nullable(String), salary Nullable(Float64), title Nullable(String), comments Nullable(String) \ No newline at end of file diff --git a/dbms/tests/queries/0_stateless/data_parquet/userdata4.parquet b/dbms/tests/queries/0_stateless/data_parquet/userdata4.parquet new file mode 100644 index 0000000000000000000000000000000000000000..709c1c18148d97b30937c28b3520c9c5c44d1b86 GIT binary patch literal 113060 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 !GgtkK8c>16i!90%}2V`FX9jj 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%0A~&>x8K&#paIm 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 literal 0 HcmV?d00001 diff --git a/dbms/tests/queries/0_stateless/data_parquet/userdata4.parquet.columns b/dbms/tests/queries/0_stateless/data_parquet/userdata4.parquet.columns new file mode 100644 index 00000000000..476bc09d5fe --- /dev/null +++ b/dbms/tests/queries/0_stateless/data_parquet/userdata4.parquet.columns @@ -0,0 +1 @@ +registration_dttm Nullable(Int64), id Nullable(Int32), first_name Nullable(String), last_name Nullable(String), email Nullable(String), gender Nullable(String), ip_address Nullable(String), cc Nullable(String), country Nullable(String), birthdate Nullable(String), salary Nullable(Float64), title Nullable(String), comments Nullable(String) \ No newline at end of file diff --git a/dbms/tests/queries/0_stateless/data_parquet/userdata5.parquet b/dbms/tests/queries/0_stateless/data_parquet/userdata5.parquet new file mode 100644 index 0000000000000000000000000000000000000000..c92fe82063e65c5fbbecb389f68ab58da5033a51 GIT binary patch literal 113424 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 literal 0 HcmV?d00001 diff --git a/dbms/tests/queries/0_stateless/data_parquet/userdata5.parquet.columns b/dbms/tests/queries/0_stateless/data_parquet/userdata5.parquet.columns new file mode 100644 index 00000000000..476bc09d5fe --- /dev/null +++ b/dbms/tests/queries/0_stateless/data_parquet/userdata5.parquet.columns @@ -0,0 +1 @@ +registration_dttm Nullable(Int64), id Nullable(Int32), first_name Nullable(String), last_name Nullable(String), email Nullable(String), gender Nullable(String), ip_address Nullable(String), cc Nullable(String), country Nullable(String), birthdate Nullable(String), salary Nullable(Float64), title Nullable(String), comments Nullable(String) \ No newline at end of file diff --git a/dbms/tests/queries/0_stateless/data_parquet/v0.7.1.all-named-index.parquet b/dbms/tests/queries/0_stateless/data_parquet/v0.7.1.all-named-index.parquet new file mode 100644 index 0000000000000000000000000000000000000000..e9efd9b390ed4ceaa53c20ca1ac182101593a6bb GIT binary patch literal 3948 zcmcInU5FD`6uvi^$xhOkjN9Dlq^33mJ4_)iCc7@Bxa11D?$)>)U0DjX$e7I5l>C`Z z#9eDysM5t3tq;Xo5Yf^nDTS6IMT)egNLh>62SG|vD8AIEwifZJ=iZq~ve{9nYz8u! zIrq$Wzwh4jok?W=H7hd ziyilV&fxXgeWz|^K4Z~KH#1k(pZIh4m0vOhkr;_5Nd)kG#1~T~=Rs9+9#s$=p&<{P zBiJi0riX_S(iS~25{PaVkT0r=d82MLh)0PikFm1g(LTlsQluxK=`M2sHZZt=$@^Kx z1tjIr493CH938}1n$1!imS;YnqzGf-+Js*g?(g!)g~3U`B>X)Ar?22v*Cy!_FxW)a`yL11x|)4joLZgg*AMU71p=U#fab(R;^ylTMD4Ce#hGN04Vs)4+`Ai zbeE{5;4~&DahCM+^&gA>t24WV=%9!Nnc`4H-?x^Y`vl`;n7+)Mu|7<1EMZ)b=@_?x zOf7jb<)bIUE(OLN2so-U?kMyJ_9n>QmhOGZilI5{SbYy8wVtr9uiaAWXdfuC{ySa&@kN8S;k`O9P}rt zyV~EOZq8A6-lP4r7Sx@W9qY_22eYlSEZS1nv3Wq8N$}F6th3E~D3s#{AGI2vmttRV zBp^~Td~igt_tHy$c*r)~OReVSb=f?a2@W5~b6{7<+iHFYDcWPOrqlTFydw`b?>GT@ zcb<3L)dgm|YgrWFz+DGO!RZXCm;kX+qgcn%=^fQ-L4@1!f@zfc;38Ky%f)8d50}$s zeJ;)tR`|@{8d3!Y#AUSG#Msv#u{Lo$8Y4m5WZrz!>fQIT@&IdRRgiJ^h1f9CyRl$m z;H#5lmPp)5ku0KlGGlxiXu0J^oe#9Fs`K6THpv3(MGvx2+)L?dK1fJpE{* zVw6pIu+l7*Aj5**-yU`8;K_VHAvpVM82iPqQ39 z!GAn6q^>DuN>!sVJhXC-j)Cq;lJOSr1n)FGz~w!w2e`cZx!@KnuB*@rKWz<;xZrgx z-}1fd75LZ7{_PQY|O3&UvNSef-GSTi`~ZE?u#!7OU0rG(WUj)mXOVkx{^)SO|sZ7 zy@&@qLDkRVMYL(JkK=FT>R{C*=X=07zm;rQH$Q?eCV+}WmM zzY(W=#VaVoC|itj4{Gmb2<8`#a3;wV5~7T=`iFB399+J0a61LS8i&s=k$Lp>MV`!Y zR<?M@mLTw}xuwSQ?Iw*wY(Y7UYVixV5KD6kZVT3$}jR)8^%7!sv z*(gKEex#3R8JD$dKo&gf3GSLGL;CU(N1K~;Xofzu=u;RA{R3#0M8~d>Lyy)HxX1?v zBq6J0*N*kG(T=yfwc~9-?WnDzo$TpK-vvnkSw$9lrqeb(`Aur5Mjd3icF=V^^+s+r zim1h$8f!0gokXKrV}Sc!$8|`BTGAI5^pf7jgVJ23T+tt2EthJQ%5|zSAv{!_pxfIp z{EZ%_WgW+_S7}Zc`)1qpO%ikh+dkYQmg$(?u+&tyin(dMN49JJtKvj1(`+Sa5-jX@ zy0~6lb-ZG3Dd@XBeC1X@@H}jL>r?bYmF8}`P6#=bOy!w*?8TV8ze$xCiIqg+ww_|k zpV~0luE6P7ZW~WZhNqk)%LxAK3&tC3YkdpI#GU@L0Q>V+ua_J5SFWsA^z!`5{l(_W P-3JfBdmex$`LF*5ATPr- literal 0 HcmV?d00001 diff --git a/dbms/tests/queries/0_stateless/data_parquet/v0.7.1.column-metadata-handling.parquet.columns b/dbms/tests/queries/0_stateless/data_parquet/v0.7.1.column-metadata-handling.parquet.columns new file mode 100644 index 00000000000..55be61fc4f6 --- /dev/null +++ b/dbms/tests/queries/0_stateless/data_parquet/v0.7.1.column-metadata-handling.parquet.columns @@ -0,0 +1 @@ +a Nullable(Int64), b Nullable(Float64), c Nullable(DateTime), index Nullable(String), __index_level_1__ Nullable(DateTime) \ No newline at end of file diff --git a/dbms/tests/queries/0_stateless/data_parquet/v0.7.1.parquet b/dbms/tests/queries/0_stateless/data_parquet/v0.7.1.parquet new file mode 100644 index 0000000000000000000000000000000000000000..44670bcd19afac98f01f49d5d2f9576a9925f63f GIT binary patch literal 4372 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 PQ~S`r@MA3v|Iz;gF;Sai literal 0 HcmV?d00001 diff --git a/dbms/tests/queries/0_stateless/data_parquet/v0.7.1.some-named-index.parquet.columns b/dbms/tests/queries/0_stateless/data_parquet/v0.7.1.some-named-index.parquet.columns new file mode 100644 index 00000000000..f97b8868e4c --- /dev/null +++ b/dbms/tests/queries/0_stateless/data_parquet/v0.7.1.some-named-index.parquet.columns @@ -0,0 +1 @@ +carat Nullable(Float64), depth Nullable(Float64), table Nullable(Float64), price Nullable(Int64), x Nullable(Float64), y Nullable(Float64), z Nullable(Float64), cut Nullable(String), __index_level_1__ Nullable(String), clarity Nullable(String) \ No newline at end of file diff --git a/debian/source/options b/debian/source/options index 7529d7b195d..eb7e1409f50 100644 --- a/debian/source/options +++ b/debian/source/options @@ -1,5 +1,4 @@ tar-ignore -tar-ignore="build/*" tar-ignore="build_*/*" tar-ignore="contrib/poco/openssl/*" tar-ignore="contrib/poco/gradle/*" diff --git a/libs/libglibc-compatibility/CMakeLists.txt b/libs/libglibc-compatibility/CMakeLists.txt index 060f4b7a89b..3477e474c7c 100644 --- a/libs/libglibc-compatibility/CMakeLists.txt +++ b/libs/libglibc-compatibility/CMakeLists.txt @@ -42,6 +42,7 @@ set_target_properties(glibc-compatibility PROPERTIES LINK_LIBRARIES "") install(TARGETS glibc-compatibility EXPORT CapnProtoTargets ARCHIVE DESTINATION "/tmp") install(TARGETS glibc-compatibility EXPORT protobuf-targets ARCHIVE DESTINATION "/tmp") install(TARGETS glibc-compatibility EXPORT double-conversionTargets ARCHIVE DESTINATION "/tmp") +install(TARGETS glibc-compatibility EXPORT SnappyTargets ARCHIVE DESTINATION "/tmp") if(ENABLE_TESTS) add_subdirectory(tests) diff --git a/utils/build/build_debian_unbundled.sh b/utils/build/build_debian_unbundled.sh index 8af0e4b3c06..0d9ae74f169 100755 --- a/utils/build/build_debian_unbundled.sh +++ b/utils/build/build_debian_unbundled.sh @@ -22,5 +22,5 @@ env TEST_RUN=1 \ `# Use all possible contrib libs from system` \ `# psmisc - killall` \ `# gdb - symbol test in pbuilder` \ - EXTRAPACKAGES="psmisc libboost-program-options-dev libboost-system-dev libboost-filesystem-dev libboost-thread-dev zlib1g-dev liblz4-dev libdouble-conversion-dev libsparsehash-dev librdkafka-dev libpoco-dev unixodbc-dev libsparsehash-dev libgoogle-perftools-dev libzstd-dev libre2-dev libunwind-dev googletest libcctz-dev libcapnp-dev libjemalloc-dev libssl-dev libunwind-dev libxml2-dev libgsasl7-dev libbrotli-dev $EXTRAPACKAGES" \ + EXTRAPACKAGES="psmisc libboost-program-options-dev libboost-system-dev libboost-filesystem-dev libboost-thread-dev libboost-regex-dev zlib1g-dev liblz4-dev libdouble-conversion-dev libsparsehash-dev librdkafka-dev libpoco-dev unixodbc-dev libsparsehash-dev libgoogle-perftools-dev libzstd-dev libre2-dev libunwind-dev googletest libcctz-dev libcapnp-dev libjemalloc-dev libssl-dev libunwind-dev libgsasl7-dev libxml2-dev libbrotli-dev $EXTRAPACKAGES" \ pdebuild --configfile $ROOT_DIR/debian/.pbuilderrc $PDEBUILD_OPT