diff --git a/.github/workflows/build_bundle_package.yml b/.github/workflows/build_bundle_package.yml index 8ce6593667706..950f07ce21a83 100644 --- a/.github/workflows/build_bundle_package.yml +++ b/.github/workflows/build_bundle_package.yml @@ -15,6 +15,9 @@ name: Build bundle package +env: + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true + concurrency: group: ${{ github.repository }}-${{ github.head_ref || github.sha }}-${{ github.workflow }} cancel-in-progress: true diff --git a/.github/workflows/clickhouse_be_trigger.yml b/.github/workflows/clickhouse_be_trigger.yml index 11e7543559b10..f19a328adcb34 100644 --- a/.github/workflows/clickhouse_be_trigger.yml +++ b/.github/workflows/clickhouse_be_trigger.yml @@ -22,14 +22,13 @@ on: - '.github/workflows/clickhouse_be_trigger.yml' - 'pom.xml' - 'backends-clickhouse/**' - - 'gluten-celeborn/common' - - 'gluten-celeborn/package' - - 'gluten-celeborn/clickhouse' + - 'gluten-celeborn/common/**' + - 'gluten-celeborn/package/**' + - 'gluten-celeborn/clickhouse/**' - 'gluten-core/**' - 'gluten-ut/**' - 'shims/**' - 'tools/gluten-it/**' - - 'tools/gluten-te/**' - 'cpp-ch/**' jobs: diff --git a/.github/workflows/velox_docker.yml b/.github/workflows/velox_docker.yml index 098b2a2d57eb6..ebdc9578d3ebd 100644 --- a/.github/workflows/velox_docker.yml +++ b/.github/workflows/velox_docker.yml @@ -33,7 +33,6 @@ on: - 'gluten-ut/**' - 'shims/**' - 'tools/gluten-it/**' - - 'tools/gluten-te/**' - 'ep/build-velox/**' - 'cpp/*' - 'cpp/CMake/**' @@ -42,6 +41,7 @@ on: - 'dev/**' env: + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true MVN_CMD: 'mvn -ntp' concurrency: @@ -51,7 +51,7 @@ concurrency: jobs: build-native-lib-centos-7: runs-on: ubuntu-20.04 - container: apache/gluten:gluten-vcpkg-builder_2024_05_29 # centos7 with dependencies installed + container: apache/gluten:gluten-vcpkg-builder_2024_07_11 # centos7 with dependencies installed steps: - uses: actions/checkout@v2 - name: Generate cache key @@ -68,6 +68,7 @@ jobs: - name: Build Gluten Velox third party if: ${{ steps.cache.outputs.cache-hit != 'true' }} run: | + df -a source dev/ci-velox-buildstatic.sh - name: Upload Artifact Native uses: actions/upload-artifact@v2 @@ -192,10 +193,11 @@ jobs: name: velox-arrow-jar-centos-7-${{github.sha}} path: /root/.m2/repository/org/apache/arrow/ - name: Update mirror list - if: matrix.os == 'centos:8' run: | - sed -i -e "s|mirrorlist=|#mirrorlist=|g" /etc/yum.repos.d/CentOS-* || true - sed -i -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-* || true + if [ "${{ matrix.os }}" = "centos:7" ] || [ "${{ matrix.os }}" = "centos:8" ]; then + sed -i -e "s|mirrorlist=|#mirrorlist=|g" /etc/yum.repos.d/CentOS-* || true + sed -i -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-* || true + fi - name: Setup java and maven run: | if [ "${{ matrix.java }}" = "java-17" ]; then @@ -334,8 +336,7 @@ jobs: -d=FLUSH_MODE:DISABLED,spark.gluten.sql.columnar.backend.velox.flushablePartialAggregation=false,spark.gluten.sql.columnar.backend.velox.maxPartialAggregationMemoryRatio=1.0,spark.gluten.sql.columnar.backend.velox.maxExtendedPartialAggregationMemoryRatio=1.0,spark.gluten.sql.columnar.backend.velox.abandonPartialAggregationMinPct=100,spark.gluten.sql.columnar.backend.velox.abandonPartialAggregationMinRows=0 \ -d=FLUSH_MODE:ABANDONED,spark.gluten.sql.columnar.backend.velox.maxPartialAggregationMemoryRatio=1.0,spark.gluten.sql.columnar.backend.velox.maxExtendedPartialAggregationMemoryRatio=1.0,spark.gluten.sql.columnar.backend.velox.abandonPartialAggregationMinPct=0,spark.gluten.sql.columnar.backend.velox.abandonPartialAggregationMinRows=0 \ -d=FLUSH_MODE:FLUSHED,spark.gluten.sql.columnar.backend.velox.maxPartialAggregationMemoryRatio=0.05,spark.gluten.sql.columnar.backend.velox.maxExtendedPartialAggregationMemoryRatio=0.1,spark.gluten.sql.columnar.backend.velox.abandonPartialAggregationMinPct=100,spark.gluten.sql.columnar.backend.velox.abandonPartialAggregationMinRows=0 - - name: (To be fixed) TPC-DS SF30.0 Parquet local spark3.2 Q23A/Q23B low memory, memory isolation on - if: false # Disabled as error https://gist.github.com/zhztheplayer/abd5e83ccdc48730678ae7ebae479fcc + - name: (To be fixed) TPC-DS SF30.0 Parquet local spark3.2 Q23A/Q23B low memory, memory isolation on # Disabled as error https://gist.github.com/zhztheplayer/abd5e83ccdc48730678ae7ebae479fcc run: | cd tools/gluten-it \ && GLUTEN_IT_JVM_ARGS=-Xmx3G sbin/gluten-it.sh parameterized \ @@ -345,8 +346,8 @@ jobs: -d=OFFHEAP_SIZE:2g,spark.memory.offHeap.size=2g \ -d=FLUSH_MODE:DISABLED,spark.gluten.sql.columnar.backend.velox.flushablePartialAggregation=false,spark.gluten.sql.columnar.backend.velox.maxPartialAggregationMemoryRatio=1.0,spark.gluten.sql.columnar.backend.velox.maxExtendedPartialAggregationMemoryRatio=1.0,spark.gluten.sql.columnar.backend.velox.abandonPartialAggregationMinPct=100,spark.gluten.sql.columnar.backend.velox.abandonPartialAggregationMinRows=0 \ -d=FLUSH_MODE:ABANDONED,spark.gluten.sql.columnar.backend.velox.maxPartialAggregationMemoryRatio=1.0,spark.gluten.sql.columnar.backend.velox.maxExtendedPartialAggregationMemoryRatio=1.0,spark.gluten.sql.columnar.backend.velox.abandonPartialAggregationMinPct=0,spark.gluten.sql.columnar.backend.velox.abandonPartialAggregationMinRows=0 \ - -d=FLUSH_MODE:FLUSHED,spark.gluten.sql.columnar.backend.velox.maxPartialAggregationMemoryRatio=0.05,spark.gluten.sql.columnar.backend.velox.maxExtendedPartialAggregationMemoryRatio=0.1,spark.gluten.sql.columnar.backend.velox.abandonPartialAggregationMinPct=100,spark.gluten.sql.columnar.backend.velox.abandonPartialAggregationMinRows=0 - - name: (To be fixed) TPC-DS SF30.0 Parquet local spark3.2 Q97 low memory # The case currently causes crash with "free: invalid size". + -d=FLUSH_MODE:FLUSHED,spark.gluten.sql.columnar.backend.velox.maxPartialAggregationMemoryRatio=0.05,spark.gluten.sql.columnar.backend.velox.maxExtendedPartialAggregationMemoryRatio=0.1,spark.gluten.sql.columnar.backend.velox.abandonPartialAggregationMinPct=100,spark.gluten.sql.columnar.backend.velox.abandonPartialAggregationMinRows=0 || true + - name: TPC-DS SF30.0 Parquet local spark3.2 Q97 low memory run: | cd tools/gluten-it \ && GLUTEN_IT_JVM_ARGS=-Xmx3G sbin/gluten-it.sh parameterized \ @@ -532,7 +533,7 @@ jobs: fail-fast: false matrix: spark: [ "spark-3.2" ] - celeborn: [ "celeborn-0.4.1", "celeborn-0.3.2-incubating" ] + celeborn: [ "celeborn-0.5.0", "celeborn-0.4.1", "celeborn-0.3.2-incubating" ] runs-on: ubuntu-20.04 container: ubuntu:22.04 steps: @@ -563,8 +564,10 @@ jobs: - name: TPC-H SF1.0 && TPC-DS SF1.0 Parquet local spark3.2 with ${{ matrix.celeborn }} run: | EXTRA_PROFILE="" - if [ "${{ matrix.celeborn }}" = "celeborn-0.4.0" ]; then + if [ "${{ matrix.celeborn }}" = "celeborn-0.4.1" ]; then EXTRA_PROFILE="-Pceleborn-0.4" + elif [ "${{ matrix.celeborn }}" = "celeborn-0.5.0" ]; then + EXTRA_PROFILE="-Pceleborn-0.5" fi echo "EXTRA_PROFILE: ${EXTRA_PROFILE}" cd /opt && mkdir -p celeborn && \ @@ -616,6 +619,10 @@ jobs: install_arrow_deps ./dev/builddeps-veloxbe.sh --run_setup_script=OFF --enable_ep_cache=OFF --build_tests=ON \ --build_examples=ON --build_benchmarks=ON --build_protobuf=ON + - name: Gluten CPP Test + run: | + cd ./cpp/build && \ + ctest -V - uses: actions/upload-artifact@v2 with: name: velox-native-lib-centos-8-${{github.sha}} @@ -681,10 +688,6 @@ jobs: working-directory: ${{ github.workspace }} run: | mkdir -p '${{ env.CCACHE_DIR }}' - - name: Gluten CPP Test - run: | - cd $GITHUB_WORKSPACE/cpp/build && \ - ctest -V - name: Prepare spark.test.home for Spark 3.2.2 (other tests) run: | cd $GITHUB_WORKSPACE/ && \ diff --git a/.github/workflows/velox_docker_cache.yml b/.github/workflows/velox_docker_cache.yml index 3c05acf7eca21..6e8b7c1d07a7e 100644 --- a/.github/workflows/velox_docker_cache.yml +++ b/.github/workflows/velox_docker_cache.yml @@ -20,6 +20,9 @@ on: branches: - 'main' +env: + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true + concurrency: group: ${{ github.repository }}-${{ github.workflow }} cancel-in-progress: false @@ -27,7 +30,7 @@ concurrency: jobs: cache-native-lib: runs-on: ubuntu-20.04 - container: apache/gluten:gluten-vcpkg-builder_2024_05_29 # centos7 with dependencies installed + container: apache/gluten:gluten-vcpkg-builder_2024_07_11 # centos7 with dependencies installed steps: - uses: actions/checkout@v2 - name: Generate cache key @@ -126,4 +129,4 @@ jobs: # - uses: actions/cache/save@v3 # with: # path: '${{ env.CCACHE_DIR }}' -# key: ccache-centos-release-default \ No newline at end of file +# key: ccache-centos-release-default diff --git a/.github/workflows/velox_tpch_bench.yml b/.github/workflows/velox_tpch_bench.yml.disabled similarity index 100% rename from .github/workflows/velox_tpch_bench.yml rename to .github/workflows/velox_tpch_bench.yml.disabled diff --git a/.github/workflows/velox_tpch_merge.yml b/.github/workflows/velox_tpch_merge.yml.disabled similarity index 100% rename from .github/workflows/velox_tpch_merge.yml rename to .github/workflows/velox_tpch_merge.yml.disabled diff --git a/.github/workflows/velox_nightly.yml.disabled b/.github/workflows/velox_weekly.yml similarity index 79% rename from .github/workflows/velox_nightly.yml.disabled rename to .github/workflows/velox_weekly.yml index 90073e8a34653..513730c84de91 100644 --- a/.github/workflows/velox_nightly.yml.disabled +++ b/.github/workflows/velox_weekly.yml @@ -13,14 +13,17 @@ # See the License for the specific language governing permissions and # limitations under the License. -name: Velox backend nightly job +name: Velox backend weekly job on: pull_request: paths: - - '.github/workflows/velox_nightly.yml' + - '.github/workflows/velox_weekly.yml' schedule: - - cron: '0 20 * * *' + - cron: '0 20 * * 0' + +env: + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true concurrency: group: ${{ github.repository }}-${{ github.head_ref || github.sha }}-${{ github.workflow }} @@ -37,7 +40,6 @@ jobs: steps: - uses: actions/checkout@v2 - name: Update mirror list - if: matrix.os == 'centos:8' run: | sed -i -e "s|mirrorlist=|#mirrorlist=|g" /etc/yum.repos.d/CentOS-* || true sed -i -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-* || true @@ -45,17 +47,21 @@ jobs: run: | yum update -y yum install -y epel-release sudo dnf - if [ "${{ matrix.os }}" = "centos:8" ]; then + if [ "${{ matrix.os }}" = "centos:7" ]; then + yum install -y centos-release-scl + rm /etc/yum.repos.d/CentOS-SCLo-scl.repo -f + sed -i \ + -e 's/^mirrorlist/#mirrorlist/' \ + -e 's/^#baseurl/baseurl/' \ + -e 's/mirror\.centos\.org/vault.centos.org/' \ + /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo + else dnf install -y --setopt=install_weak_deps=False gcc-toolset-9 source /opt/rh/gcc-toolset-9/enable || exit 1 - else - yum install -y centos-release-scl - yum install -y devtoolset-9 - source /opt/rh/devtoolset-9/enable || exit 1 fi - yum install -y java-1.8.0-openjdk-devel patch wget git && \ + yum install -y java-1.8.0-openjdk-devel patch wget git export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk && \ - export PATH=$JAVA_HOME/bin:$PATH && \ + export PATH=$JAVA_HOME/bin:$PATH wget --no-check-certificate https://downloads.apache.org/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz && \ tar -xvf apache-maven-3.8.8-bin.tar.gz && \ mv apache-maven-3.8.8 /usr/lib/maven && \ @@ -76,7 +82,8 @@ jobs: - name: build run: | # To avoid the prompt for region selection during installing tzdata. - export DEBIAN_FRONTEND="noninteractive" - apt-get update && apt-get install -y sudo openjdk-8-jdk maven wget git + export DEBIAN_FRONTEND=noninteractive + apt-get update && apt-get install -y sudo maven wget git + sudo apt-get install -y openjdk-8-jdk export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 cd $GITHUB_WORKSPACE/ && ./dev/package.sh diff --git a/DISCLAIMER b/DISCLAIMER deleted file mode 100644 index 91bfca4900c65..0000000000000 --- a/DISCLAIMER +++ /dev/null @@ -1,10 +0,0 @@ -Apache Gluten (Incubating) is an effort undergoing incubation at the Apache -Software Foundation (ASF), sponsored by the Apache Incubator PMC. - -Incubation is required of all newly accepted projects until a further review -indicates that the infrastructure, communications, and decision making process -have stabilized in a manner consistent with other successful ASF projects. - -While incubation status is not necessarily a reflection of the completeness -or stability of the code, it does indicate that the project has yet to be -fully endorsed by the ASF. diff --git a/DISCLAIMER-WIP b/DISCLAIMER-WIP new file mode 100644 index 0000000000000..981f18885e7d3 --- /dev/null +++ b/DISCLAIMER-WIP @@ -0,0 +1,18 @@ +Apache Gluten (Incubating) is an effort undergoing incubation at the Apache +Software Foundation (ASF), sponsored by the Apache Incubator PMC. + +Incubation is required of all newly accepted projects until a further review +indicates that the infrastructure, communications, and decision making process +have stabilized in a manner consistent with other successful ASF projects. + +While incubation status is not necessarily a reflection of the completeness +or stability of the code, it does indicate that the project has yet to be +fully endorsed by the ASF. + +Some of the incubating project’s releases may not be fully compliant with ASF policy. +For example, releases may have incomplete or un-reviewed licensing conditions. +What follows is a list of issues the project is currently aware of (this list is likely to be incomplete): + +* Releases may have incomplete licensing conditions. + +If you are planning to incorporate this work into your product/project, please be aware that you will need to conduct a thorough licensing review to determine the overall implications of including this work. For the current status of this project through the Apache Incubator, visit: https://incubator.apache.org/projects/gluten.html diff --git a/LICENSE b/LICENSE index 47eb519bec875..d645695673349 100644 --- a/LICENSE +++ b/LICENSE @@ -200,1758 +200,3 @@ 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. - --------------------------------------------------------------------------------- - -src/plasma/fling.cc and src/plasma/fling.h: Apache 2.0 - -Copyright 2013 Sharvil Nanavati - -Licensed 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. - --------------------------------------------------------------------------------- - -src/plasma/thirdparty/dlmalloc.c: CC0 - -This is a version (aka dlmalloc) of malloc/free/realloc written by -Doug Lea and released to the public domain, as explained at -http://creativecommons.org/publicdomain/zero/1.0/ Send questions, -comments, complaints, performance data, etc to dl@cs.oswego.edu - --------------------------------------------------------------------------------- - -src/plasma/common.cc (some portions) - -Copyright (c) Austin Appleby (aappleby (AT) gmail) - -Some portions of this file are derived from code in the MurmurHash project - -All code is released to the public domain. For business purposes, Murmurhash is -under the MIT license. - -https://sites.google.com/site/murmurhash/ - --------------------------------------------------------------------------------- - -src/arrow/util (some portions): Apache 2.0, and 3-clause BSD - -Some portions of this module are derived from code in the Chromium project, -copyright (c) Google inc and (c) The Chromium Authors and licensed under the -Apache 2.0 License or the under the 3-clause BSD license: - - Copyright (c) 2013 The Chromium Authors. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - * Neither the name of Google Inc. nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - --------------------------------------------------------------------------------- - -This project includes code from Daniel Lemire's FrameOfReference project. - -https://github.com/lemire/FrameOfReference/blob/6ccaf9e97160f9a3b299e23a8ef739e711ef0c71/src/bpacking.cpp - -Copyright: 2013 Daniel Lemire -Home page: http://lemire.me/en/ -Project page: https://github.com/lemire/FrameOfReference -License: Apache License Version 2.0 http://www.apache.org/licenses/LICENSE-2.0 - --------------------------------------------------------------------------------- - -This project includes code from the TensorFlow project - -Copyright 2015 The TensorFlow Authors. All Rights Reserved. - -Licensed 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. - --------------------------------------------------------------------------------- - -This project includes code from the NumPy project. - -https://github.com/numpy/numpy/blob/e1f191c46f2eebd6cb892a4bfe14d9dd43a06c4e/numpy/core/src/multiarray/multiarraymodule.c#L2910 - -https://github.com/numpy/numpy/blob/68fd82271b9ea5a9e50d4e761061dfcca851382a/numpy/core/src/multiarray/datetime.c - -Copyright (c) 2005-2017, NumPy Developers. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - - * Neither the name of the NumPy Developers nor the names of any - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - --------------------------------------------------------------------------------- - -This project includes code from the Boost project - -Boost Software License - Version 1.0 - August 17th, 2003 - -Permission is hereby granted, free of charge, to any person or organization -obtaining a copy of the software and accompanying documentation covered by -this license (the "Software") to use, reproduce, display, distribute, -execute, and transmit the Software, and to prepare derivative works of the -Software, and to permit third-parties to whom the Software is furnished to -do so, all subject to the following: - -The copyright notices in the Software and this entire statement, including -the above license grant, this restriction and the following disclaimer, -must be included in all copies of the Software, in whole or in part, and -all derivative works of the Software, unless such copies or derivative -works are solely in the form of machine-executable object code generated by -a source language processor. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - --------------------------------------------------------------------------------- - -This project includes code from the FlatBuffers project - -Copyright 2014 Google Inc. - -Licensed 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. - --------------------------------------------------------------------------------- - -This project includes code from the tslib project - -Copyright 2015 Microsoft Corporation. All rights reserved. - -Licensed 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. - --------------------------------------------------------------------------------- - -This project includes code from the jemalloc project - -https://github.com/jemalloc/jemalloc - -Copyright (C) 2002-2017 Jason Evans . -All rights reserved. -Copyright (C) 2007-2012 Mozilla Foundation. All rights reserved. -Copyright (C) 2009-2017 Facebook, Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: -1. Redistributions of source code must retain the above copyright notice(s), - this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright notice(s), - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS -OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE -OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --------------------------------------------------------------------------------- - -This project includes code from the Go project, BSD 3-clause license + PATENTS -weak patent termination clause -(https://github.com/golang/go/blob/master/PATENTS). - -Copyright (c) 2009 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - --------------------------------------------------------------------------------- - -This project includes code from the hs2client - -https://github.com/cloudera/hs2client - -Copyright 2016 Cloudera Inc. - -Licensed 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. - --------------------------------------------------------------------------------- - -The script ci/scripts/util_wait_for_it.sh has the following license - -Copyright (c) 2016 Giles Hall - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - --------------------------------------------------------------------------------- - -The script r/configure has the following license (MIT) - -Copyright (c) 2017, Jeroen Ooms and Jim Hester - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - --------------------------------------------------------------------------------- - -cpp/src/arrow/util/logging.cc, cpp/src/arrow/util/logging.h and -cpp/src/arrow/util/logging-test.cc are adapted from -Ray Project (https://github.com/ray-project/ray) (Apache 2.0). - -Copyright (c) 2016 Ray Project (https://github.com/ray-project/ray) - -Licensed 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. - --------------------------------------------------------------------------------- -The files cpp/src/arrow/vendored/datetime/date.h, cpp/src/arrow/vendored/datetime/tz.h, -cpp/src/arrow/vendored/datetime/tz_private.h, cpp/src/arrow/vendored/datetime/ios.h, -cpp/src/arrow/vendored/datetime/tz.cpp are adapted from -Howard Hinnant's date library (https://github.com/HowardHinnant/date) -It is licensed under MIT license. - -The MIT License (MIT) -Copyright (c) 2015, 2016, 2017 Howard Hinnant -Copyright (c) 2016 Adrian Colomitchi -Copyright (c) 2017 Florian Dang -Copyright (c) 2017 Paul Thompson -Copyright (c) 2018 Tomasz Kamiński - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - --------------------------------------------------------------------------------- - -The file cpp/src/arrow/util/utf8.h includes code adapted from the page - https://bjoern.hoehrmann.de/utf-8/decoder/dfa/ -with the following license (MIT) - -Copyright (c) 2008-2009 Bjoern Hoehrmann - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - --------------------------------------------------------------------------------- - -The file cpp/src/arrow/vendored/string_view.hpp has the following license - -Boost Software License - Version 1.0 - August 17th, 2003 - -Permission is hereby granted, free of charge, to any person or organization -obtaining a copy of the software and accompanying documentation covered by -this license (the "Software") to use, reproduce, display, distribute, -execute, and transmit the Software, and to prepare derivative works of the -Software, and to permit third-parties to whom the Software is furnished to -do so, all subject to the following: - -The copyright notices in the Software and this entire statement, including -the above license grant, this restriction and the following disclaimer, -must be included in all copies of the Software, in whole or in part, and -all derivative works of the Software, unless such copies or derivative -works are solely in the form of machine-executable object code generated by -a source language processor. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - --------------------------------------------------------------------------------- - -The file cpp/src/arrow/vendored/variant.hpp has the following license - -Boost Software License - Version 1.0 - August 17th, 2003 - -Permission is hereby granted, free of charge, to any person or organization -obtaining a copy of the software and accompanying documentation covered by -this license (the "Software") to use, reproduce, display, distribute, -execute, and transmit the Software, and to prepare derivative works of the -Software, and to permit third-parties to whom the Software is furnished to -do so, all subject to the following: - -The copyright notices in the Software and this entire statement, including -the above license grant, this restriction and the following disclaimer, -must be included in all copies of the Software, in whole or in part, and -all derivative works of the Software, unless such copies or derivative -works are solely in the form of machine-executable object code generated by -a source language processor. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - --------------------------------------------------------------------------------- - -The files in cpp/src/arrow/vendored/xxhash/ have the following license -(BSD 2-Clause License) - -xxHash Library -Copyright (c) 2012-2014, Yann Collet -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, this - list of conditions and the following disclaimer in the documentation and/or - other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -You can contact the author at : -- xxHash homepage: http://www.xxhash.com -- xxHash source repository : https://github.com/Cyan4973/xxHash - --------------------------------------------------------------------------------- - -The files in cpp/src/arrow/vendored/double-conversion/ have the following license -(BSD 3-Clause License) - -Copyright 2006-2011, the V8 project authors. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of Google Inc. nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - --------------------------------------------------------------------------------- - -The files in cpp/src/arrow/vendored/uriparser/ have the following license -(BSD 3-Clause License) - -uriparser - RFC 3986 URI parsing library - -Copyright (C) 2007, Weijia Song -Copyright (C) 2007, Sebastian Pipping -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - * Neither the name of the nor the names of its - contributors may be used to endorse or promote products - derived from this software without specific prior written - permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, -STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED -OF THE POSSIBILITY OF SUCH DAMAGE. - --------------------------------------------------------------------------------- - -The files under dev/tasks/conda-recipes have the following license - -BSD 3-clause license -Copyright (c) 2015-2018, conda-forge -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR -TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - --------------------------------------------------------------------------------- - -The files in cpp/src/arrow/vendored/utf8cpp/ have the following license - -Copyright 2006 Nemanja Trifunovic - -Permission is hereby granted, free of charge, to any person or organization -obtaining a copy of the software and accompanying documentation covered by -this license (the "Software") to use, reproduce, display, distribute, -execute, and transmit the Software, and to prepare derivative works of the -Software, and to permit third-parties to whom the Software is furnished to -do so, all subject to the following: - -The copyright notices in the Software and this entire statement, including -the above license grant, this restriction and the following disclaimer, -must be included in all copies of the Software, in whole or in part, and -all derivative works of the Software, unless such copies or derivative -works are solely in the form of machine-executable object code generated by -a source language processor. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - --------------------------------------------------------------------------------- - -This project includes code from Apache Kudu. - - * cpp/cmake_modules/CompilerInfo.cmake is based on Kudu's cmake_modules/CompilerInfo.cmake - -Copyright: 2016 The Apache Software Foundation. -Home page: https://kudu.apache.org/ -License: http://www.apache.org/licenses/LICENSE-2.0 - --------------------------------------------------------------------------------- - -This project includes code from Apache Impala (incubating), formerly -Impala. The Impala code and rights were donated to the ASF as part of the -Incubator process after the initial code imports into Apache Parquet. - -Copyright: 2012 Cloudera, Inc. -Copyright: 2016 The Apache Software Foundation. -Home page: http://impala.apache.org/ -License: http://www.apache.org/licenses/LICENSE-2.0 - --------------------------------------------------------------------------------- - -This project includes code from Apache Aurora. - -* dev/release/{release,changelog,release-candidate} are based on the scripts from - Apache Aurora - -Copyright: 2016 The Apache Software Foundation. -Home page: https://aurora.apache.org/ -License: http://www.apache.org/licenses/LICENSE-2.0 - --------------------------------------------------------------------------------- - -This project includes code from the Google styleguide. - -* cpp/build-support/cpplint.py is based on the scripts from the Google styleguide. - -Copyright: 2009 Google Inc. All rights reserved. -Homepage: https://github.com/google/styleguide -License: 3-clause BSD - --------------------------------------------------------------------------------- - -This project includes code from Snappy. - -* cpp/cmake_modules/{SnappyCMakeLists.txt,SnappyConfig.h} are based on code - from Google's Snappy project. - -Copyright: 2009 Google Inc. All rights reserved. -Homepage: https://github.com/google/snappy -License: 3-clause BSD - --------------------------------------------------------------------------------- - -This project includes code from the manylinux project. - -* python/manylinux1/scripts/{build_python.sh,python-tag-abi-tag.py, - requirements.txt} are based on code from the manylinux project. - -Copyright: 2016 manylinux -Homepage: https://github.com/pypa/manylinux -License: The MIT License (MIT) - --------------------------------------------------------------------------------- - -This project includes code from the cymove project: - -* python/pyarrow/includes/common.pxd includes code from the cymove project - -The MIT License (MIT) -Copyright (c) 2019 Omer Ozarslan - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE -OR OTHER DEALINGS IN THE SOFTWARE. - --------------------------------------------------------------------------------- - -The projects includes code from the Ursabot project under the dev/archery -directory. - -License: BSD 2-Clause - -Copyright 2019 RStudio, Inc. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - --------------------------------------------------------------------------------- - -This project include code from CMake. - -* cpp/cmake_modules/FindGTest.cmake is based on code from CMake. - -Copyright: Copyright 2000-2019 Kitware, Inc. and Contributors -Homepage: https://gitlab.kitware.com/cmake/cmake -License: 3-clause BSD - --------------------------------------------------------------------------------- - -This project include code from mingw-w64. - -* cpp/src/arrow/util/cpu-info.cc has a polyfill for mingw-w64 < 5 - -Copyright (c) 2009 - 2013 by the mingw-w64 project -Homepage: https://mingw-w64.org -License: Zope Public License (ZPL) Version 2.1. - ---------------------------------------------------------------------------------- - -This project include code from Google's Asylo project. - -* cpp/src/arrow/result.h is based on status_or.h - -Copyright (c) Copyright 2017 Asylo authors -Homepage: https://asylo.dev/ -License: Apache 2.0 - --------------------------------------------------------------------------------- - -This project includes code from Google's protobuf project - -* cpp/src/arrow/result.h ARROW_ASSIGN_OR_RAISE is based off ASSIGN_OR_RETURN - -Copyright 2008 Google Inc. All rights reserved. -Homepage: https://developers.google.com/protocol-buffers/ -License: - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -Code generated by the Protocol Buffer compiler is owned by the owner -of the input file used when generating it. This code is not -standalone and requires a support library to be linked with it. This -support library is itself covered by the above license. - --------------------------------------------------------------------------------- - -3rdparty dependency LLVM is statically linked in certain binary -distributions. LLVM has the following license: - -============================================================================== -LLVM Release License -============================================================================== -University of Illinois/NCSA -Open Source License - -Copyright (c) 2003-2018 University of Illinois at Urbana-Champaign. -All rights reserved. - -Developed by: - - LLVM Team - - University of Illinois at Urbana-Champaign - - http://llvm.org - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal with -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -of the Software, and to permit persons to whom the Software is furnished to do -so, subject to the following conditions: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimers. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimers in the - documentation and/or other materials provided with the distribution. - - * Neither the names of the LLVM Team, University of Illinois at - Urbana-Champaign, nor the names of its contributors may be used to - endorse or promote products derived from this Software without specific - prior written permission. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE -SOFTWARE. - -============================================================================== -Copyrights and Licenses for Third Party Software Distributed with LLVM: -============================================================================== -The LLVM software contains code written by third parties. Such software will -have its own individual LICENSE.TXT file in the directory in which it appears. -This file will describe the copyrights, license, and restrictions which apply -to that code. - -The disclaimer of warranty in the University of Illinois Open Source License -applies to all code in the LLVM Distribution, and nothing in any of the -other licenses gives permission to use the names of the LLVM Team or the -University of Illinois to endorse or promote products derived from this -Software. - -The following pieces of software have additional or alternate copyrights, -licenses, and/or restrictions: - -Program Directory -------- --------- -Google Test llvm/utils/unittest/googletest -OpenBSD regex llvm/lib/Support/{reg*, COPYRIGHT.regex} -pyyaml tests llvm/test/YAMLParser/{*.data, LICENSE.TXT} -ARM contributions llvm/lib/Target/ARM/LICENSE.TXT -md5 contributions llvm/lib/Support/MD5.cpp llvm/include/llvm/Support/MD5.h - --------------------------------------------------------------------------------- - -3rdparty dependency gRPC is statically linked in certain binary -distributions, like the python wheels. gRPC has the following license: - -Copyright 2014 gRPC authors. - -Licensed 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. - --------------------------------------------------------------------------------- - -3rdparty dependency Apache Thrift is statically linked in certain binary -distributions, like the python wheels. Apache Thrift has the following license: - -Apache Thrift -Copyright (C) 2006 - 2019, The Apache Software Foundation - -This product includes software developed at -The Apache Software Foundation (http://www.apache.org/). - -Licensed 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. - --------------------------------------------------------------------------------- - -3rdparty dependency Apache ORC is statically linked in certain binary -distributions, like the python wheels. Apache ORC has the following license: - -Apache ORC -Copyright 2013-2019 The Apache Software Foundation - -This product includes software developed by The Apache Software -Foundation (http://www.apache.org/). - -This product includes software developed by Hewlett-Packard: -(c) Copyright [2014-2015] Hewlett-Packard Development Company, L.P - -Licensed 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. - --------------------------------------------------------------------------------- - -3rdparty dependency zstd is statically linked in certain binary -distributions, like the python wheels. ZSTD has the following license: - -BSD License - -For Zstandard software - -Copyright (c) 2016-present, Facebook, Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name Facebook nor the names of its contributors may be used to - endorse or promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - --------------------------------------------------------------------------------- - -3rdparty dependency lz4 is statically linked in certain binary -distributions, like the python wheels. lz4 has the following license: - -LZ4 Library -Copyright (c) 2011-2016, Yann Collet -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, this - list of conditions and the following disclaimer in the documentation and/or - other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - --------------------------------------------------------------------------------- - -3rdparty dependency Brotli is statically linked in certain binary -distributions, like the python wheels. Brotli has the following license: - -Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - --------------------------------------------------------------------------------- - -3rdparty dependency rapidjson is statically linked in certain binary -distributions, like the python wheels. rapidjson and its dependencies have the -following licenses: - -Tencent is pleased to support the open source community by making RapidJSON -available. - -Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. -All rights reserved. - -If you have downloaded a copy of the RapidJSON binary from Tencent, please note -that the RapidJSON binary is licensed under the MIT License. -If you have downloaded a copy of the RapidJSON source code from Tencent, please -note that RapidJSON source code is licensed under the MIT License, except for -the third-party components listed below which are subject to different license -terms. Your integration of RapidJSON into your own projects may require -compliance with the MIT License, as well as the other licenses applicable to -the third-party components included within RapidJSON. To avoid the problematic -JSON license in your own projects, it's sufficient to exclude the -bin/jsonchecker/ directory, as it's the only code under the JSON license. -A copy of the MIT License is included in this file. - -Other dependencies and licenses: - - Open Source Software Licensed Under the BSD License: - -------------------------------------------------------------------- - - The msinttypes r29 - Copyright (c) 2006-2013 Alexander Chemeris - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR - ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - DAMAGE. - - Open Source Software Licensed Under the JSON License: - -------------------------------------------------------------------- - - json.org - Copyright (c) 2002 JSON.org - All Rights Reserved. - - JSON_checker - Copyright (c) 2002 JSON.org - All Rights Reserved. - - - Terms of the JSON License: - --------------------------------------------------- - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - The Software shall be used for Good, not Evil. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - - - Terms of the MIT License: - -------------------------------------------------------------------- - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - --------------------------------------------------------------------------------- - -3rdparty dependency snappy is statically linked in certain binary -distributions, like the python wheels. snappy has the following license: - -Copyright 2011, Google Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of Google Inc. nor the names of its contributors may be - used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -=== - -Some of the benchmark data in testdata/ is licensed differently: - - - fireworks.jpeg is Copyright 2013 Steinar H. Gunderson, and - is licensed under the Creative Commons Attribution 3.0 license - (CC-BY-3.0). See https://creativecommons.org/licenses/by/3.0/ - for more information. - - - kppkn.gtb is taken from the Gaviota chess tablebase set, and - is licensed under the MIT License. See - https://sites.google.com/site/gaviotachessengine/Home/endgame-tablebases-1 - for more information. - - - paper-100k.pdf is an excerpt (bytes 92160 to 194560) from the paper - “Combinatorial Modeling of Chromatin Features Quantitatively Predicts DNA - Replication Timing in _Drosophila_” by Federico Comoglio and Renato Paro, - which is licensed under the CC-BY license. See - http://www.ploscompbiol.org/static/license for more ifnormation. - - - alice29.txt, asyoulik.txt, plrabn12.txt and lcet10.txt are from Project - Gutenberg. The first three have expired copyrights and are in the public - domain; the latter does not have expired copyright, but is still in the - public domain according to the license information - (http://www.gutenberg.org/ebooks/53). - --------------------------------------------------------------------------------- - -3rdparty dependency gflags is statically linked in certain binary -distributions, like the python wheels. gflags has the following license: - -Copyright (c) 2006, Google Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - --------------------------------------------------------------------------------- - -3rdparty dependency glog is statically linked in certain binary -distributions, like the python wheels. glog has the following license: - -Copyright (c) 2008, Google Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -A function gettimeofday in utilities.cc is based on - -http://www.google.com/codesearch/p?hl=en#dR3YEbitojA/COPYING&q=GetSystemTimeAsFileTime%20license:bsd - -The license of this code is: - -Copyright (c) 2003-2008, Jouni Malinen and contributors -All Rights Reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - -3. Neither the name(s) of the above-listed copyright holder(s) nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - --------------------------------------------------------------------------------- - -3rdparty dependency re2 is statically linked in certain binary -distributions, like the python wheels. re2 has the following license: - -Copyright (c) 2009 The RE2 Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of Google Inc. nor the names of its contributors - may be used to endorse or promote products derived from this - software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - --------------------------------------------------------------------------------- - -3rdparty dependency c-ares is statically linked in certain binary -distributions, like the python wheels. c-ares has the following license: - -# c-ares license - -Copyright (c) 2007 - 2018, Daniel Stenberg with many contributors, see AUTHORS -file. - -Copyright 1998 by the Massachusetts Institute of Technology. - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, provided that -the above copyright notice appear in all copies and that both that copyright -notice and this permission notice appear in supporting documentation, and that -the name of M.I.T. not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior permission. -M.I.T. makes no representations about the suitability of this software for any -purpose. It is provided "as is" without express or implied warranty. - --------------------------------------------------------------------------------- - -3rdparty dependency zlib is redistributed as a dynamically linked shared -library in certain binary distributions, like the python wheels. In the future -this will likely change to static linkage. zlib has the following license: - -zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.11, January 15th, 2017 - - Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - Jean-loup Gailly Mark Adler - jloup@gzip.org madler@alumni.caltech.edu - --------------------------------------------------------------------------------- - -3rdparty dependency openssl is redistributed as a dynamically linked shared -library in certain binary distributions, like the python wheels. openssl -preceding version 3 has the following license: - - LICENSE ISSUES - ============== - - The OpenSSL toolkit stays under a double license, i.e. both the conditions of - the OpenSSL License and the original SSLeay license apply to the toolkit. - See below for the actual license texts. - - OpenSSL License - --------------- - -/* ==================================================================== - * Copyright (c) 1998-2019 The OpenSSL Project. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. All advertising materials mentioning features or use of this - * software must display the following acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" - * - * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to - * endorse or promote products derived from this software without - * prior written permission. For written permission, please contact - * openssl-core@openssl.org. - * - * 5. Products derived from this software may not be called "OpenSSL" - * nor may "OpenSSL" appear in their names without prior written - * permission of the OpenSSL Project. - * - * 6. Redistributions of any form whatsoever must retain the following - * acknowledgment: - * "This product includes software developed by the OpenSSL Project - * for use in the OpenSSL Toolkit (http://www.openssl.org/)" - * - * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY - * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED - * OF THE POSSIBILITY OF SUCH DAMAGE. - * ==================================================================== - * - * This product includes cryptographic software written by Eric Young - * (eay@cryptsoft.com). This product includes software written by Tim - * Hudson (tjh@cryptsoft.com). - * - */ - - Original SSLeay License - ----------------------- - -/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - * All rights reserved. - * - * This package is an SSL implementation written - * by Eric Young (eay@cryptsoft.com). - * The implementation was written so as to conform with Netscapes SSL. - * - * This library is free for commercial and non-commercial use as long as - * the following conditions are aheared to. The following conditions - * apply to all code found in this distribution, be it the RC4, RSA, - * lhash, DES, etc., code; not just the SSL code. The SSL documentation - * included with this distribution is covered by the same copyright terms - * except that the holder is Tim Hudson (tjh@cryptsoft.com). - * - * Copyright remains Eric Young's, and as such any Copyright notices in - * the code are not to be removed. - * If this package is used in a product, Eric Young should be given attribution - * as the author of the parts of the library used. - * This can be in the form of a textual message at program startup or - * in documentation (online or textual) provided with the package. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * "This product includes cryptographic software written by - * Eric Young (eay@cryptsoft.com)" - * The word 'cryptographic' can be left out if the rouines from the library - * being used are not cryptographic related :-). - * 4. If you include any Windows specific code (or a derivative thereof) from - * the apps directory (application code) you must include an acknowledgement: - * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" - * - * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * The licence and distribution terms for any publically available version or - * derivative of this code cannot be changed. i.e. this code cannot simply be - * copied and put under another distribution licence - * [including the GNU Public Licence.] - */ - --------------------------------------------------------------------------------- - -This project includes code from the rtools-backports project. - -* ci/scripts/PKGBUILD and ci/scripts/r_windows_build.sh are based on code - from the rtools-backports project. - -Copyright: Copyright (c) 2013 - 2019, Алексей and Jeroen Ooms. -All rights reserved. -Homepage: https://github.com/r-windows/rtools-backports -License: 3-clause BSD - --------------------------------------------------------------------------------- - -Some code from pandas has been adapted for the pyarrow codebase. pandas is -available under the 3-clause BSD license, which follows: - -pandas license -============== - -Copyright (c) 2011-2012, Lambda Foundry, Inc. and PyData Development Team -All rights reserved. - -Copyright (c) 2008-2011 AQR Capital Management, LLC -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - - * Neither the name of the copyright holder nor the names of any - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - --------------------------------------------------------------------------------- - -Some bits from DyND, in particular aspects of the build system, have been -adapted from libdynd and dynd-python under the terms of the BSD 2-clause -license - -The BSD 2-Clause License - - Copyright (C) 2011-12, Dynamic NDArray Developers - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -Dynamic NDArray Developers list: - - * Mark Wiebe - * Continuum Analytics - --------------------------------------------------------------------------------- - -Some source code from Ibis (https://github.com/cloudera/ibis) has been adapted -for PyArrow. Ibis is released under the Apache License, Version 2.0. - --------------------------------------------------------------------------------- - -This project includes code from the autobrew project. - -* r/tools/autobrew and dev/tasks/homebrew-formulae/autobrew/apache-arrow.rb - are based on code from the autobrew project. - -Copyright (c) 2019, Jeroen Ooms -License: MIT -Homepage: https://github.com/jeroen/autobrew - --------------------------------------------------------------------------------- - -dev/tasks/homebrew-formulae/apache-arrow.rb has the following license: - -BSD 2-Clause License - -Copyright (c) 2009-present, Homebrew contributors -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ----------------------------------------------------------------------- - -cpp/src/arrow/vendored/base64.cpp has the following license - -ZLIB License - -Copyright (C) 2004-2017 René Nyffenegger - -This source code is provided 'as-is', without any express or implied -warranty. In no event will the author be held liable for any damages arising -from the use of this software. - -Permission is granted to anyone to use this software for any purpose, including -commercial applications, and to alter it and redistribute it freely, subject to -the following restrictions: - -1. The origin of this source code must not be misrepresented; you must not - claim that you wrote the original source code. If you use this source code - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original source code. - -3. This notice may not be removed or altered from any source distribution. - -René Nyffenegger rene.nyffenegger@adp-gmbh.ch - --------------------------------------------------------------------------------- - -The file cpp/src/arrow/vendored/optional.hpp has the following license - -Boost Software License - Version 1.0 - August 17th, 2003 - -Permission is hereby granted, free of charge, to any person or organization -obtaining a copy of the software and accompanying documentation covered by -this license (the "Software") to use, reproduce, display, distribute, -execute, and transmit the Software, and to prepare derivative works of the -Software, and to permit third-parties to whom the Software is furnished to -do so, all subject to the following: - -The copyright notices in the Software and this entire statement, including -the above license grant, this restriction and the following disclaimer, -must be included in all copies of the Software, in whole or in part, and -all derivative works of the Software, unless such copies or derivative -works are solely in the form of machine-executable object code generated by -a source language processor. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT -SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE -FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, -ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. diff --git a/LICENSE-binary b/LICENSE-binary new file mode 100644 index 0000000000000..3680275b939a2 --- /dev/null +++ b/LICENSE-binary @@ -0,0 +1,262 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed 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. + +--------------------------------------------------------- + +This project bundles some components that are also licensed under the Apache +License Version 2.0: + +com.fasterxml.jackson.core:jackson-core +com.fasterxml.jackson.core:jackson-databind +com.fasterxml.jackson.datatype:jackson-datatype-jsr310 +com.fasterxml.jackson.module:jackson-module-scala_2.12 +com.google.code.findbugs:jsr305 +com.google.code.gson:gson +com.google.errorprone:error_prone_annotations +com.google.flatbuffers:flatbuffers-java +com.google.guava:failureaccess +com.google.guava:guava +com.google.guava:listenablefuture +com.google.j2objc:j2objc-annotations +com.google.jimfs:jimfs +com.github.ben-manes.caffeine:caffeine +commons-codec:commons-codec +info.picocli:picocli +io.trino.tpcds:tpcds +io.trino.tpch:tpch +javax.inject:javax.inject +org.scala-lang:scala-library +org.apache.arrow:arrow-format +org.apache.arrow:arrow-memory-core +org.apache.arrow:arrow-memory-unsafe +org.apache.arrow:arrow-vector + +--------------------------------------------------------- + +This product bundles various third-party components under other open source licenses. +This section summarizes those components and their licenses. See licenses-binary/ +for text of these licenses. + +BSD 3-Clause +------------ + +com.thoughtworks.paranamer:paranamer +io.glutenproject:protobuf-java +io.glutenproject:protobuf-java-util +org.eclipse.collections:eclipse-collections +org.eclipse.collections:eclipse-collections-api + + +MIT License +----------- + +org.checkerframework:checker-qual +org.slf4j:slf4j-api + + +Eclipse Public License (EPL) 1.0 +-------------------------------- + +org.eclipse.collections:eclipse-collections +org.eclipse.collections:eclipse-collections-api + diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000000000..effe2ede4e365 --- /dev/null +++ b/NOTICE @@ -0,0 +1,7 @@ +Apache Gluten(incubating) +Copyright 2023-2024 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). + +The initial codebase was donated to the ASF by Intel and Kyligence, copyright 2023-2024. diff --git a/NOTICE-binary b/NOTICE-binary new file mode 100644 index 0000000000000..be510d300f22d --- /dev/null +++ b/NOTICE-binary @@ -0,0 +1,1722 @@ +Apache Gluten(incubating) +Copyright 2023-2024 The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). + +## Third-party Content + +This project leverages the following third party content. + +Apache Spark +Copyright 2014 and onwards The Apache Software Foundation. + +--------------------------------------------------------- + +Apache Celeborn +Copyright 2022-2024 The Apache Software Foundation. + +--------------------------------------------------------- + +Apache Uniffle (incubating) +Copyright 2022 and onwards The Apache Software Foundation. + +--------------------------------------------------------- + +Apache Iceberg +Copyright 2017-2024 The Apache Software Foundation. + +--------------------------------------------------------- + +Apache Parquet MR +Copyright 2014-2024 The Apache Software Foundation. + +--------------------------------------------------------- + +Apache ORC +Copyright 2013 and onwards The Apache Software Foundation. + +--------------------------------------------------------- + +Apache Thrift +Copyright (C) 2006 - 2019, The Apache Software Foundation. + +--------------------------------------------------------- + +This project includes code from Daniel Lemire's FrameOfReference project. + +https://github.com/lemire/FrameOfReference/blob/6ccaf9e97160f9a3b299e23a8ef739e711ef0c71/src/bpacking.cpp + +Copyright: 2013 Daniel Lemire +Home page: http://lemire.me/en/ +Project page: https://github.com/lemire/FrameOfReference +License: Apache License Version 2.0 http://www.apache.org/licenses/LICENSE-2.0 + +--------------------------------------------------------- + +This project includes code from the TensorFlow project + +Copyright 2015 The TensorFlow Authors. All Rights Reserved. + +Licensed 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. + +--------------------------------------------------------- + +This project includes code from the NumPy project. + +https://github.com/numpy/numpy/blob/e1f191c46f2eebd6cb892a4bfe14d9dd43a06c4e/numpy/core/src/multiarray/multiarraymodule.c#L2910 + +https://github.com/numpy/numpy/blob/68fd82271b9ea5a9e50d4e761061dfcca851382a/numpy/core/src/multiarray/datetime.c + +Copyright (c) 2005-2017, NumPy Developers. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of the NumPy Developers nor the names of any + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +This project includes code from the Boost project + +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +--------------------------------------------------------- + +This project includes code from the FlatBuffers project + +Copyright 2014 Google Inc. + +Licensed 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. + +--------------------------------------------------------- + +This project includes code from the tslib project + +Copyright 2015 Microsoft Corporation. All rights reserved. + +Licensed 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. + +--------------------------------------------------------- + +This project includes code from the jemalloc project + +https://github.com/jemalloc/jemalloc + +Copyright (C) 2002-2017 Jason Evans . +All rights reserved. +Copyright (C) 2007-2012 Mozilla Foundation. All rights reserved. +Copyright (C) 2009-2017 Facebook, Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: +1. Redistributions of source code must retain the above copyright notice(s), + this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice(s), + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS +OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +This project includes code from the Go project, BSD 3-clause license + PATENTS +weak patent termination clause +(https://github.com/golang/go/blob/master/PATENTS). + +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +--------------------------------------------------------- + +This project includes code from the hs2client + +https://github.com/cloudera/hs2client + +Copyright 2016 Cloudera Inc. + +Licensed 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. + +-------------------------------------------------------------------------------- + +The script ci/scripts/util_wait_for_it.sh has the following license + +Copyright (c) 2016 Giles Hall + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +-------------------------------------------------------------------------------- + +The script r/configure has the following license (MIT) + +Copyright (c) 2017, Jeroen Ooms and Jim Hester + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +-------------------------------------------------------------------------------- + +cpp/src/arrow/util/logging.cc, cpp/src/arrow/util/logging.h and +cpp/src/arrow/util/logging-test.cc are adapted from +Ray Project (https://github.com/ray-project/ray) (Apache 2.0). + +Copyright (c) 2016 Ray Project (https://github.com/ray-project/ray) + +Licensed 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. + +-------------------------------------------------------------------------------- +The files cpp/src/arrow/vendored/datetime/date.h, cpp/src/arrow/vendored/datetime/tz.h, +cpp/src/arrow/vendored/datetime/tz_private.h, cpp/src/arrow/vendored/datetime/ios.h, +cpp/src/arrow/vendored/datetime/tz.cpp are adapted from +Howard Hinnant's date library (https://github.com/HowardHinnant/date) +It is licensed under MIT license. + +The MIT License (MIT) +Copyright (c) 2015, 2016, 2017 Howard Hinnant +Copyright (c) 2016 Adrian Colomitchi +Copyright (c) 2017 Florian Dang +Copyright (c) 2017 Paul Thompson +Copyright (c) 2018 Tomasz Kamiński + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +-------------------------------------------------------------------------------- + +The file cpp/src/arrow/util/utf8.h includes code adapted from the page + https://bjoern.hoehrmann.de/utf-8/decoder/dfa/ +with the following license (MIT) + +Copyright (c) 2008-2009 Bjoern Hoehrmann + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +-------------------------------------------------------------------------------- + +The file cpp/src/arrow/vendored/string_view.hpp has the following license + +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +-------------------------------------------------------------------------------- + +The file cpp/src/arrow/vendored/variant.hpp has the following license + +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +-------------------------------------------------------------------------------- + +The files in cpp/src/arrow/vendored/xxhash/ have the following license +(BSD 2-Clause License) + +xxHash Library +Copyright (c) 2012-2014, Yann Collet +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +You can contact the author at : +- xxHash homepage: http://www.xxhash.com +- xxHash source repository : https://github.com/Cyan4973/xxHash + +-------------------------------------------------------------------------------- + +The files in cpp/src/arrow/vendored/double-conversion/ have the following license +(BSD 3-Clause License) + +Copyright 2006-2011, the V8 project authors. All rights reserved. +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-------------------------------------------------------------------------------- + +The files in cpp/src/arrow/vendored/uriparser/ have the following license +(BSD 3-Clause License) + +uriparser - RFC 3986 URI parsing library + +Copyright (C) 2007, Weijia Song +Copyright (C) 2007, Sebastian Pipping +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above + copyright notice, this list of conditions and the following + disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials + provided with the distribution. + + * Neither the name of the nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior written + permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +-------------------------------------------------------------------------------- + +The files under dev/tasks/conda-recipes have the following license + +BSD 3-clause license +Copyright (c) 2015-2018, conda-forge +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR +TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-------------------------------------------------------------------------------- + +The files in cpp/src/arrow/vendored/utf8cpp/ have the following license + +Copyright 2006 Nemanja Trifunovic + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +-------------------------------------------------------------------------------- + +This project includes code from Apache Kudu. + + * cpp/cmake_modules/CompilerInfo.cmake is based on Kudu's cmake_modules/CompilerInfo.cmake + +Copyright: 2016 The Apache Software Foundation. +Home page: https://kudu.apache.org/ +License: http://www.apache.org/licenses/LICENSE-2.0 + +-------------------------------------------------------------------------------- + +This project includes code from Apache Impala (incubating), formerly +Impala. The Impala code and rights were donated to the ASF as part of the +Incubator process after the initial code imports into Apache Parquet. + +Copyright: 2012 Cloudera, Inc. +Copyright: 2016 The Apache Software Foundation. +Home page: http://impala.apache.org/ +License: http://www.apache.org/licenses/LICENSE-2.0 + +-------------------------------------------------------------------------------- + +This project includes code from Apache Aurora. + +* dev/release/{release,changelog,release-candidate} are based on the scripts from + Apache Aurora + +Copyright: 2016 The Apache Software Foundation. +Home page: https://aurora.apache.org/ +License: http://www.apache.org/licenses/LICENSE-2.0 + +-------------------------------------------------------------------------------- + +This project includes code from the Google styleguide. + +* cpp/build-support/cpplint.py is based on the scripts from the Google styleguide. + +Copyright: 2009 Google Inc. All rights reserved. +Homepage: https://github.com/google/styleguide +License: 3-clause BSD + +-------------------------------------------------------------------------------- + +This project includes code from Snappy. + +* cpp/cmake_modules/{SnappyCMakeLists.txt,SnappyConfig.h} are based on code + from Google's Snappy project. + +Copyright: 2009 Google Inc. All rights reserved. +Homepage: https://github.com/google/snappy +License: 3-clause BSD + +-------------------------------------------------------------------------------- + +This project includes code from the manylinux project. + +* python/manylinux1/scripts/{build_python.sh,python-tag-abi-tag.py, + requirements.txt} are based on code from the manylinux project. + +Copyright: 2016 manylinux +Homepage: https://github.com/pypa/manylinux +License: The MIT License (MIT) + +-------------------------------------------------------------------------------- + +This project includes code from the cymove project: + +* python/pyarrow/includes/common.pxd includes code from the cymove project + +The MIT License (MIT) +Copyright (c) 2019 Omer Ozarslan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE +OR OTHER DEALINGS IN THE SOFTWARE. + +-------------------------------------------------------------------------------- + +The projects includes code from the Ursabot project under the dev/archery +directory. + +License: BSD 2-Clause + +Copyright 2019 RStudio, Inc. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-------------------------------------------------------------------------------- + +This project include code from CMake. + +* cpp/cmake_modules/FindGTest.cmake is based on code from CMake. + +Copyright: Copyright 2000-2019 Kitware, Inc. and Contributors +Homepage: https://gitlab.kitware.com/cmake/cmake +License: 3-clause BSD + +-------------------------------------------------------------------------------- + +This project include code from mingw-w64. + +* cpp/src/arrow/util/cpu-info.cc has a polyfill for mingw-w64 < 5 + +Copyright (c) 2009 - 2013 by the mingw-w64 project +Homepage: https://mingw-w64.org +License: Zope Public License (ZPL) Version 2.1. + +--------------------------------------------------------------------------------- + +This project include code from Google's Asylo project. + +* cpp/src/arrow/result.h is based on status_or.h + +Copyright (c) Copyright 2017 Asylo authors +Homepage: https://asylo.dev/ +License: Apache 2.0 + +-------------------------------------------------------------------------------- + +This project includes code from Google's protobuf project + +* cpp/src/arrow/result.h ARROW_ASSIGN_OR_RAISE is based off ASSIGN_OR_RETURN + +Copyright 2008 Google Inc. All rights reserved. +Homepage: https://developers.google.com/protocol-buffers/ +License: + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Code generated by the Protocol Buffer compiler is owned by the owner +of the input file used when generating it. This code is not +standalone and requires a support library to be linked with it. This +support library is itself covered by the above license. + +-------------------------------------------------------------------------------- + +3rdparty dependency LLVM is statically linked in certain binary +distributions. LLVM has the following license: + +============================================================================== +LLVM Release License +============================================================================== +University of Illinois/NCSA +Open Source License + +Copyright (c) 2003-2018 University of Illinois at Urbana-Champaign. +All rights reserved. + +Developed by: + + LLVM Team + + University of Illinois at Urbana-Champaign + + http://llvm.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. + +============================================================================== +Copyrights and Licenses for Third Party Software Distributed with LLVM: +============================================================================== +The LLVM software contains code written by third parties. Such software will +have its own individual LICENSE.TXT file in the directory in which it appears. +This file will describe the copyrights, license, and restrictions which apply +to that code. + +The disclaimer of warranty in the University of Illinois Open Source License +applies to all code in the LLVM Distribution, and nothing in any of the +other licenses gives permission to use the names of the LLVM Team or the +University of Illinois to endorse or promote products derived from this +Software. + +The following pieces of software have additional or alternate copyrights, +licenses, and/or restrictions: + +Program Directory +------- --------- +Google Test llvm/utils/unittest/googletest +OpenBSD regex llvm/lib/Support/{reg*, COPYRIGHT.regex} +pyyaml tests llvm/test/YAMLParser/{*.data, LICENSE.TXT} +ARM contributions llvm/lib/Target/ARM/LICENSE.TXT +md5 contributions llvm/lib/Support/MD5.cpp llvm/include/llvm/Support/MD5.h + +-------------------------------------------------------------------------------- + +3rdparty dependency gRPC is statically linked in certain binary +distributions, like the python wheels. gRPC has the following license: + +Copyright 2014 gRPC authors. + +Licensed 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. + +-------------------------------------------------------------------------------- + +3rdparty dependency Apache Thrift is statically linked in certain binary +distributions, like the python wheels. Apache Thrift has the following license: + +Apache Thrift +Copyright (C) 2006 - 2019, The Apache Software Foundation + +This product includes software developed at +The Apache Software Foundation (http://www.apache.org/). + +Licensed 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. + +-------------------------------------------------------------------------------- + +3rdparty dependency Apache ORC is statically linked in certain binary +distributions, like the python wheels. Apache ORC has the following license: + +Apache ORC +Copyright 2013-2019 The Apache Software Foundation + +This product includes software developed by The Apache Software +Foundation (http://www.apache.org/). + +This product includes software developed by Hewlett-Packard: +(c) Copyright [2014-2015] Hewlett-Packard Development Company, L.P + +Licensed 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. + +-------------------------------------------------------------------------------- + +3rdparty dependency zstd is statically linked in certain binary +distributions, like the python wheels. ZSTD has the following license: + +BSD License + +For Zstandard software + +Copyright (c) 2016-present, Facebook, Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name Facebook nor the names of its contributors may be used to + endorse or promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-------------------------------------------------------------------------------- + +3rdparty dependency lz4 is statically linked in certain binary +distributions, like the python wheels. lz4 has the following license: + +LZ4 Library +Copyright (c) 2011-2016, Yann Collet +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-------------------------------------------------------------------------------- + +3rdparty dependency Brotli is statically linked in certain binary +distributions, like the python wheels. Brotli has the following license: + +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +-------------------------------------------------------------------------------- + +3rdparty dependency rapidjson is statically linked in certain binary +distributions, like the python wheels. rapidjson and its dependencies have the +following licenses: + +Tencent is pleased to support the open source community by making RapidJSON +available. + +Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. +All rights reserved. + +If you have downloaded a copy of the RapidJSON binary from Tencent, please note +that the RapidJSON binary is licensed under the MIT License. +If you have downloaded a copy of the RapidJSON source code from Tencent, please +note that RapidJSON source code is licensed under the MIT License, except for +the third-party components listed below which are subject to different license +terms. Your integration of RapidJSON into your own projects may require +compliance with the MIT License, as well as the other licenses applicable to +the third-party components included within RapidJSON. To avoid the problematic +JSON license in your own projects, it's sufficient to exclude the +bin/jsonchecker/ directory, as it's the only code under the JSON license. +A copy of the MIT License is included in this file. + +Other dependencies and licenses: + + Open Source Software Licensed Under the BSD License: + -------------------------------------------------------------------- + + The msinttypes r29 + Copyright (c) 2006-2013 Alexander Chemeris + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY + EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR + ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH + DAMAGE. + + Open Source Software Licensed Under the JSON License: + -------------------------------------------------------------------- + + json.org + Copyright (c) 2002 JSON.org + All Rights Reserved. + + JSON_checker + Copyright (c) 2002 JSON.org + All Rights Reserved. + + + Terms of the JSON License: + --------------------------------------------------- + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + The Software shall be used for Good, not Evil. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + + + Terms of the MIT License: + -------------------------------------------------------------------- + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + +-------------------------------------------------------------------------------- + +3rdparty dependency snappy is statically linked in certain binary +distributions, like the python wheels. snappy has the following license: + +Copyright 2011, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of Google Inc. nor the names of its contributors may be + used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +=== + +Some of the benchmark data in testdata/ is licensed differently: + + - fireworks.jpeg is Copyright 2013 Steinar H. Gunderson, and + is licensed under the Creative Commons Attribution 3.0 license + (CC-BY-3.0). See https://creativecommons.org/licenses/by/3.0/ + for more information. + + - kppkn.gtb is taken from the Gaviota chess tablebase set, and + is licensed under the MIT License. See + https://sites.google.com/site/gaviotachessengine/Home/endgame-tablebases-1 + for more information. + + - paper-100k.pdf is an excerpt (bytes 92160 to 194560) from the paper + “Combinatorial Modeling of Chromatin Features Quantitatively Predicts DNA + Replication Timing in _Drosophila_” by Federico Comoglio and Renato Paro, + which is licensed under the CC-BY license. See + http://www.ploscompbiol.org/static/license for more ifnormation. + + - alice29.txt, asyoulik.txt, plrabn12.txt and lcet10.txt are from Project + Gutenberg. The first three have expired copyrights and are in the public + domain; the latter does not have expired copyright, but is still in the + public domain according to the license information + (http://www.gutenberg.org/ebooks/53). + +-------------------------------------------------------------------------------- + +3rdparty dependency gflags is statically linked in certain binary +distributions, like the python wheels. gflags has the following license: + +Copyright (c) 2006, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-------------------------------------------------------------------------------- + +3rdparty dependency glog is statically linked in certain binary +distributions, like the python wheels. glog has the following license: + +Copyright (c) 2008, Google Inc. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +A function gettimeofday in utilities.cc is based on + +http://www.google.com/codesearch/p?hl=en#dR3YEbitojA/COPYING&q=GetSystemTimeAsFileTime%20license:bsd + +The license of this code is: + +Copyright (c) 2003-2008, Jouni Malinen and contributors +All Rights Reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +3. Neither the name(s) of the above-listed copyright holder(s) nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-------------------------------------------------------------------------------- + +3rdparty dependency re2 is statically linked in certain binary +distributions, like the python wheels. re2 has the following license: + +Copyright (c) 2009 The RE2 Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of Google Inc. nor the names of its contributors + may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-------------------------------------------------------------------------------- + +3rdparty dependency c-ares is statically linked in certain binary +distributions, like the python wheels. c-ares has the following license: + +# c-ares license + +Copyright (c) 2007 - 2018, Daniel Stenberg with many contributors, see AUTHORS +file. + +Copyright 1998 by the Massachusetts Institute of Technology. + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, provided that +the above copyright notice appear in all copies and that both that copyright +notice and this permission notice appear in supporting documentation, and that +the name of M.I.T. not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior permission. +M.I.T. makes no representations about the suitability of this software for any +purpose. It is provided "as is" without express or implied warranty. + +-------------------------------------------------------------------------------- + +3rdparty dependency zlib is redistributed as a dynamically linked shared +library in certain binary distributions, like the python wheels. In the future +this will likely change to static linkage. zlib has the following license: + +zlib.h -- interface of the 'zlib' general purpose compression library + version 1.2.11, January 15th, 2017 + + Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + +-------------------------------------------------------------------------------- + +3rdparty dependency openssl is redistributed as a dynamically linked shared +library in certain binary distributions, like the python wheels. openssl +preceding version 3 has the following license: + + LICENSE ISSUES + ============== + + The OpenSSL toolkit stays under a double license, i.e. both the conditions of + the OpenSSL License and the original SSLeay license apply to the toolkit. + See below for the actual license texts. + + OpenSSL License + --------------- + +/* ==================================================================== + * Copyright (c) 1998-2019 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + + Original SSLeay License + ----------------------- + +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + +-------------------------------------------------------------------------------- + +This project includes code from the rtools-backports project. + +* ci/scripts/PKGBUILD and ci/scripts/r_windows_build.sh are based on code + from the rtools-backports project. + +Copyright: Copyright (c) 2013 - 2019, Алексей and Jeroen Ooms. +All rights reserved. +Homepage: https://github.com/r-windows/rtools-backports +License: 3-clause BSD + +-------------------------------------------------------------------------------- + +Some code from pandas has been adapted for the pyarrow codebase. pandas is +available under the 3-clause BSD license, which follows: + +pandas license +============== + +Copyright (c) 2011-2012, Lambda Foundry, Inc. and PyData Development Team +All rights reserved. + +Copyright (c) 2008-2011 AQR Capital Management, LLC +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of the copyright holder nor the names of any + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +-------------------------------------------------------------------------------- + +Some bits from DyND, in particular aspects of the build system, have been +adapted from libdynd and dynd-python under the terms of the BSD 2-clause +license + +The BSD 2-Clause License + + Copyright (C) 2011-12, Dynamic NDArray Developers + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Dynamic NDArray Developers list: + + * Mark Wiebe + * Continuum Analytics + +-------------------------------------------------------------------------------- + +Some source code from Ibis (https://github.com/cloudera/ibis) has been adapted +for PyArrow. Ibis is released under the Apache License, Version 2.0. + +-------------------------------------------------------------------------------- + +This project includes code from the autobrew project. + +* r/tools/autobrew and dev/tasks/homebrew-formulae/autobrew/apache-arrow.rb + are based on code from the autobrew project. + +Copyright (c) 2019, Jeroen Ooms +License: MIT +Homepage: https://github.com/jeroen/autobrew + +-------------------------------------------------------------------------------- + +dev/tasks/homebrew-formulae/apache-arrow.rb has the following license: + +BSD 2-Clause License + +Copyright (c) 2009-present, Homebrew contributors +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +---------------------------------------------------------------------- + +cpp/src/arrow/vendored/base64.cpp has the following license + +ZLIB License + +Copyright (C) 2004-2017 René Nyffenegger + +This source code is provided 'as-is', without any express or implied +warranty. In no event will the author be held liable for any damages arising +from the use of this software. + +Permission is granted to anyone to use this software for any purpose, including +commercial applications, and to alter it and redistribute it freely, subject to +the following restrictions: + +1. The origin of this source code must not be misrepresented; you must not + claim that you wrote the original source code. If you use this source code + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original source code. + +3. This notice may not be removed or altered from any source distribution. + +René Nyffenegger rene.nyffenegger@adp-gmbh.ch + +-------------------------------------------------------------------------------- + +The file cpp/src/arrow/vendored/optional.hpp has the following license + +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/backends-clickhouse/pom.xml b/backends-clickhouse/pom.xml index 27ebd75f2d591..5672056b41607 100644 --- a/backends-clickhouse/pom.xml +++ b/backends-clickhouse/pom.xml @@ -100,7 +100,7 @@ org.scalacheck scalacheck_${scala.binary.version} - 1.13.5 + 1.17.0 test @@ -126,13 +126,13 @@ org.scalatestplus - scalatestplus-mockito_2.12 + scalatestplus-mockito_${scala.binary.version} 1.0.0-M2 test org.scalatestplus - scalatestplus-scalacheck_2.12 + scalatestplus-scalacheck_${scala.binary.version} 3.1.0.0-RC2 test diff --git a/backends-clickhouse/src/main/delta-20/org/apache/spark/sql/delta/ClickhouseOptimisticTransaction.scala b/backends-clickhouse/src/main/delta-20/org/apache/spark/sql/delta/ClickhouseOptimisticTransaction.scala index 0794b45158e64..4133b5c605b84 100644 --- a/backends-clickhouse/src/main/delta-20/org/apache/spark/sql/delta/ClickhouseOptimisticTransaction.scala +++ b/backends-clickhouse/src/main/delta-20/org/apache/spark/sql/delta/ClickhouseOptimisticTransaction.scala @@ -116,11 +116,13 @@ class ClickhouseOptimisticTransaction( var options = writeOptions match { case None => Map.empty[String, String] case Some(writeOptions) => - writeOptions.options.filterKeys { - key => - key.equalsIgnoreCase(DeltaOptions.MAX_RECORDS_PER_FILE) || - key.equalsIgnoreCase(DeltaOptions.COMPRESSION) - }.toMap + writeOptions.options + .filterKeys { + key => + key.equalsIgnoreCase(DeltaOptions.MAX_RECORDS_PER_FILE) || + key.equalsIgnoreCase(DeltaOptions.COMPRESSION) + } + .map(identity) } spark.conf.getAll.foreach( diff --git a/backends-clickhouse/src/main/delta-23/org/apache/spark/sql/delta/ClickhouseOptimisticTransaction.scala b/backends-clickhouse/src/main/delta-23/org/apache/spark/sql/delta/ClickhouseOptimisticTransaction.scala index 0794b45158e64..4133b5c605b84 100644 --- a/backends-clickhouse/src/main/delta-23/org/apache/spark/sql/delta/ClickhouseOptimisticTransaction.scala +++ b/backends-clickhouse/src/main/delta-23/org/apache/spark/sql/delta/ClickhouseOptimisticTransaction.scala @@ -116,11 +116,13 @@ class ClickhouseOptimisticTransaction( var options = writeOptions match { case None => Map.empty[String, String] case Some(writeOptions) => - writeOptions.options.filterKeys { - key => - key.equalsIgnoreCase(DeltaOptions.MAX_RECORDS_PER_FILE) || - key.equalsIgnoreCase(DeltaOptions.COMPRESSION) - }.toMap + writeOptions.options + .filterKeys { + key => + key.equalsIgnoreCase(DeltaOptions.MAX_RECORDS_PER_FILE) || + key.equalsIgnoreCase(DeltaOptions.COMPRESSION) + } + .map(identity) } spark.conf.getAll.foreach( diff --git a/backends-clickhouse/src/main/delta-32/org/apache/spark/sql/delta/ClickhouseOptimisticTransaction.scala b/backends-clickhouse/src/main/delta-32/org/apache/spark/sql/delta/ClickhouseOptimisticTransaction.scala index d8ab2c1d078ca..9e79c4f2e9845 100644 --- a/backends-clickhouse/src/main/delta-32/org/apache/spark/sql/delta/ClickhouseOptimisticTransaction.scala +++ b/backends-clickhouse/src/main/delta-32/org/apache/spark/sql/delta/ClickhouseOptimisticTransaction.scala @@ -50,7 +50,7 @@ class ClickhouseOptimisticTransaction( def this( deltaLog: DeltaLog, catalogTable: Option[CatalogTable], - snapshotOpt: Option[Snapshot] = None) { + snapshotOpt: Option[Snapshot] = None) = { this( deltaLog, catalogTable, diff --git a/backends-clickhouse/src/main/delta-32/org/apache/spark/sql/delta/Snapshot.scala b/backends-clickhouse/src/main/delta-32/org/apache/spark/sql/delta/Snapshot.scala index 13a91f051dae0..8836f7c88d237 100644 --- a/backends-clickhouse/src/main/delta-32/org/apache/spark/sql/delta/Snapshot.scala +++ b/backends-clickhouse/src/main/delta-32/org/apache/spark/sql/delta/Snapshot.scala @@ -33,7 +33,6 @@ import org.apache.spark.sql.delta.stats.StatisticsCollection import org.apache.spark.sql.delta.util.DeltaCommitFileProvider import org.apache.spark.sql.delta.util.FileNames import org.apache.spark.sql.delta.util.StateCache -import org.apache.spark.sql.util.ScalaExtensions._ import org.apache.hadoop.fs.{FileStatus, Path} import org.apache.spark.sql._ @@ -126,7 +125,27 @@ class Snapshot( * This potentially triggers an IO operation to read the inCommitTimestamp. * This is a lazy val, so repeated calls will not trigger multiple IO operations. */ - protected lazy val getInCommitTimestampOpt: Option[Long] = + protected lazy val getInCommitTimestampOpt: Option[Long] = { + // --- modified start + // This implicit is for scala 2.12, copy from scala 2.13 + implicit class OptionExtCompanion(opt: Option.type) { + /** + * When a given condition is true, evaluates the a argument and returns Some(a). + * When the condition is false, a is not evaluated and None is returned. + */ + def when[A](cond: Boolean)(a: => A): Option[A] = if (cond) Some(a) else None + + /** + * When a given condition is false, evaluates the a argument and returns Some(a). + * When the condition is true, a is not evaluated and None is returned. + */ + def whenNot[A](cond: Boolean)(a: => A): Option[A] = if (!cond) Some(a) else None + + /** Sum up all the `options`, substituting `default` for each `None`. */ + def sum[N: Numeric](default: N)(options: Option[N]*): N = + options.map(_.getOrElse(default)).sum + } + // --- modified end Option.when(DeltaConfigs.IN_COMMIT_TIMESTAMPS_ENABLED.fromMetaData(metadata)) { _reconstructedProtocolMetadataAndICT.inCommitTimestamp .getOrElse { @@ -158,6 +177,7 @@ class Snapshot( } } } + } private[delta] lazy val nonFileActions: Seq[Action] = { diff --git a/backends-clickhouse/src/main/delta-32/org/apache/spark/sql/delta/commands/VacuumCommand.scala b/backends-clickhouse/src/main/delta-32/org/apache/spark/sql/delta/commands/VacuumCommand.scala index 987a7c35fa8bf..9f455fb27bb1d 100644 --- a/backends-clickhouse/src/main/delta-32/org/apache/spark/sql/delta/commands/VacuumCommand.scala +++ b/backends-clickhouse/src/main/delta-32/org/apache/spark/sql/delta/commands/VacuumCommand.scala @@ -712,7 +712,7 @@ trait VacuumCommandImpl extends DeltaCommand { // This is never going to be a path relative to `basePath` for DVs. None } - case None => None + case _ => None } } } diff --git a/backends-clickhouse/src/main/delta-32/org/apache/spark/sql/execution/datasources/v2/clickhouse/source/DeltaMergeTreeFileFormat.scala b/backends-clickhouse/src/main/delta-32/org/apache/spark/sql/execution/datasources/v2/clickhouse/source/DeltaMergeTreeFileFormat.scala index dc1d1072816aa..2f71a0a0ef7b3 100644 --- a/backends-clickhouse/src/main/delta-32/org/apache/spark/sql/execution/datasources/v2/clickhouse/source/DeltaMergeTreeFileFormat.scala +++ b/backends-clickhouse/src/main/delta-32/org/apache/spark/sql/execution/datasources/v2/clickhouse/source/DeltaMergeTreeFileFormat.scala @@ -55,7 +55,7 @@ class DeltaMergeTreeFileFormat(protocol: Protocol, metadata: Metadata) setIndexKeyOption: Option[Seq[String]], primaryKeyOption: Option[Seq[String]], clickhouseTableConfigs: Map[String, String], - partitionColumns: Seq[String]) { + partitionColumns: Seq[String]) = { this(protocol, metadata) this.database = database this.tableName = tableName diff --git a/backends-clickhouse/src/main/java/org/apache/gluten/vectorized/BatchIterator.java b/backends-clickhouse/src/main/java/org/apache/gluten/vectorized/BatchIterator.java index d674c6e90defd..1fbb6053a2afc 100644 --- a/backends-clickhouse/src/main/java/org/apache/gluten/vectorized/BatchIterator.java +++ b/backends-clickhouse/src/main/java/org/apache/gluten/vectorized/BatchIterator.java @@ -17,6 +17,7 @@ package org.apache.gluten.vectorized; import org.apache.gluten.metrics.IMetrics; +import org.apache.gluten.metrics.NativeMetrics; import org.apache.spark.sql.execution.utils.CHExecUtil; import org.apache.spark.sql.vectorized.ColumnVector; @@ -50,7 +51,7 @@ public String getId() { private native void nativeCancel(long nativeHandle); - private native IMetrics nativeFetchMetrics(long nativeHandle); + private native String nativeFetchMetrics(long nativeHandle); @Override public boolean hasNextInternal() throws IOException { @@ -72,8 +73,8 @@ public ColumnarBatch nextInternal() throws IOException { } @Override - public IMetrics getMetricsInternal() throws IOException, ClassNotFoundException { - return nativeFetchMetrics(handle); + public IMetrics getMetricsInternal() { + return new NativeMetrics(nativeFetchMetrics(handle)); } @Override diff --git a/backends-clickhouse/src/main/java/org/apache/gluten/vectorized/StorageJoinBuilder.java b/backends-clickhouse/src/main/java/org/apache/gluten/vectorized/StorageJoinBuilder.java index 9cb49b6a2d30e..27725998feebe 100644 --- a/backends-clickhouse/src/main/java/org/apache/gluten/vectorized/StorageJoinBuilder.java +++ b/backends-clickhouse/src/main/java/org/apache/gluten/vectorized/StorageJoinBuilder.java @@ -74,12 +74,20 @@ public static long build( return converter.genColumnNameWithExprId(attr); }) .collect(Collectors.joining(",")); + + int joinType; + if (broadCastContext.buildHashTableId().startsWith("BuiltBNLJBroadcastTable-")) { + joinType = SubstraitUtil.toCrossRelSubstrait(broadCastContext.joinType()).ordinal(); + } else { + joinType = SubstraitUtil.toSubstrait(broadCastContext.joinType()).ordinal(); + } + return nativeBuild( broadCastContext.buildHashTableId(), batches, rowCount, joinKey, - SubstraitUtil.toSubstrait(broadCastContext.joinType()).ordinal(), + joinType, broadCastContext.hasMixedFiltCondition(), toNameStruct(output).toByteArray()); } diff --git a/backends-clickhouse/src/main/scala/org/apache/gluten/backendsapi/clickhouse/CHBackend.scala b/backends-clickhouse/src/main/scala/org/apache/gluten/backendsapi/clickhouse/CHBackend.scala index cdca1b031a915..341a3e0f0a52c 100644 --- a/backends-clickhouse/src/main/scala/org/apache/gluten/backendsapi/clickhouse/CHBackend.scala +++ b/backends-clickhouse/src/main/scala/org/apache/gluten/backendsapi/clickhouse/CHBackend.scala @@ -26,7 +26,7 @@ import org.apache.gluten.substrait.rel.LocalFilesNode.ReadFileFormat._ import org.apache.spark.SparkEnv import org.apache.spark.internal.Logging import org.apache.spark.sql.catalyst.catalog.BucketSpec -import org.apache.spark.sql.catalyst.expressions.{Alias, AttributeReference, DenseRank, Expression, Lag, Lead, Literal, NamedExpression, Rank, RowNumber} +import org.apache.spark.sql.catalyst.expressions._ import org.apache.spark.sql.catalyst.expressions.aggregate.AggregateExpression import org.apache.spark.sql.catalyst.plans.physical.{HashPartitioning, Partitioning} import org.apache.spark.sql.execution.SparkPlan @@ -172,20 +172,20 @@ object CHBackendSettings extends BackendSettingsApi with Logging { format match { case ParquetReadFormat => if (validateFilePath) { - ValidationResult.ok + ValidationResult.succeeded } else { - ValidationResult.notOk("Validate file path failed.") + ValidationResult.failed("Validate file path failed.") } - case OrcReadFormat => ValidationResult.ok - case MergeTreeReadFormat => ValidationResult.ok + case OrcReadFormat => ValidationResult.succeeded + case MergeTreeReadFormat => ValidationResult.succeeded case TextReadFormat => if (!hasComplexType) { - ValidationResult.ok + ValidationResult.succeeded } else { - ValidationResult.notOk("Has complex type.") + ValidationResult.failed("Has complex type.") } - case JsonReadFormat => ValidationResult.ok - case _ => ValidationResult.notOk(s"Unsupported file format $format") + case JsonReadFormat => ValidationResult.succeeded + case _ => ValidationResult.failed(s"Unsupported file format $format") } } @@ -237,7 +237,8 @@ object CHBackendSettings extends BackendSettingsApi with Logging { } wExpression.windowFunction match { - case _: RowNumber | _: AggregateExpression | _: Rank | _: DenseRank => + case _: RowNumber | _: AggregateExpression | _: Rank | _: DenseRank | _: PercentRank | + _: NTile => allSupported = allSupported case l: Lag => checkLagOrLead(l.third) @@ -290,11 +291,12 @@ object CHBackendSettings extends BackendSettingsApi with Logging { fields: Array[StructField], bucketSpec: Option[BucketSpec], options: Map[String, String]): ValidationResult = - ValidationResult.notOk("CH backend is unsupported.") + ValidationResult.failed("CH backend is unsupported.") override def enableNativeWriteFiles(): Boolean = { GlutenConfig.getConf.enableNativeWriter.getOrElse(false) } override def mergeTwoPhasesHashBaseAggregateIfNeed(): Boolean = true + } diff --git a/backends-clickhouse/src/main/scala/org/apache/gluten/backendsapi/clickhouse/CHIteratorApi.scala b/backends-clickhouse/src/main/scala/org/apache/gluten/backendsapi/clickhouse/CHIteratorApi.scala index 376e46ebe9759..4b9ec739028f6 100644 --- a/backends-clickhouse/src/main/scala/org/apache/gluten/backendsapi/clickhouse/CHIteratorApi.scala +++ b/backends-clickhouse/src/main/scala/org/apache/gluten/backendsapi/clickhouse/CHIteratorApi.scala @@ -58,7 +58,7 @@ class CHIteratorApi extends IteratorApi with Logging with LogLevelUtil { } dataSchema += newField } - StructType(dataSchema) + StructType(dataSchema.toSeq) } private def createNativeIterator( @@ -114,7 +114,7 @@ class CHIteratorApi extends IteratorApi with Logging with LogLevelUtil { if (scan.fileFormat == ReadFileFormat.TextReadFormat) { val names = ConverterUtils.collectAttributeNamesWithoutExprId(scan.outputAttributes()) - localFilesNode.setFileSchema(getFileSchema(scan.getDataSchema, names.asScala)) + localFilesNode.setFileSchema(getFileSchema(scan.getDataSchema, names.asScala.toSeq)) } } diff --git a/backends-clickhouse/src/main/scala/org/apache/gluten/backendsapi/clickhouse/CHListenerApi.scala b/backends-clickhouse/src/main/scala/org/apache/gluten/backendsapi/clickhouse/CHListenerApi.scala index 43e0627dffefe..0110d085b98c8 100644 --- a/backends-clickhouse/src/main/scala/org/apache/gluten/backendsapi/clickhouse/CHListenerApi.scala +++ b/backends-clickhouse/src/main/scala/org/apache/gluten/backendsapi/clickhouse/CHListenerApi.scala @@ -84,11 +84,11 @@ class CHListenerApi extends ListenerApi with Logging { s".max_bytes_before_external_sort" if (conf.getLong(externalSortKey, -1) < 0) { if (conf.getBoolean("spark.memory.offHeap.enabled", false)) { - val memSize = JavaUtils.byteStringAsBytes(conf.get("spark.memory.offHeap.size")).toInt - if (memSize > 0) { - val cores = conf.getInt("spark.executor.cores", 1) - val sortMemLimit = ((memSize / cores) * 0.8).toInt - logInfo(s"max memory for sorting: $sortMemLimit") + val memSize = JavaUtils.byteStringAsBytes(conf.get("spark.memory.offHeap.size")) + if (memSize > 0L) { + val cores = conf.getInt("spark.executor.cores", 1).toLong + val sortMemLimit = ((memSize / cores) * 0.8).toLong + logDebug(s"max memory for sorting: $sortMemLimit") conf.set(externalSortKey, sortMemLimit.toString) } } diff --git a/backends-clickhouse/src/main/scala/org/apache/gluten/backendsapi/clickhouse/CHMetricsApi.scala b/backends-clickhouse/src/main/scala/org/apache/gluten/backendsapi/clickhouse/CHMetricsApi.scala index a5fb4a1853e83..5465e9b60b672 100644 --- a/backends-clickhouse/src/main/scala/org/apache/gluten/backendsapi/clickhouse/CHMetricsApi.scala +++ b/backends-clickhouse/src/main/scala/org/apache/gluten/backendsapi/clickhouse/CHMetricsApi.scala @@ -348,16 +348,29 @@ class CHMetricsApi extends MetricsApi with Logging with LogLevelUtil { metrics: Map[String, SQLMetric]): MetricsUpdater = new HashJoinMetricsUpdater(metrics) override def genNestedLoopJoinTransformerMetrics( - sparkContext: SparkContext): Map[String, SQLMetric] = { - throw new UnsupportedOperationException( - s"NestedLoopJoinTransformer metrics update is not supported in CH backend") - } + sparkContext: SparkContext): Map[String, SQLMetric] = Map( + "numOutputRows" -> SQLMetrics.createMetric(sparkContext, "number of output rows"), + "outputVectors" -> SQLMetrics.createMetric(sparkContext, "number of output vectors"), + "outputBytes" -> SQLMetrics.createSizeMetric(sparkContext, "number of output bytes"), + "numInputRows" -> SQLMetrics.createMetric(sparkContext, "number of input rows"), + "inputBytes" -> SQLMetrics.createSizeMetric(sparkContext, "number of input bytes"), + "extraTime" -> SQLMetrics.createTimingMetric(sparkContext, "extra operators time"), + "inputWaitTime" -> SQLMetrics.createTimingMetric(sparkContext, "time of waiting for data"), + "outputWaitTime" -> SQLMetrics.createTimingMetric(sparkContext, "time of waiting for output"), + "postProjectTime" -> + SQLMetrics.createTimingMetric(sparkContext, "time of postProjection"), + "probeTime" -> + SQLMetrics.createTimingMetric(sparkContext, "time of probe"), + "totalTime" -> SQLMetrics.createTimingMetric(sparkContext, "time"), + "fillingRightJoinSideTime" -> SQLMetrics.createTimingMetric( + sparkContext, + "filling right join side time"), + "conditionTime" -> SQLMetrics.createTimingMetric(sparkContext, "join condition time") + ) override def genNestedLoopJoinTransformerMetricsUpdater( - metrics: Map[String, SQLMetric]): MetricsUpdater = { - throw new UnsupportedOperationException( - s"NestedLoopJoinTransformer metrics update is not supported in CH backend") - } + metrics: Map[String, SQLMetric]): MetricsUpdater = new BroadcastNestedLoopJoinMetricsUpdater( + metrics) override def genSampleTransformerMetrics(sparkContext: SparkContext): Map[String, SQLMetric] = { throw new UnsupportedOperationException( diff --git a/backends-clickhouse/src/main/scala/org/apache/gluten/backendsapi/clickhouse/CHSparkPlanExecApi.scala b/backends-clickhouse/src/main/scala/org/apache/gluten/backendsapi/clickhouse/CHSparkPlanExecApi.scala index ac3ea61ff8101..547458d8c2545 100644 --- a/backends-clickhouse/src/main/scala/org/apache/gluten/backendsapi/clickhouse/CHSparkPlanExecApi.scala +++ b/backends-clickhouse/src/main/scala/org/apache/gluten/backendsapi/clickhouse/CHSparkPlanExecApi.scala @@ -22,7 +22,7 @@ import org.apache.gluten.exception.GlutenNotSupportException import org.apache.gluten.execution._ import org.apache.gluten.expression._ import org.apache.gluten.extension.{CountDistinctWithoutExpand, FallbackBroadcastHashJoin, FallbackBroadcastHashJoinPrepQueryStage, RewriteToDateExpresstionRule} -import org.apache.gluten.extension.columnar.AddTransformHintRule +import org.apache.gluten.extension.columnar.AddFallbackTagRule import org.apache.gluten.extension.columnar.MiscColumnarRules.TransformPreOverrides import org.apache.gluten.extension.columnar.transition.Convention import org.apache.gluten.sql.shims.SparkShimLoader @@ -57,7 +57,7 @@ import org.apache.spark.sql.execution.joins.{BuildSideRelation, ClickHouseBuildS import org.apache.spark.sql.execution.metric.SQLMetric import org.apache.spark.sql.execution.utils.{CHExecUtil, PushDownUtil} import org.apache.spark.sql.extension.{CommonSubexpressionEliminateRule, RewriteDateTimestampComparisonRule} -import org.apache.spark.sql.types.StructType +import org.apache.spark.sql.types.{DecimalType, StructType} import org.apache.spark.sql.vectorized.ColumnarBatch import org.apache.commons.lang3.ClassUtils @@ -146,7 +146,7 @@ class CHSparkPlanExecApi extends SparkPlanExecApi { child match { case scan: FileSourceScanExec if (checkMergeTreeFileFormat(scan.relation)) => - // For the validation phase of the AddTransformHintRule + // For the validation phase of the AddFallbackTagRule CHFilterExecTransformer(condition, child) case scan: FileSourceScanExecTransformerBase if (checkMergeTreeFileFormat(scan.relation)) => // For the transform phase, the FileSourceScanExec is already transformed @@ -226,7 +226,7 @@ class CHSparkPlanExecApi extends SparkPlanExecApi { // FIXME: The operation happens inside ReplaceSingleNode(). // Caller may not know it adds project on top of the shuffle. val project = TransformPreOverrides().apply( - AddTransformHintRule().apply( + AddFallbackTagRule().apply( ProjectExec(plan.child.output ++ projectExpressions, plan.child))) var newExprs = Seq[Expression]() for (i <- exprs.indices) { @@ -251,7 +251,7 @@ class CHSparkPlanExecApi extends SparkPlanExecApi { // FIXME: The operation happens inside ReplaceSingleNode(). // Caller may not know it adds project on top of the shuffle. val project = TransformPreOverrides().apply( - AddTransformHintRule().apply( + AddFallbackTagRule().apply( ProjectExec(plan.child.output ++ projectExpressions, plan.child))) var newOrderings = Seq[SortOrder]() for (i <- orderings.indices) { @@ -373,8 +373,13 @@ class CHSparkPlanExecApi extends SparkPlanExecApi { buildSide: BuildSide, joinType: JoinType, condition: Option[Expression]): BroadcastNestedLoopJoinExecTransformer = - throw new GlutenNotSupportException( - "BroadcastNestedLoopJoinExecTransformer is not supported in ch backend.") + CHBroadcastNestedLoopJoinExecTransformer( + left, + right, + buildSide, + joinType, + condition + ) override def genSampleExecTransformer( lowerBound: Double, @@ -460,16 +465,23 @@ class CHSparkPlanExecApi extends SparkPlanExecApi { child: SparkPlan, numOutputRows: SQLMetric, dataSize: SQLMetric): BuildSideRelation = { - val hashedRelationBroadcastMode = mode.asInstanceOf[HashedRelationBroadcastMode] + + val buildKeys: Seq[Expression] = mode match { + case mode1: HashedRelationBroadcastMode => + mode1.key + case _ => + // IdentityBroadcastMode + Seq.empty + } + val (newChild, newOutput, newBuildKeys) = if ( - hashedRelationBroadcastMode.key + buildKeys .forall(k => k.isInstanceOf[AttributeReference] || k.isInstanceOf[BoundReference]) ) { (child, child.output, Seq.empty[Expression]) } else { // pre projection in case of expression join keys - val buildKeys = hashedRelationBroadcastMode.key val appendedProjections = new ArrayBuffer[NamedExpression]() val preProjectionBuildKeys = buildKeys.zipWithIndex.map { case (e, idx) => @@ -612,13 +624,6 @@ class CHSparkPlanExecApi extends SparkPlanExecApi { CHStringTranslateTransformer(substraitExprName, srcExpr, matchingExpr, replaceExpr, original) } - override def genSizeExpressionTransformer( - substraitExprName: String, - child: ExpressionTransformer, - original: Size): ExpressionTransformer = { - CHSizeExpressionTransformer(substraitExprName, child, original) - } - override def genLikeTransformer( substraitExprName: String, left: ExpressionTransformer, @@ -711,7 +716,7 @@ class CHSparkPlanExecApi extends SparkPlanExecApi { val columnName = s"${aliasExpr.name}_${aliasExpr.exprId.id}" val wExpression = aliasExpr.child.asInstanceOf[WindowExpression] wExpression.windowFunction match { - case wf @ (RowNumber() | Rank(_) | DenseRank(_) | CumeDist() | PercentRank(_)) => + case wf @ (RowNumber() | Rank(_) | DenseRank(_) | PercentRank(_)) => val aggWindowFunc = wf.asInstanceOf[AggregateWindowFunction] val frame = aggWindowFunc.frame.asInstanceOf[SpecifiedWindowFrame] val windowFunctionNode = ExpressionBuilder.makeWindowFunction( @@ -802,6 +807,22 @@ class CHSparkPlanExecApi extends SparkPlanExecApi { originalInputAttributes.asJava ) windowExpressionNodes.add(windowFunctionNode) + case wf @ NTile(buckets: Expression) => + val frame = wExpression.windowSpec.frameSpecification.asInstanceOf[SpecifiedWindowFrame] + val childrenNodeList = new JArrayList[ExpressionNode]() + val literal = buckets.asInstanceOf[Literal] + childrenNodeList.add(LiteralTransformer(literal).doTransform(args)) + val windowFunctionNode = ExpressionBuilder.makeWindowFunction( + WindowFunctionsBuilder.create(args, wf).toInt, + childrenNodeList, + columnName, + ConverterUtils.getTypeNode(wf.dataType, wf.nullable), + frame.upper, + frame.lower, + frame.frameType.sql, + originalInputAttributes.asJava + ) + windowExpressionNodes.add(windowFunctionNode) case _ => throw new GlutenNotSupportException( "unsupported window function type: " + @@ -849,7 +870,48 @@ class CHSparkPlanExecApi extends SparkPlanExecApi { CHGenerateExecTransformer(generator, requiredChildOutput, outer, generatorOutput, child) } + /** Transform array filter to Substrait. */ + override def genArrayFilterTransformer( + substraitExprName: String, + argument: ExpressionTransformer, + function: ExpressionTransformer, + expr: ArrayFilter): ExpressionTransformer = { + GenericExpressionTransformer(substraitExprName, Seq(argument, function), expr) + } + + /** Transform array transform to Substrait. */ + override def genArrayTransformTransformer( + substraitExprName: String, + argument: ExpressionTransformer, + function: ExpressionTransformer, + expr: ArrayTransform): ExpressionTransformer = { + GenericExpressionTransformer(substraitExprName, Seq(argument, function), expr) + } + + /** Transform array sort to Substrait. */ + override def genArraySortTransformer( + substraitExprName: String, + argument: ExpressionTransformer, + function: ExpressionTransformer, + expr: ArraySort): ExpressionTransformer = { + GenericExpressionTransformer(substraitExprName, Seq(argument, function), expr) + } + + override def genDateAddTransformer( + attributeSeq: Seq[Attribute], + substraitExprName: String, + children: Seq[Expression], + expr: Expression): ExpressionTransformer = { + DateAddTransformer(attributeSeq, substraitExprName, children, expr).doTransform() + } + override def genPreProjectForGenerate(generate: GenerateExec): SparkPlan = generate override def genPostProjectForGenerate(generate: GenerateExec): SparkPlan = generate + + override def genDecimalRoundExpressionOutput( + decimalType: DecimalType, + toScale: Int): DecimalType = { + SparkShimLoader.getSparkShims.genDecimalRoundExpressionOutput(decimalType, toScale) + } } diff --git a/backends-clickhouse/src/main/scala/org/apache/gluten/execution/CHBroadcastNestedLoopJoinExecTransformer.scala b/backends-clickhouse/src/main/scala/org/apache/gluten/execution/CHBroadcastNestedLoopJoinExecTransformer.scala new file mode 100644 index 0000000000000..9c0f41361f020 --- /dev/null +++ b/backends-clickhouse/src/main/scala/org/apache/gluten/execution/CHBroadcastNestedLoopJoinExecTransformer.scala @@ -0,0 +1,109 @@ +/* + * 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. + */ +package org.apache.gluten.execution + +import org.apache.gluten.backendsapi.BackendsApiManager +import org.apache.gluten.extension.ValidationResult + +import org.apache.spark.rdd.RDD +import org.apache.spark.rpc.GlutenDriverEndpoint +import org.apache.spark.sql.catalyst.expressions.Expression +import org.apache.spark.sql.catalyst.optimizer.BuildSide +import org.apache.spark.sql.catalyst.plans.{InnerLike, JoinType, LeftSemi} +import org.apache.spark.sql.execution.{SparkPlan, SQLExecution} +import org.apache.spark.sql.execution.joins.BuildSideRelation +import org.apache.spark.sql.vectorized.ColumnarBatch + +import com.google.protobuf.{Any, StringValue} + +case class CHBroadcastNestedLoopJoinExecTransformer( + left: SparkPlan, + right: SparkPlan, + buildSide: BuildSide, + joinType: JoinType, + condition: Option[Expression]) + extends BroadcastNestedLoopJoinExecTransformer( + left, + right, + buildSide, + joinType, + condition + ) { + + override def columnarInputRDDs: Seq[RDD[ColumnarBatch]] = { + val streamedRDD = getColumnarInputRDDs(streamedPlan) + val executionId = sparkContext.getLocalProperty(SQLExecution.EXECUTION_ID_KEY) + if (executionId != null) { + GlutenDriverEndpoint.collectResources(executionId, buildBroadcastTableId) + } else { + logWarning( + s"Can't not trace broadcast table data $buildBroadcastTableId" + + s" because execution id is null." + + s" Will clean up until expire time.") + } + val broadcast = buildPlan.executeBroadcast[BuildSideRelation]() + val context = + BroadCastHashJoinContext(Seq.empty, joinType, false, buildPlan.output, buildBroadcastTableId) + val broadcastRDD = CHBroadcastBuildSideRDD(sparkContext, broadcast, context) + streamedRDD :+ broadcastRDD + } + + override protected def withNewChildrenInternal( + newLeft: SparkPlan, + newRight: SparkPlan): CHBroadcastNestedLoopJoinExecTransformer = + copy(left = newLeft, right = newRight) + + def isMixedCondition(cond: Option[Expression]): Boolean = { + val res = if (cond.isDefined) { + val leftOutputSet = left.outputSet + val rightOutputSet = right.outputSet + val allReferences = cond.get.references + !(allReferences.subsetOf(leftOutputSet) || allReferences.subsetOf(rightOutputSet)) + } else { + false + } + res + } + + override def genJoinParameters(): Any = { + // for ch + val joinParametersStr = new StringBuffer("JoinParameters:") + joinParametersStr + .append("buildHashTableId=") + .append(buildBroadcastTableId) + .append("\n") + val message = StringValue + .newBuilder() + .setValue(joinParametersStr.toString) + .build() + BackendsApiManager.getTransformerApiInstance.packPBMessage(message) + } + + override def validateJoinTypeAndBuildSide(): ValidationResult = { + joinType match { + case _: InnerLike => + case _ => + if (joinType == LeftSemi || condition.isDefined) { + return ValidationResult.failed( + s"Broadcast Nested Loop join is not supported join type $joinType with conditions") + } + } + + ValidationResult.succeeded + } + +} diff --git a/backends-clickhouse/src/main/scala/org/apache/gluten/execution/CHGenerateExecTransformer.scala b/backends-clickhouse/src/main/scala/org/apache/gluten/execution/CHGenerateExecTransformer.scala index 733c0a472814d..44cb0deca5230 100644 --- a/backends-clickhouse/src/main/scala/org/apache/gluten/execution/CHGenerateExecTransformer.scala +++ b/backends-clickhouse/src/main/scala/org/apache/gluten/execution/CHGenerateExecTransformer.scala @@ -64,7 +64,7 @@ case class CHGenerateExecTransformer( override protected def doGeneratorValidate( generator: Generator, outer: Boolean): ValidationResult = - ValidationResult.ok + ValidationResult.succeeded override protected def getRelNode( context: SubstraitContext, diff --git a/backends-clickhouse/src/main/scala/org/apache/gluten/execution/CHHashJoinExecTransformer.scala b/backends-clickhouse/src/main/scala/org/apache/gluten/execution/CHHashJoinExecTransformer.scala index da9d9c7586c05..48870892d290e 100644 --- a/backends-clickhouse/src/main/scala/org/apache/gluten/execution/CHHashJoinExecTransformer.scala +++ b/backends-clickhouse/src/main/scala/org/apache/gluten/execution/CHHashJoinExecTransformer.scala @@ -60,7 +60,7 @@ case class CHShuffledHashJoinExecTransformer( right.outputSet, condition) if (shouldFallback) { - return ValidationResult.notOk("ch join validate fail") + return ValidationResult.failed("ch join validate fail") } super.doValidateInternal() } @@ -118,10 +118,10 @@ case class CHBroadcastHashJoinExecTransformer( condition) if (shouldFallback) { - return ValidationResult.notOk("ch join validate fail") + return ValidationResult.failed("ch join validate fail") } if (isNullAwareAntiJoin) { - return ValidationResult.notOk("ch does not support NAAJ") + return ValidationResult.failed("ch does not support NAAJ") } super.doValidateInternal() } diff --git a/backends-clickhouse/src/main/scala/org/apache/gluten/execution/CHSortMergeJoinExecTransformer.scala b/backends-clickhouse/src/main/scala/org/apache/gluten/execution/CHSortMergeJoinExecTransformer.scala index e2b5865517391..670fbed693003 100644 --- a/backends-clickhouse/src/main/scala/org/apache/gluten/execution/CHSortMergeJoinExecTransformer.scala +++ b/backends-clickhouse/src/main/scala/org/apache/gluten/execution/CHSortMergeJoinExecTransformer.scala @@ -50,7 +50,7 @@ case class CHSortMergeJoinExecTransformer( right.outputSet, condition) if (shouldFallback) { - return ValidationResult.notOk("ch join validate fail") + return ValidationResult.failed("ch join validate fail") } super.doValidateInternal() } diff --git a/backends-clickhouse/src/main/scala/org/apache/gluten/expression/CHExpressionTransformer.scala b/backends-clickhouse/src/main/scala/org/apache/gluten/expression/CHExpressionTransformer.scala index 5ca4e02339d0a..7b389ead0091b 100644 --- a/backends-clickhouse/src/main/scala/org/apache/gluten/expression/CHExpressionTransformer.scala +++ b/backends-clickhouse/src/main/scala/org/apache/gluten/expression/CHExpressionTransformer.scala @@ -30,16 +30,6 @@ import com.google.common.collect.Lists import java.util.Locale -case class CHSizeExpressionTransformer( - substraitExprName: String, - expr: ExpressionTransformer, - original: Size) - extends BinaryExpressionTransformer { - override def left: ExpressionTransformer = expr - // Pass legacyLiteral as second argument in substrait function - override def right: ExpressionTransformer = LiteralTransformer(original.legacySizeOfNull) -} - case class CHTruncTimestampTransformer( substraitExprName: String, format: ExpressionTransformer, diff --git a/backends-clickhouse/src/main/scala/org/apache/gluten/expression/DateAddTransformer.scala b/backends-clickhouse/src/main/scala/org/apache/gluten/expression/DateAddTransformer.scala new file mode 100644 index 0000000000000..6871849855a9e --- /dev/null +++ b/backends-clickhouse/src/main/scala/org/apache/gluten/expression/DateAddTransformer.scala @@ -0,0 +1,150 @@ +/* + * 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. + */ +package org.apache.gluten.expression + +import org.apache.spark.internal.Logging +import org.apache.spark.sql.catalyst.expressions._ +import org.apache.spark.sql.types._ +import org.apache.spark.unsafe.types.UTF8String + +case class DateAddTransformer( + attributeSeq: Seq[Attribute], + substraitExprName: String, + children: Seq[Expression], + expr: Expression) + extends Logging { + + def doTransform(): ExpressionTransformer = { + expr match { + case dateAdd: DateAdd => + doDateAddTransform() + case timeAdd: TimeAdd => + doTimeAddTransform() + case other => doDefaultTransorm() + } + } + + private def unwrapExtractANSIIntervalDays(extractExpr: Expression): Expression = { + extractExpr match { + case extractDays: ExtractANSIIntervalDays => + extractDays.child match { + case literal: Literal if literal.dataType.isInstanceOf[DayTimeIntervalType] => + val (intVal, unitVal) = parseDayIntervalType(literal) + if (unitVal.equals("DAY")) { + Literal(intVal, IntegerType) + } else { + null + } + case _ => null + } + case _ => null + } + } + + private def doDateAddTransform(): ExpressionTransformer = { + children(1) match { + case extractDays: ExtractANSIIntervalDays => + val daysLiteral = unwrapExtractANSIIntervalDays(children(1)) + if (daysLiteral != null) { + val daysExpr = LiteralTransformer(daysLiteral) + val dateExpr = + ExpressionConverter.replaceWithExpressionTransformer(children(0), attributeSeq) + GenericExpressionTransformer(substraitExprName, Seq(dateExpr, daysExpr), expr) + } else { + doDefaultTransorm() + } + case minus: UnaryMinus => + val child = minus.child match { + case extractDays: ExtractANSIIntervalDays => + unwrapExtractANSIIntervalDays(extractDays) + case e => e + } + if (child != null) { + val newMinus = minus.withNewChildren(Seq(child)) + val dateExpr = + ExpressionConverter.replaceWithExpressionTransformer(children(0), attributeSeq) + val minusExpr = + ExpressionConverter.replaceWithExpressionTransformer(newMinus, attributeSeq) + GenericExpressionTransformer(substraitExprName, Seq(dateExpr, minusExpr), expr) + } else { + doDefaultTransorm() + } + case _ => doDefaultTransorm() + } + } + + private def doTimeAddTransform(): ExpressionTransformer = { + children(1) match { + case literal: Literal if literal.dataType.isInstanceOf[DayTimeIntervalType] => + val (intVal, unitVal) = parseDayIntervalType(literal) + if (unitVal != null) { + val timeExpr = + ExpressionConverter.replaceWithExpressionTransformer(children(0), attributeSeq) + + val intExpr = Literal(intVal, IntegerType) + val unitExpr = Literal(UTF8String.fromString(unitVal), StringType) + val newExpr = expr.withNewChildren(Seq(unitExpr, intExpr)) + GenericExpressionTransformer( + substraitExprName, + Seq(LiteralTransformer(unitExpr), LiteralTransformer(intVal), timeExpr), + newExpr) + } else { + doDefaultTransorm() + } + case minus: UnaryMinus => + minus.child match { + case literal: Literal if literal.dataType.isInstanceOf[DayTimeIntervalType] => + val (intVal, unitVal) = parseDayIntervalType(literal) + if (unitVal != null) { + val intExpr = minus.withNewChildren(Seq(Literal(intVal, IntegerType))) + val unitExpr = Literal(UTF8String.fromString(unitVal), StringType) + val newExpr = expr.withNewChildren(Seq(unitExpr, intExpr)) + GenericExpressionTransformer( + substraitExprName, + Seq(LiteralTransformer(unitExpr), LiteralTransformer(intVal)), + newExpr) + } else { + doDefaultTransorm() + } + case _ => doDefaultTransorm() + } + case _ => doDefaultTransorm() + } + } + + private def doDefaultTransorm(): ExpressionTransformer = { + // transorm it in a generic way + val childrenTransformers = + children.map(ExpressionConverter.replaceWithExpressionTransformer(_, attributeSeq)) + GenericExpressionTransformer(substraitExprName, childrenTransformers, expr) + } + + private def parseDayIntervalType(literal: Literal): (Integer, String) = { + literal.dataType match { + case dayIntervalType: DayTimeIntervalType => + val intVal = literal.value.asInstanceOf[Long] + (dayIntervalType.startField, dayIntervalType.endField) match { + case (0, 0) => ((literal.value.asInstanceOf[Long] / 1000000 / 3600 / 24).toInt, "DAY") + case (1, 1) => ((literal.value.asInstanceOf[Long] / 1000000 / 3600).toInt, "HOUR") + case (2, 2) => ((literal.value.asInstanceOf[Long] / 1000000L / 60L).toInt, "MINUTE") + case (3, 3) => (literal.value.asInstanceOf[Long].toInt / 1000000, "SECOND") + case _ => (0, null) + } + case _ => (0, null) + } + } +} diff --git a/backends-clickhouse/src/main/scala/org/apache/gluten/extension/FallbackBroadcaseHashJoinRules.scala b/backends-clickhouse/src/main/scala/org/apache/gluten/extension/FallbackBroadcastHashJoinRules.scala similarity index 51% rename from backends-clickhouse/src/main/scala/org/apache/gluten/extension/FallbackBroadcaseHashJoinRules.scala rename to backends-clickhouse/src/main/scala/org/apache/gluten/extension/FallbackBroadcastHashJoinRules.scala index 873ecb8342a60..842dc76153f30 100644 --- a/backends-clickhouse/src/main/scala/org/apache/gluten/extension/FallbackBroadcaseHashJoinRules.scala +++ b/backends-clickhouse/src/main/scala/org/apache/gluten/extension/FallbackBroadcastHashJoinRules.scala @@ -19,7 +19,7 @@ package org.apache.gluten.extension import org.apache.gluten.GlutenConfig import org.apache.gluten.backendsapi.BackendsApiManager import org.apache.gluten.extension.columnar._ -import org.apache.gluten.extension.columnar.TransformHints.EncodeTransformableTagImplicits +import org.apache.gluten.extension.columnar.FallbackTags.EncodeFallbackTagImplicits import org.apache.gluten.utils.PhysicalPlanSelector import org.apache.spark.sql.SparkSession @@ -28,7 +28,7 @@ import org.apache.spark.sql.catalyst.rules.Rule import org.apache.spark.sql.execution.{ColumnarBroadcastExchangeExec, SparkPlan} import org.apache.spark.sql.execution.adaptive.BroadcastQueryStageExec import org.apache.spark.sql.execution.exchange.{BroadcastExchangeExec, BroadcastExchangeLike, ReusedExchangeExec} -import org.apache.spark.sql.execution.joins.BroadcastHashJoinExec +import org.apache.spark.sql.execution.joins.{BroadcastHashJoinExec, BroadcastNestedLoopJoinExec} import scala.util.control.Breaks.{break, breakable} @@ -57,12 +57,12 @@ case class FallbackBroadcastHashJoinPrepQueryStage(session: SparkSession) extend !columnarConf.enableColumnarBroadcastExchange || !columnarConf.enableColumnarBroadcastJoin ) { - ValidationResult.notOk( + ValidationResult.failed( "columnar broadcast exchange is disabled or " + "columnar broadcast join is disabled") } else { - if (TransformHints.isNotTransformable(bhj)) { - ValidationResult.notOk("broadcast join is already tagged as not transformable") + if (FallbackTags.nonEmpty(bhj)) { + ValidationResult.failed("broadcast join is already tagged as not transformable") } else { val bhjTransformer = BackendsApiManager.getSparkPlanExecApiInstance .genBroadcastHashJoinExecTransformer( @@ -75,7 +75,7 @@ case class FallbackBroadcastHashJoinPrepQueryStage(session: SparkSession) extend bhj.right, bhj.isNullAwareAntiJoin) val isBhjTransformable = bhjTransformer.doValidate() - if (isBhjTransformable.isValid) { + if (isBhjTransformable.ok()) { val exchangeTransformer = ColumnarBroadcastExchangeExec(mode, child) exchangeTransformer.doValidate() } else { @@ -83,16 +83,64 @@ case class FallbackBroadcastHashJoinPrepQueryStage(session: SparkSession) extend } } } - TransformHints.tagNotTransformable(bhj, isTransformable) - TransformHints.tagNotTransformable(exchange, isTransformable) + FallbackTags.add(bhj, isTransformable) + FallbackTags.add(exchange, isTransformable) case _ => // Skip. This might be the case that the exchange was already // executed in earlier stage } + case bnlj: BroadcastNestedLoopJoinExec => applyBNLJPrepQueryStage(bnlj) case _ => } plan } + + private def applyBNLJPrepQueryStage(bnlj: BroadcastNestedLoopJoinExec) = { + val buildSidePlan = bnlj.buildSide match { + case BuildLeft => bnlj.left + case BuildRight => bnlj.right + } + val maybeExchange = buildSidePlan.find { + case BroadcastExchangeExec(_, _) => true + case _ => false + } + maybeExchange match { + case Some(exchange @ BroadcastExchangeExec(mode, child)) => + val isTransformable = + if ( + !GlutenConfig.getConf.enableColumnarBroadcastExchange || + !GlutenConfig.getConf.enableColumnarBroadcastJoin + ) { + ValidationResult.failed( + "columnar broadcast exchange is disabled or " + + "columnar broadcast join is disabled") + } else { + if (FallbackTags.nonEmpty(bnlj)) { + ValidationResult.failed("broadcast join is already tagged as not transformable") + } else { + val transformer = BackendsApiManager.getSparkPlanExecApiInstance + .genBroadcastNestedLoopJoinExecTransformer( + bnlj.left, + bnlj.right, + bnlj.buildSide, + bnlj.joinType, + bnlj.condition) + val isTransformable = transformer.doValidate() + if (isTransformable.ok()) { + val exchangeTransformer = ColumnarBroadcastExchangeExec(mode, child) + exchangeTransformer.doValidate() + } else { + isTransformable + } + } + } + FallbackTags.add(bnlj, isTransformable) + FallbackTags.add(exchange, isTransformable) + case _ => + // Skip. This might be the case that the exchange was already + // executed in earlier stage + } + } } // For similar purpose with FallbackBroadcastHashJoinPrepQueryStage, executed during applying @@ -103,6 +151,10 @@ case class FallbackBroadcastHashJoin(session: SparkSession) extends Rule[SparkPl GlutenConfig.getConf.enableColumnarBroadcastJoin && GlutenConfig.getConf.enableColumnarBroadcastExchange + private val enableColumnarBroadcastNestedLoopJoin: Boolean = + GlutenConfig.getConf.broadcastNestedLoopJoinTransformerTransformerEnabled && + GlutenConfig.getConf.enableColumnarBroadcastExchange + override def apply(plan: SparkPlan): SparkPlan = { plan.foreachUp { p => @@ -116,7 +168,7 @@ case class FallbackBroadcastHashJoin(session: SparkSession) extends Rule[SparkPl // Currently their doBroadcast() methods just propagate child's broadcast // payloads which is not right in speaking of columnar. if (!enableColumnarBroadcastJoin) { - TransformHints.tagNotTransformable( + FallbackTags.add( bhj, "columnar BroadcastJoin is not enabled in BroadcastHashJoinExec") } else { @@ -138,68 +190,14 @@ case class FallbackBroadcastHashJoin(session: SparkSession) extends Rule[SparkPl case BuildRight => bhj.right } - val maybeExchange = buildSidePlan - .find { - case BroadcastExchangeExec(_, _) => true - case _ => false - } - .map(_.asInstanceOf[BroadcastExchangeExec]) - - maybeExchange match { - case Some(exchange @ BroadcastExchangeExec(mode, child)) => - isBhjTransformable.tagOnFallback(bhj) - if (!isBhjTransformable.isValid) { - TransformHints.tagNotTransformable(exchange, isBhjTransformable) - } - case None => - // we are in AQE, find the hidden exchange - // FIXME did we consider the case that AQE: OFF && Reuse: ON ? - var maybeHiddenExchange: Option[BroadcastExchangeLike] = None - breakable { - buildSidePlan.foreach { - case e: BroadcastExchangeLike => - maybeHiddenExchange = Some(e) - break - case t: BroadcastQueryStageExec => - t.plan.foreach { - case e2: BroadcastExchangeLike => - maybeHiddenExchange = Some(e2) - break - case r: ReusedExchangeExec => - r.child match { - case e2: BroadcastExchangeLike => - maybeHiddenExchange = Some(e2) - break - case _ => - } - case _ => - } - case _ => - } - } - // restriction to force the hidden exchange to be found - val exchange = maybeHiddenExchange.get - // to conform to the underlying exchange's type, columnar or vanilla - exchange match { - case BroadcastExchangeExec(mode, child) => - TransformHints.tagNotTransformable( - bhj, - "it's a materialized broadcast exchange or reused broadcast exchange") - case ColumnarBroadcastExchangeExec(mode, child) => - if (!isBhjTransformable.isValid) { - throw new IllegalStateException( - s"BroadcastExchange has already been" + - s" transformed to columnar version but BHJ is determined as" + - s" non-transformable: ${bhj.toString()}") - } - } - } + preTagBroadcastExchangeFallback(bhj, buildSidePlan, isBhjTransformable) } + case bnlj: BroadcastNestedLoopJoinExec => applyBNLJFallback(bnlj) case _ => } } catch { case e: UnsupportedOperationException => - TransformHints.tagNotTransformable( + FallbackTags.add( p, s"${e.getMessage}, original Spark plan is " + s"${p.getClass}(${p.children.toList.map(_.getClass)})") @@ -207,4 +205,88 @@ case class FallbackBroadcastHashJoin(session: SparkSession) extends Rule[SparkPl } plan } + + private def applyBNLJFallback(bnlj: BroadcastNestedLoopJoinExec) = { + if (!enableColumnarBroadcastNestedLoopJoin) { + FallbackTags.add(bnlj, "columnar BroadcastJoin is not enabled in BroadcastNestedLoopJoinExec") + } + + val transformer = BackendsApiManager.getSparkPlanExecApiInstance + .genBroadcastNestedLoopJoinExecTransformer( + bnlj.left, + bnlj.right, + bnlj.buildSide, + bnlj.joinType, + bnlj.condition) + + val isBNLJTransformable = transformer.doValidate() + val buildSidePlan = bnlj.buildSide match { + case BuildLeft => bnlj.left + case BuildRight => bnlj.right + } + + preTagBroadcastExchangeFallback(bnlj, buildSidePlan, isBNLJTransformable) + } + + private def preTagBroadcastExchangeFallback( + plan: SparkPlan, + buildSidePlan: SparkPlan, + isTransformable: ValidationResult): Unit = { + val maybeExchange = buildSidePlan + .find { + case BroadcastExchangeExec(_, _) => true + case _ => false + } + .map(_.asInstanceOf[BroadcastExchangeExec]) + + maybeExchange match { + case Some(exchange @ BroadcastExchangeExec(_, _)) => + isTransformable.tagOnFallback(plan) + if (!isTransformable.ok) { + FallbackTags.add(exchange, isTransformable) + } + case None => + // we are in AQE, find the hidden exchange + // FIXME did we consider the case that AQE: OFF && Reuse: ON ? + var maybeHiddenExchange: Option[BroadcastExchangeLike] = None + breakable { + buildSidePlan.foreach { + case e: BroadcastExchangeLike => + maybeHiddenExchange = Some(e) + break + case t: BroadcastQueryStageExec => + t.plan.foreach { + case e2: BroadcastExchangeLike => + maybeHiddenExchange = Some(e2) + break + case r: ReusedExchangeExec => + r.child match { + case e2: BroadcastExchangeLike => + maybeHiddenExchange = Some(e2) + break + case _ => + } + case _ => + } + case _ => + } + } + // restriction to force the hidden exchange to be found + val exchange = maybeHiddenExchange.get + // to conform to the underlying exchange's type, columnar or vanilla + exchange match { + case BroadcastExchangeExec(mode, child) => + FallbackTags.add( + plan, + "it's a materialized broadcast exchange or reused broadcast exchange") + case ColumnarBroadcastExchangeExec(mode, child) => + if (!isTransformable.ok) { + throw new IllegalStateException( + s"BroadcastExchange has already been" + + s" transformed to columnar version but BHJ is determined as" + + s" non-transformable: ${plan.toString()}") + } + } + } + } } diff --git a/backends-clickhouse/src/main/scala/org/apache/gluten/metrics/BroadcastNestedLoopJoinMetricsUpdater.scala b/backends-clickhouse/src/main/scala/org/apache/gluten/metrics/BroadcastNestedLoopJoinMetricsUpdater.scala new file mode 100644 index 0000000000000..b1414bf9727ce --- /dev/null +++ b/backends-clickhouse/src/main/scala/org/apache/gluten/metrics/BroadcastNestedLoopJoinMetricsUpdater.scala @@ -0,0 +1,107 @@ +/* + * 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. + */ +package org.apache.gluten.metrics + +import org.apache.spark.internal.Logging +import org.apache.spark.sql.execution.metric.SQLMetric + +class BroadcastNestedLoopJoinMetricsUpdater(val metrics: Map[String, SQLMetric]) + extends MetricsUpdater + with Logging { + + override def updateNativeMetrics(opMetrics: IOperatorMetrics): Unit = { + try { + if (opMetrics != null) { + val operatorMetrics = opMetrics.asInstanceOf[OperatorMetrics] + if (!operatorMetrics.metricsList.isEmpty && operatorMetrics.joinParams != null) { + val joinParams = operatorMetrics.joinParams + var currentIdx = operatorMetrics.metricsList.size() - 1 + var totalTime = 0L + + // update fillingRightJoinSideTime + MetricsUtil + .getAllProcessorList(operatorMetrics.metricsList.get(currentIdx)) + .foreach( + processor => { + if (processor.name.equalsIgnoreCase("FillingRightJoinSide")) { + metrics("fillingRightJoinSideTime") += (processor.time / 1000L).toLong + } + }) + + // joining + val joinMetricsData = operatorMetrics.metricsList.get(currentIdx) + metrics("outputVectors") += joinMetricsData.outputVectors + metrics("inputWaitTime") += (joinMetricsData.inputWaitTime / 1000L).toLong + metrics("outputWaitTime") += (joinMetricsData.outputWaitTime / 1000L).toLong + totalTime += joinMetricsData.time + + MetricsUtil + .getAllProcessorList(joinMetricsData) + .foreach( + processor => { + if (processor.name.equalsIgnoreCase("FillingRightJoinSide")) { + metrics("fillingRightJoinSideTime") += (processor.time / 1000L).toLong + } + if (processor.name.equalsIgnoreCase("FilterTransform")) { + metrics("conditionTime") += (processor.time / 1000L).toLong + metrics("numOutputRows") += processor.outputRows - processor.inputRows + metrics("outputBytes") += processor.outputBytes - processor.inputBytes + } + if (processor.name.equalsIgnoreCase("JoiningTransform")) { + metrics("probeTime") += (processor.time / 1000L).toLong + } + if ( + !BroadcastNestedLoopJoinMetricsUpdater.INCLUDING_PROCESSORS.contains( + processor.name) + ) { + metrics("extraTime") += (processor.time / 1000L).toLong + } + if ( + BroadcastNestedLoopJoinMetricsUpdater.CH_PLAN_NODE_NAME.contains(processor.name) + ) { + metrics("numOutputRows") += processor.outputRows + metrics("outputBytes") += processor.outputBytes + metrics("numInputRows") += processor.inputRows + metrics("inputBytes") += processor.inputBytes + } + }) + + currentIdx -= 1 + + // post projection + if (joinParams.postProjectionNeeded) { + metrics("postProjectTime") += + (operatorMetrics.metricsList.get(currentIdx).time / 1000L).toLong + metrics("outputVectors") += operatorMetrics.metricsList.get(currentIdx).outputVectors + totalTime += operatorMetrics.metricsList.get(currentIdx).time + currentIdx -= 1 + } + metrics("totalTime") += (totalTime / 1000L).toLong + } + } + } catch { + case e: Exception => + logError(s"Updating native metrics failed due to ${e.getCause}.") + throw e + } + } +} + +object BroadcastNestedLoopJoinMetricsUpdater { + val INCLUDING_PROCESSORS = Array("JoiningTransform", "FillingRightJoinSide", "FilterTransform") + val CH_PLAN_NODE_NAME = Array("JoiningTransform") +} diff --git a/backends-clickhouse/src/main/scala/org/apache/gluten/metrics/MetricsUtil.scala b/backends-clickhouse/src/main/scala/org/apache/gluten/metrics/MetricsUtil.scala index 1376dc6a82d1d..e1e0f7c11a09a 100644 --- a/backends-clickhouse/src/main/scala/org/apache/gluten/metrics/MetricsUtil.scala +++ b/backends-clickhouse/src/main/scala/org/apache/gluten/metrics/MetricsUtil.scala @@ -177,10 +177,12 @@ object MetricsUtil extends Logging { /** Get all processors */ def getAllProcessorList(metricData: MetricsData): Seq[MetricsProcessor] = { - metricData.steps.asScala.flatMap( - step => { - step.processors.asScala - }) + metricData.steps.asScala + .flatMap( + step => { + step.processors.asScala + }) + .toSeq } /** Update extra time metric by the processors */ diff --git a/backends-clickhouse/src/main/scala/org/apache/gluten/utils/CHExpressionUtil.scala b/backends-clickhouse/src/main/scala/org/apache/gluten/utils/CHExpressionUtil.scala index 14f0ff4891884..d65de1cea151d 100644 --- a/backends-clickhouse/src/main/scala/org/apache/gluten/utils/CHExpressionUtil.scala +++ b/backends-clickhouse/src/main/scala/org/apache/gluten/utils/CHExpressionUtil.scala @@ -159,6 +159,13 @@ case class EncodeDecodeValidator() extends FunctionValidator { } } +case class ArrayJoinValidator() extends FunctionValidator { + override def doValidate(expr: Expression): Boolean = expr match { + case t: ArrayJoin => !t.children.head.isInstanceOf[Literal] + case _ => true + } +} + object CHExpressionUtil { final val CH_AGGREGATE_FUNC_BLACKLIST: Map[String, FunctionValidator] = Map( @@ -167,7 +174,7 @@ object CHExpressionUtil { ) final val CH_BLACKLIST_SCALAR_FUNCTION: Map[String, FunctionValidator] = Map( - ARRAY_JOIN -> DefaultValidator(), + ARRAY_JOIN -> ArrayJoinValidator(), SPLIT_PART -> DefaultValidator(), TO_UNIX_TIMESTAMP -> UnixTimeStampValidator(), UNIX_TIMESTAMP -> UnixTimeStampValidator(), @@ -208,6 +215,9 @@ object CHExpressionUtil { UNIX_MICROS -> DefaultValidator(), TIMESTAMP_MILLIS -> DefaultValidator(), TIMESTAMP_MICROS -> DefaultValidator(), - STACK -> DefaultValidator() + STACK -> DefaultValidator(), + TRANSFORM_KEYS -> DefaultValidator(), + TRANSFORM_VALUES -> DefaultValidator(), + RAISE_ERROR -> DefaultValidator() ) } diff --git a/backends-clickhouse/src/main/scala/org/apache/spark/shuffle/utils/RangePartitionerBoundsGenerator.scala b/backends-clickhouse/src/main/scala/org/apache/spark/shuffle/utils/RangePartitionerBoundsGenerator.scala index 61fbc86b36cc9..87c6ae343d4c1 100644 --- a/backends-clickhouse/src/main/scala/org/apache/spark/shuffle/utils/RangePartitionerBoundsGenerator.scala +++ b/backends-clickhouse/src/main/scala/org/apache/spark/shuffle/utils/RangePartitionerBoundsGenerator.scala @@ -199,6 +199,7 @@ class RangePartitionerBoundsGenerator[K: Ordering: ClassTag, V]( case d: DecimalType => val decimal = row.getDecimal(i, d.precision, d.scale).toString() node.put("value", decimal) + case _: TimestampType => node.put("value", row.getLong(i)) case _ => throw new IllegalArgumentException( s"Unsupported data type ${ordering.dataType.toString}") @@ -244,6 +245,7 @@ object RangePartitionerBoundsGenerator { case _: StringType => true case _: DateType => true case _: DecimalType => true + case _: TimestampType => true case _ => false } } diff --git a/backends-clickhouse/src/main/scala/org/apache/spark/sql/execution/CHColumnarToRowExec.scala b/backends-clickhouse/src/main/scala/org/apache/spark/sql/execution/CHColumnarToRowExec.scala index 522c7d68fa68b..29fa0d0aba960 100644 --- a/backends-clickhouse/src/main/scala/org/apache/spark/sql/execution/CHColumnarToRowExec.scala +++ b/backends-clickhouse/src/main/scala/org/apache/spark/sql/execution/CHColumnarToRowExec.scala @@ -58,7 +58,7 @@ case class CHColumnarToRowExec(child: SparkPlan) extends ColumnarToRowExecBase(c s"${field.dataType} is not supported in ColumnarToRowExecBase.") } } - ValidationResult.ok + ValidationResult.succeeded } override def doExecuteInternal(): RDD[InternalRow] = { diff --git a/backends-clickhouse/src/main/scala/org/apache/spark/sql/execution/datasources/utils/MergeTreePartsPartitionsUtil.scala b/backends-clickhouse/src/main/scala/org/apache/spark/sql/execution/datasources/utils/MergeTreePartsPartitionsUtil.scala index 80257c3b5e640..228dc9feb377d 100644 --- a/backends-clickhouse/src/main/scala/org/apache/spark/sql/execution/datasources/utils/MergeTreePartsPartitionsUtil.scala +++ b/backends-clickhouse/src/main/scala/org/apache/spark/sql/execution/datasources/utils/MergeTreePartsPartitionsUtil.scala @@ -127,7 +127,7 @@ object MergeTreePartsPartitionsUtil extends Logging { sparkSession ) } - partitions + partitions.toSeq } def genInputPartitionSeq( @@ -231,6 +231,7 @@ object MergeTreePartsPartitionsUtil extends Logging { size * part.size / part.marks) } } + .sortBy(_.bytesOnDisk)(implicitly[Ordering[Long]].reverse) var currentSize = 0L val currentFiles = new ArrayBuffer[MergeTreePartSplit] diff --git a/backends-clickhouse/src/main/scala/org/apache/spark/sql/execution/datasources/v1/clickhouse/MergeTreeFileFormatDataWriter.scala b/backends-clickhouse/src/main/scala/org/apache/spark/sql/execution/datasources/v1/clickhouse/MergeTreeFileFormatDataWriter.scala index 3a68ac16df80d..712afb3788d10 100644 --- a/backends-clickhouse/src/main/scala/org/apache/spark/sql/execution/datasources/v1/clickhouse/MergeTreeFileFormatDataWriter.scala +++ b/backends-clickhouse/src/main/scala/org/apache/spark/sql/execution/datasources/v1/clickhouse/MergeTreeFileFormatDataWriter.scala @@ -117,10 +117,12 @@ abstract class MergeTreeFileFormatDataWriter( releaseResources() val (taskCommitMessage, taskCommitTime) = Utils.timeTakenMs { // committer.commitTask(taskAttemptContext) - val statuses = returnedMetrics.map( - v => { - v._2 - }) + val statuses = returnedMetrics + .map( + v => { + v._2 + }) + .toSeq new TaskCommitMessage(statuses) } diff --git a/backends-clickhouse/src/main/scala/org/apache/spark/sql/execution/datasources/v2/clickhouse/metadata/AddFileTags.scala b/backends-clickhouse/src/main/scala/org/apache/spark/sql/execution/datasources/v2/clickhouse/metadata/AddFileTags.scala index 0680663eb553e..8acc23aec2070 100644 --- a/backends-clickhouse/src/main/scala/org/apache/spark/sql/execution/datasources/v2/clickhouse/metadata/AddFileTags.scala +++ b/backends-clickhouse/src/main/scala/org/apache/spark/sql/execution/datasources/v2/clickhouse/metadata/AddFileTags.scala @@ -144,7 +144,15 @@ object AddFileTags { "dirName" -> dirName, "marks" -> marks.toString ) - AddFile(name, partitionValues, bytesOnDisk, modificationTime, dataChange, stats, tags) + val mapper: ObjectMapper = new ObjectMapper() + val rootNode = mapper.createObjectNode() + rootNode.put("numRecords", rows) + rootNode.put("minValues", "") + rootNode.put("maxValues", "") + rootNode.put("nullCount", "") + // Add the `stats` into delta meta log + val metricsStats = mapper.writeValueAsString(rootNode) + AddFile(name, partitionValues, bytesOnDisk, modificationTime, dataChange, metricsStats, tags) } def addFileToAddMergeTreeParts(addFile: AddFile): AddMergeTreeParts = { diff --git a/backends-clickhouse/src/test/resources/text-data/json-settings/data.txt b/backends-clickhouse/src/test/resources/text-data/json-settings/data.txt index 0541ce3469a71..230b46ec38038 100644 --- a/backends-clickhouse/src/test/resources/text-data/json-settings/data.txt +++ b/backends-clickhouse/src/test/resources/text-data/json-settings/data.txt @@ -1,4 +1,5 @@ {"a":1,"b":2,"c":3} +{"a":"a5", "B":"b6", "c":7} {"a":"4"} {"t":{"ta":"cc","tb":100,"tc":1.234}} {"t":{"ta":"cc","tb":100,"td":"ignore"}} diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q1.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q1.out new file mode 100644 index 0000000000000..651dd15cc4162 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q1.out @@ -0,0 +1,100 @@ +AAAAAAAAAAADBAAA +AAAAAAAAAAAEBAAA +AAAAAAAAAAAFAAAA +AAAAAAAAAAAHBAAA +AAAAAAAAAAAHBAAA +AAAAAAAAAAAJAAAA +AAAAAAAAAAAMAAAA +AAAAAAAAAAAOAAAA +AAAAAAAAAAAOAAAA +AAAAAAAAAABCBAAA +AAAAAAAAAABFAAAA +AAAAAAAAAABHBAAA +AAAAAAAAAABHBAAA +AAAAAAAAAABIBAAA +AAAAAAAAAABLAAAA +AAAAAAAAAABOAAAA +AAAAAAAAAABPAAAA +AAAAAAAAAACBAAAA +AAAAAAAAAACGBAAA +AAAAAAAAAADMAAAA +AAAAAAAAAAEABAAA +AAAAAAAAAAEABAAA +AAAAAAAAAAEEBAAA +AAAAAAAAAAEJAAAA +AAAAAAAAAAELAAAA +AAAAAAAAAAFCBAAA +AAAAAAAAAAFCBAAA +AAAAAAAAAAFEAAAA +AAAAAAAAAAFEBAAA +AAAAAAAAAAFGAAAA +AAAAAAAAAAFGBAAA +AAAAAAAAAAFGBAAA +AAAAAAAAAAFLAAAA +AAAAAAAAAAFPAAAA +AAAAAAAAAAGEAAAA +AAAAAAAAAAGHAAAA +AAAAAAAAAAGHAAAA +AAAAAAAAAAGIBAAA +AAAAAAAAAAHABAAA +AAAAAAAAAAHABAAA +AAAAAAAAAAHCAAAA +AAAAAAAAAAHGBAAA +AAAAAAAAAAHHAAAA +AAAAAAAAAAHPAAAA +AAAAAAAAAAHPAAAA +AAAAAAAAAAIEBAAA +AAAAAAAAAAJAAAAA +AAAAAAAAAAJABAAA +AAAAAAAAAAJEAAAA +AAAAAAAAAAJEAAAA +AAAAAAAAAAJEBAAA +AAAAAAAAAAJEBAAA +AAAAAAAAAAJGAAAA +AAAAAAAAAAJMAAAA +AAAAAAAAAAJPAAAA +AAAAAAAAAAJPAAAA +AAAAAAAAAAKEAAAA +AAAAAAAAAAKGBAAA +AAAAAAAAAAKLAAAA +AAAAAAAAAAKPAAAA +AAAAAAAAAALCAAAA +AAAAAAAAAALFBAAA +AAAAAAAAAALGBAAA +AAAAAAAAAALHBAAA +AAAAAAAAAALJAAAA +AAAAAAAAAAMAAAAA +AAAAAAAAAAMABAAA +AAAAAAAAAAMDAAAA +AAAAAAAAAAMHAAAA +AAAAAAAAAAMHBAAA +AAAAAAAAAAMMAAAA +AAAAAAAAAAMPAAAA +AAAAAAAAAANHAAAA +AAAAAAAAAANHBAAA +AAAAAAAAAAOHBAAA +AAAAAAAAAAPDAAAA +AAAAAAAAAAPDAAAA +AAAAAAAAAAPDBAAA +AAAAAAAAAAPDBAAA +AAAAAAAAAAPLAAAA +AAAAAAAAAAPOAAAA +AAAAAAAAAAPPAAAA +AAAAAAAAABAFBAAA +AAAAAAAAABANAAAA +AAAAAAAAABBAAAAA +AAAAAAAAABBGAAAA +AAAAAAAAABBLAAAA +AAAAAAAAABBOAAAA +AAAAAAAAABCAAAAA +AAAAAAAAABCCBAAA +AAAAAAAAABCDAAAA +AAAAAAAAABCIAAAA +AAAAAAAAABCIAAAA +AAAAAAAAABDBAAAA +AAAAAAAAABDEBAAA +AAAAAAAAABDEBAAA +AAAAAAAAABDEBAAA +AAAAAAAAABDFBAAA +AAAAAAAAABDGBAAA +AAAAAAAAABDLAAAA diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q10.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q10.out new file mode 100644 index 0000000000000..e026beadd4e15 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q10.out @@ -0,0 +1,4 @@ +F|-|S|-|Advanced Degree|-|1|-|4500|-|1|-|High Risk|-|1|-|2|-|1|-|0|-|1|-|0|-|1 +M|-|D|-|Unknown|-|1|-|5000|-|1|-|Unknown|-|1|-|5|-|1|-|4|-|1|-|6|-|1 +M|-|M|-|2 yr Degree|-|1|-|2500|-|1|-|Unknown|-|1|-|2|-|1|-|0|-|1|-|4|-|1 +M|-|W|-|Primary|-|1|-|2000|-|1|-|Low Risk|-|1|-|2|-|1|-|3|-|1|-|4|-|1 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q11.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q11.out new file mode 100644 index 0000000000000..6383a6f9e0b62 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q11.out @@ -0,0 +1,94 @@ +AAAAAAAAAAECBAAA|-|Frank|-|Wenzel|-|Frank.Wenzel@zhXN6.com +AAAAAAAAABGKAAAA|-|Jonna|-|King|-|Jonna.King@aFu3Mu88XNgLh7lzUbBd.com +AAAAAAAAAFAGAAAA|-|Robert|-|Chang|-|Robert.Chang@q5SPPnTKPgA2siE.org +AAAAAAAAAFBNAAAA|-|Robert|-|Baines|-|Robert.Baines@FI8euotCCfA0dfsoy.com +AAAAAAAAAGLPAAAA|-|Charlene|-|Marcus|-|Charlene.Marcus@XYRXjq9m6.com +AAAAAAAABAAGAAAA|-|Luis|-|James|-|Luis.James@oLxkv69Mc9.edu +AAAAAAAABBEAAAAA|-|Jason|-|Gallegos|-|Jason.Gallegos@sg0JhLIArOU5lOS.org +AAAAAAAABGMHBAAA|-|Michael|-|Gillespie|-|Michael.Gillespie@J63SDK8lTkTx.edu +AAAAAAAABIABAAAA|-|Letha|-|Stone|-|Letha.Stone@BkqMc.com +AAAAAAAABILCAAAA|-|Theresa|-|Mullins|-|Theresa.Mullins@96UTbTai7sO.org +AAAAAAAABJEDBAAA|-|Arthur|-|Bryan|-|Arthur.Bryan@ZvCpRQMEbZYcg.org +AAAAAAAABKDKAAAA|-|Gerald|-|Ruiz|-|Gerald.Ruiz@kHcL2q.com +AAAAAAAACEMIAAAA|-|James|-|Hernandez|-|James.Hernandez@gj0dkjapodlS.com +AAAAAAAACGLDAAAA|-|Angelo|-|Sloan|-|Angelo.Sloan@dabad6klflJ.edu +AAAAAAAACKKIAAAA|-|null|-|null|-|Lorraine.Miller@31f.edu +AAAAAAAACOEHBAAA|-|Christine|-|Gonzalez|-|Christine.Gonzalez@oHMdrqfEDX.org +AAAAAAAACPDFBAAA|-|Cheryl|-|Barry|-|Cheryl.Barry@b4id7Q6XJNsB.edu +AAAAAAAADFJBBAAA|-|Patrick|-|Jones|-|Patrick.Jones@L0aUVXsdRxldn.com +AAAAAAAADHNHBAAA|-|Patrick|-|Cooper|-|Patrick.Cooper@2kXFgCYx14V.edu +AAAAAAAADKMBAAAA|-|Donald|-|Nelson|-|Donald.Nelson@b6TdhXbAelMn8oF.edu +AAAAAAAAEBFHAAAA|-|Esther|-|Merrill|-|Esther.Merrill@hGu.edu +AAAAAAAAEBJNAAAA|-|Alfred|-|Glenn|-|Alfred.Glenn@xCi0.edu +AAAAAAAAEFCEBAAA|-|Cornelius|-|Martino|-|Cornelius.Martino@In2KFInUjUY.com +AAAAAAAAEIAHAAAA|-|Henry|-|Desantis|-|Henry.Desantis@znTqdvjJGag4.edu +AAAAAAAAEIPIAAAA|-|Luke|-|Rios|-|Luke.Rios@NgqF4xn2Qxgm00FR0.com +AAAAAAAAFAIEAAAA|-|Betty|-|Gipson|-|Betty.Gipson@13Lp7iesLn.com +AAAAAAAAFDIMAAAA|-|Stephanie|-|Cowan|-|Stephanie.Cowan@R80Njmu1D1n0d.com +AAAAAAAAFGMHBAAA|-|Donald|-|Coleman|-|Donald.Coleman@S4KL45.org +AAAAAAAAFGNEAAAA|-|Andrew|-|Silva|-|Andrew.Silva@hx4.edu +AAAAAAAAFHNDAAAA|-|Virgil|-|Mcdonald|-|Virgil.Mcdonald@dUD.org +AAAAAAAAFMOKAAAA|-|Harry|-|Brown|-|Harry.Brown@Clj2rtJAo.com +AAAAAAAAFMPPAAAA|-|Manuel|-|Bryant|-|Manuel.Bryant@1LtMa1H0t8B5.edu +AAAAAAAAFOEDAAAA|-|Lori|-|Erwin|-|Lori.Erwin@SkmpHUaEnhHBkQ.com +AAAAAAAAGCGIAAAA|-|Mae|-|Williams|-|Mae.Williams@mfBvsN8VAQOX21Yh.org +AAAAAAAAGEKLAAAA|-|Jerilyn|-|Walker|-|Jerilyn.Walker@hOIXjGj8unTzQ5J3Um.edu +AAAAAAAAGGMHAAAA|-|Julia|-|Fisher|-|Julia.Fisher@eyrOB7M7abp.org +AAAAAAAAGHFDAAAA|-|Laura|-|Roy|-|Laura.Roy@xb1d3mQ2.org +AAAAAAAAGLDMAAAA|-|Alex|-|Norris|-|Alex.Norris@GABnCVFfjXxUV2Q.edu +AAAAAAAAGMFHAAAA|-|Bruce|-|Howe|-|Bruce.Howe@yNj94o0DBJ.com +AAAAAAAAGMGEBAAA|-|Tamika|-|Potts|-|Tamika.Potts@yzUu.edu +AAAAAAAAHBEABAAA|-|Bonnie|-|Cochran|-|Bonnie.Cochran@D3oggm81Joopv.com +AAAAAAAAHEIFBAAA|-|null|-|Jones|-|Ann.Jones@E1eNB.edu +AAAAAAAAHEPFBAAA|-|Kathryn|-|Kinney|-|Kathryn.Kinney@Stq02g.com +AAAAAAAAHGKLAAAA|-|Arthur|-|Christensen|-|Arthur.Christensen@VFNBhqKt1TAdrr.edu +AAAAAAAAHIEIAAAA|-|William|-|Roberts|-|William.Roberts@ObeXEfeXMMgm.org +AAAAAAAAHLEAAAAA|-|Geneva|-|Sims|-|Geneva.Sims@1E0ayoK5qFo.edu +AAAAAAAAHLJCAAAA|-|Marlene|-|Grover|-|Marlene.Grover@F9DZzXQsJNYJ.org +AAAAAAAAHPMLAAAA|-|Elizabeth|-|Kennedy|-|Elizabeth.Kennedy@A0YBfGbsbmc3om.edu +AAAAAAAAIANDAAAA|-|Elva|-|Wade|-|Elva.Wade@4xZ1agk4PU9.edu +AAAAAAAAIBBFBAAA|-|James|-|Compton|-|James.Compton@KzmxhGNiTqrp.com +AAAAAAAAIBJDBAAA|-|Dean|-|Velez|-|Dean.Velez@ycRqZT5hVfX8ZZk.org +AAAAAAAAILLJAAAA|-|Billy|-|Ortiz|-|Billy.Ortiz@AEcBAd1rTF.org +AAAAAAAAIODCBAAA|-|Jennifer|-|Crane|-|Jennifer.Crane@Sbzbbg2f7tIl32aDBj.org +AAAAAAAAIPGJAAAA|-|Michael|-|null|-|Michael.Connelly@K.edu +AAAAAAAAIPKJAAAA|-|Charles|-|Jones|-|Charles.Jones@aZTRs91tA.org +AAAAAAAAJADIAAAA|-|Margaret|-|Roberts|-|Margaret.Roberts@jp.edu +AAAAAAAAJBELAAAA|-|Sean|-|Busby|-|Sean.Busby@HlbL26U77.edu +AAAAAAAAJCNBBAAA|-|Johnnie|-|Cox|-|Johnnie.Cox@nNTlnRXjr5.edu +AAAAAAAAJDEFAAAA|-|Loretta|-|Serrano|-|Loretta.Serrano@GYZpg38p40VgqS7L9.edu +AAAAAAAAJDKKAAAA|-|Sharon|-|Reynolds|-|Sharon.Reynolds@tk5.org +AAAAAAAAJEDJAAAA|-|David|-|Taylor|-|David.Taylor@kxn8ngym6u9XoC.org +AAAAAAAAJGDLAAAA|-|Fredrick|-|Davis|-|Fredrick.Davis@fBIx4ZgRJ2.org +AAAAAAAAJHGFAAAA|-|Pamela|-|Gannon|-|Pamela.Gannon@dx1Vy6KLG.org +AAAAAAAAJIAHAAAA|-|Shawna|-|Delgado|-|Shawna.Delgado@Mu5QaTkI2N4tdINV.org +AAAAAAAAJILDBAAA|-|Erica|-|Reynolds|-|Erica.Reynolds@NjAGMPr5SynCgvs.org +AAAAAAAAJMIDAAAA|-|Sally|-|Thurman|-|Sally.Thurman@xTyyZ3qRIlqa8oBLYTNm.org +AAAAAAAAKAKPAAAA|-|Carolann|-|Royer|-|Carolann.Royer@yVh8tzAJmV.com +AAAAAAAAKLHDAAAA|-|Brittany|-|Knox|-|Brittany.Knox@ldm93PY1oSCUpHZQfy.org +AAAAAAAAKMHPAAAA|-|Robert|-|Jones|-|Robert.Jones@rYXHiKMN4A.org +AAAAAAAAKNMEBAAA|-|Amber|-|Gonzalez|-|Amber.Gonzalez@Va5m6mBBm.edu +AAAAAAAALEAHBAAA|-|Eddie|-|Pena|-|Eddie.Pena@2L00HyEmYqdOy.org +AAAAAAAALMAJAAAA|-|Ileen|-|Linn|-|Ileen.Linn@5FUTo7S.org +AAAAAAAALMGGBAAA|-|Dedra|-|Rainey|-|Dedra.Rainey@ik6CKcRSdO6GBi.edu +AAAAAAAALNLABAAA|-|Janie|-|Garcia|-|Janie.Garcia@IpXCI4cANG0F1M.org +AAAAAAAALPHGBAAA|-|Dorothy|-|Heller|-|Dorothy.Heller@dXV5.edu +AAAAAAAAMFMKAAAA|-|John|-|Sanders|-|John.Sanders@g.com +AAAAAAAAMHOLAAAA|-|Terri|-|Cook|-|Terri.Cook@Vz02fJPUlPO.edu +AAAAAAAAMJFAAAAA|-|Marcus|-|Espinal|-|Marcus.Espinal@zoIoG4RpC.com +AAAAAAAAMLOEAAAA|-|Miguel|-|Jackson|-|Miguel.Jackson@i8Me4xM79.org +AAAAAAAANBECBAAA|-|Michael|-|Lombardi|-|Michael.Lombardi@J.com +AAAAAAAANKBBAAAA|-|Diann|-|Saunders|-|Diann.Saunders@g6OYMRl4DEBFz.org +AAAAAAAAOCDCAAAA|-|Armando|-|Jackson|-|Armando.Jackson@IoY0Kf.edu +AAAAAAAAOEDIAAAA|-|Alexander|-|Rich|-|Alexander.Rich@YT4HorlXiEXVj.org +AAAAAAAAOFFIAAAA|-|Frank|-|Milton|-|Frank.Milton@satakl9QHE.edu +AAAAAAAAOJBPAAAA|-|Jonathan|-|Mcbride|-|Jonathan.Mcbride@SjQzPb47cUO.com +AAAAAAAAOMOKAAAA|-|Laurette|-|Gary|-|Laurette.Gary@bSgl2F0kEo2tf.org +AAAAAAAAOOKKAAAA|-|Deborah|-|Early|-|Deborah.Early@Zpi3TmsGBi.edu +AAAAAAAAOPMDAAAA|-|Peggy|-|Smith|-|Peggy.Smith@CfqGXuI6hH.org +AAAAAAAAOPPKAAAA|-|Tina|-|Johnson|-|Tina.Johnson@LlITreSC2jD7.com +AAAAAAAAPAEEBAAA|-|Audria|-|Mattson|-|Audria.Mattson@V6zU0l0A.com +AAAAAAAAPBIGBAAA|-|Susie|-|Zavala|-|Susie.Zavala@C0UOUuL65F7kV.com +AAAAAAAAPEFLAAAA|-|David|-|Martinez|-|David.Martinez@ghefIHRjR1N.com +AAAAAAAAPFKDAAAA|-|Linda|-|Simmons|-|Linda.Simmons@P3L.com +AAAAAAAAPNMGAAAA|-|Christine|-|Olds|-|Christine.Olds@acdIL3Bsp4QnMIc.org diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q12.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q12.out new file mode 100644 index 0000000000000..308ad39dd670f --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q12.out @@ -0,0 +1,100 @@ +AAAAAAAAABHCAAAA|-|Level children shall exist finally other, patient costs. Adequate values come very children. Reforms ought to profit too as black troops. Nev|-|Books|-|arts|-|6.23|-|252.45|-|0.33962346392524813 +AAAAAAAAADDBAAAA|-|Resulting, great occasions ought to expe|-|Books|-|arts|-|5.06|-|2230.46|-|3.00065973993546818 +AAAAAAAAALAAAAAA|-|Large affairs assume. Contents sign only; heavy areas disturb local areas; drivers turn profits. Home early children obtain prime, old instruments. Advantages shall not announce gently |-|Books|-|arts|-|7.09|-|3674.01|-|4.94268172983165331 +AAAAAAAAAMJBAAAA|-|Expected, high classes expect; thus wooden values exclude probably below norma|-|Books|-|arts|-|1.15|-|820.04|-|1.10320786435833027 +AAAAAAAABGDAAAAA|-|Newly national rights head curiously all electrical cells. Chinese, long values might not pull bad lines. High fun clothes ough|-|Books|-|arts|-|3.28|-|461.61|-|0.62100846576563196 +AAAAAAAABKLDAAAA|-|Forward psychological plants establish closely yet eastern changes. Likewise necessary techniques might drop. Pleasant operations like lonely things; dogs let regions. Forces might not result clearl|-|Books|-|arts|-|2.43|-|1316.48|-|1.77107347113610876 +AAAAAAAACBDEAAAA|-|Banks might learn so. Governments fight subject, technical nations. Only original scholars would work merely experts. Hands lodge socially special, large armies. Small, full days arise to a y|-|Books|-|arts|-|8.93|-|249.48|-|0.33562789376142168 +AAAAAAAACCPDAAAA|-|Here african objectives will not know good times. Leaders must sell yet in the developments. |-|Books|-|arts|-|1.14|-|1236.06|-|1.66288365545431651 +AAAAAAAACEGCAAAA|-|Democratic days waste so. Books walk futur|-|Books|-|arts|-|0.60|-|4238.06|-|5.70150373350381099 +AAAAAAAACIKAAAAA|-|Big, necessary countries arise furt|-|Books|-|arts|-|1.48|-|8596.27|-|11.56464644181696468 +AAAAAAAACMPCAAAA|-|Even new adults shall resume in a hands. New boys grasp. Clear, bad firms ought to participate of course upon a opportunities. Sometimes hard options ought to admit actually within|-|Books|-|arts|-|3.13|-|10403.58|-|13.99603833164362420 +AAAAAAAADLLDAAAA|-|Black, following services justify by a investors; dirty, different charts will fly however prizes. Temporary, l|-|Books|-|arts|-|5.56|-|575.01|-|0.77356659929355091 +AAAAAAAAEIPCAAAA|-|Public, geographical methods may choke responsi|-|Books|-|arts|-|4.91|-|3420.00|-|4.60095958258803169 +AAAAAAAAELBDAAAA|-|Metres sell low men. At least other|-|Books|-|arts|-|9.73|-|1595.07|-|2.14586333374230752 +AAAAAAAAFCIBAAAA|-|United, important objectives put similarly large, previous phenomena; old, present days receive. Happy detectives assi|-|Books|-|arts|-|1.26|-|4822.68|-|6.48799876016247038 +AAAAAAAAFJGCAAAA|-|Ago correct profits must not handle else. Healthy children may not go only ancient words. Later just characters ought to drink about. British parts must watch soon ago other clients. So vital d|-|Books|-|arts|-|4.03|-|5235.20|-|7.04296596689031097 +AAAAAAAAFLNCAAAA|-|Much new waters |-|Books|-|arts|-|1.85|-|606.51|-|0.81594385860686173 +AAAAAAAAGEJAAAAA|-|Hands might not make; good, different advertisements bear top, far facilities. Women could persuade yet. Copies lie long markets. Particular places could not ask. Numerous, old count|-|Books|-|arts|-|9.99|-|824.15|-|1.10873708771635273 +AAAAAAAAHHEBAAAA|-|Powerful walls will find; there scottish decades must not|-|Books|-|arts|-|4.16|-|1282.12|-|1.72484862573911321 +AAAAAAAAHMCEAAAA|-|Too executive doors progress mainly seemingly possible parts; hundreds stay virtually simple workers. Sola|-|Books|-|arts|-|34.32|-|69.72|-|0.09379500061346128 +AAAAAAAAIBPCAAAA|-|Able issues bother however political services. French teachers will act voices. Pregnant, existing cases make by th|-|Books|-|arts|-|84.47|-|4752.59|-|6.39370599491580513 +AAAAAAAAINLAAAAA|-|Children come. Bad kinds love then also old owners. Never long effects come other, responsible words. Very particular iss|-|Books|-|arts|-|8.27|-|938.37|-|1.26239837529623722 +AAAAAAAAJGHDAAAA|-|Circumstances would not use. Principles seem writers. Times go from a hands. Members find grounds. Central, only teachers pursue properly into a p|-|Books|-|arts|-|5.95|-|76.36|-|0.10272785781474330 +AAAAAAAALCFBAAAA|-|More than key reasons should remain. Words used to offer slowly british|-|Books|-|arts|-|0.28|-|3188.58|-|4.28962798416624155 +AAAAAAAAMBABAAAA|-|Just late patients shall not go hard very able models. In addition exclusive resources go dirty standards. Continuous, good concepts might know much du|-|Books|-|arts|-|1.18|-|1379.84|-|1.85631230129773966 +AAAAAAAAMMICAAAA|-|Real scales get just features. Controls describe political interests. Devices lie. |-|Books|-|arts|-|0.89|-|1977.58|-|2.66045779278784787 +AAAAAAAANABCAAAA|-|Likely states feel astonishingly working roads. Parents put so somewhere able policies. Others may rely shortly instead interesting bodies; bri|-|Books|-|arts|-|7.50|-|8573.94|-|11.53460567354819546 +AAAAAAAANMECAAAA|-|Floors could not go only for a years. Special reasons shape consequently black, concerned instances. Mutual depths encourage both simple teachers. Cards favour massive |-|Books|-|arts|-|1.83|-|178.24|-|0.23978802222236572 +AAAAAAAAOKHDAAAA|-|Responsible arts permit. Fresh, elderly figures refer much long certain prayers. Almost romantic assumptions date however european, innocent cou|-|Books|-|arts|-|7.86|-|1357.86|-|1.82674239146578500 +AAAAAAAAAADEAAAA|-|Later national activities wake yet expenses. Variable days choose typically light, final feet. So scottish pro|-|Books|-|business|-|0.90|-|114.72|-|0.06595555933729381 +AAAAAAAAADKBAAAA|-|Primary, past authorities say well at a teeth; stores want much usually important sites; late |-|Books|-|business|-|0.26|-|3557.34|-|2.04520876440837484 +AAAAAAAACEHDAAAA|-|Catholic men understand new conditions; he|-|Books|-|business|-|1.48|-|253.82|-|0.14592782488661014 +AAAAAAAACMIBAAAA|-|Most good days may continue images. Most human lives must reject thus quietly legitimate pounds. More senior schools concentrate more than prime hours. No doubt normal|-|Books|-|business|-|6.58|-|3743.07|-|2.15198984909906155 +AAAAAAAADEDAAAAA|-|Junior, severe restrictions ought to want principles. Sure,|-|Books|-|business|-|9.77|-|4055.45|-|2.33158536536286769 +AAAAAAAAEDKDAAAA|-|Minor, single things could cry too profits. Examples focus material, young observations. Existing tensions would stop away. Facilities reply most thoroughly small|-|Books|-|business|-|1.24|-|4403.14|-|2.53148153365073105 +AAAAAAAAELBAAAAA|-|Immense panels take just. Small workers ignore home. Professionals must not show prime, difficult complaints; finally royal documents must ef|-|Books|-|business|-|1.72|-|765.81|-|0.44028440460332089 +AAAAAAAAEMMBAAAA|-|Polls may not change in order logical shoulders. Left times leave|-|Books|-|business|-|3.01|-|2178.42|-|1.25243122011460583 +AAAAAAAAFDLAAAAA|-|Popular, different parameters might take open, used modules. Prisoners use pretty alternative lovers. Annual, professional others spend once true men. Other, small subsidies seem politically|-|Books|-|business|-|7.25|-|2220.24|-|1.27647464315754191 +AAAAAAAAFEGEAAAA|-|Supreme, free uses handle even in the customers. Other minutes might not make of course social neighbours. So environmental rights come other, able sales|-|Books|-|business|-|8.08|-|3116.10|-|1.79152822917487135 +AAAAAAAAFHFCAAAA|-|Sound, original activities consider quite to a attitudes. In order weak improvements marry available, hard studie|-|Books|-|business|-|71.27|-|13195.04|-|7.58617715897807978 +AAAAAAAAGANDAAAA|-|Simple functions contain then wide |-|Books|-|business|-|9.71|-|10164.85|-|5.84404085887108597 +AAAAAAAAGCJCAAAA|-|Careful universities may find cultural methods; artificial, apparent sections ought to tell highly reforms. Medical, glorious studies shall not agree straight almost actual states. Enough n|-|Books|-|business|-|5.70|-|6924.90|-|3.98130799210970976 +AAAAAAAAGDBDAAAA|-|Safe, strong houses could find. Customers will exploit useful, old views. National, internal paintings must use normally p|-|Books|-|business|-|5.16|-|3402.40|-|1.95612966430621041 +AAAAAAAAGGHBAAAA|-|Big calculations may find quickly. Separate, unemployed languages choose never. Really red regulations could not remem|-|Books|-|business|-|6.23|-|6854.46|-|3.94081017481787768 +AAAAAAAAGIKBAAAA|-|Shows say though new months. D|-|Books|-|business|-|3.66|-|2716.42|-|1.56174163611411830 +AAAAAAAAGJODAAAA|-|Therefore gay reserves increase political po|-|Books|-|business|-|2.86|-|2157.52|-|1.24041525785737570 +AAAAAAAAGMDBAAAA|-|Settlements relocate colleagues. Well |-|Books|-|business|-|8.18|-|13935.62|-|8.01195616990915588 +AAAAAAAAGPBAAAAA|-|Members aid ago. Blind trends used to get actions. Important notes might suffer rarely moral others. Members make. Just full rivals say elsewhere. Small factors may abandon; im|-|Books|-|business|-|1.46|-|1044.00|-|0.60022318643771563 +AAAAAAAAHAADAAAA|-|British instructions will not distinguish blue results; great periods fill delicious, big years. Emotions cannot go results. Quick,|-|Books|-|business|-|5.91|-|353.70|-|0.20335147609484676 +AAAAAAAAHDKCAAAA|-|Visual fragments |-|Books|-|business|-|6.77|-|3747.52|-|2.15454827168493112 +AAAAAAAAHDLBAAAA|-|Classic issues will draw as european, engl|-|Books|-|business|-|75.64|-|6261.00|-|3.59961433935492105 +AAAAAAAAHJAAAAAA|-|Again british shareholders see shares. American lives ought to establish horses. Then ideal conservatives might charge even nec|-|Books|-|business|-|2.44|-|281.07|-|0.16159456993491258 +AAAAAAAAHKACAAAA|-|Critical cases tell anywhere to the circumstances. Dependent, new numbers must not|-|Books|-|business|-|3.72|-|4957.65|-|2.85028398490703152 +AAAAAAAAHLKAAAAA|-|Confident, video-tape|-|Books|-|business|-|3.17|-|2151.24|-|1.23680471991596875 +AAAAAAAAIAAAAAAA|-|International countries might not steal more. Differences will give devices. New, naval eyes c|-|Books|-|business|-|4.22|-|5759.26|-|3.31115075548206718 +AAAAAAAAILOBAAAA|-|New cr|-|Books|-|business|-|5.44|-|637.80|-|0.36668807309384582 +AAAAAAAAJFBEAAAA|-|Paintings must not know primary, royal stands; similar, available others ough|-|Books|-|business|-|0.39|-|3857.56|-|2.21781317535888345 +AAAAAAAAJJGBAAAA|-|Most present eyes restore fat, central relationships; again considerable habits must face in a discussions. Engineers help at all direct occasions. Curiously del|-|Books|-|business|-|80.10|-|176.61|-|0.10153775570571356 +AAAAAAAAKCMBAAAA|-|Tra|-|Books|-|business|-|1.64|-|2.92|-|0.00167878515746947 +AAAAAAAAKIMCAAAA|-|However dangerous jobs deserve much continuing, magnetic cards. Today key drugs happe|-|Books|-|business|-|82.91|-|5349.08|-|3.07532743497150952 +AAAAAAAAKIPCAAAA|-|Young countries should restore increasingly others. Combined, large activities match in a cases. Positions can |-|Books|-|business|-|1.02|-|182.40|-|0.10486657969946296 +AAAAAAAAKKLBAAAA|-|Great, valid factors should not say able centres. Lazily cu|-|Books|-|business|-|5.02|-|290.40|-|0.16695863346888182 +AAAAAAAAKNCBAAAA|-|Slowly alternative items would portray perfectly boys; for example hard items treat hence appropriate wea|-|Books|-|business|-|1.88|-|1275.00|-|0.73303119033341708 +AAAAAAAAKPGAAAAA|-|Hard genuine samples can create. Services arrive. Human, vast years should love on a surveys. Excellent, essential numbers result more historical, social actions. There exciting things join so|-|Books|-|business|-|3.72|-|4750.25|-|2.73104424461279568 +AAAAAAAALAJCAAAA|-|Asleep children invite more. Wealthy forms could expect as. Indeed statistical examinations could la|-|Books|-|business|-|3.71|-|1712.58|-|0.98460749485584582 +AAAAAAAALDHBAAAA|-|Most new weeks go yet members. Also encouraging delegates make publications. Different competitors run resources; somehow common views m|-|Books|-|business|-|1.07|-|1581.58|-|0.90929213333923591 +AAAAAAAALHMBAAAA|-|Local, bloody names |-|Books|-|business|-|4.40|-|5021.52|-|2.88700453559455729 +AAAAAAAAMGABAAAA|-|Huge, ancient problems survive much outstanding, important lawyers. Complete styles would say unlikely, natural children. Western relations get precious prisoners. Large, able techniq|-|Books|-|business|-|29.84|-|2404.55|-|1.38243933232644552 +AAAAAAAAMKKDAAAA|-|Long years sl|-|Books|-|business|-|9.91|-|1024.29|-|0.58889138662479669 +AAAAAAAAMMNAAAAA|-|Shops see enough then light views; near chief insects may thank so ever orange products. Advantages settle surely. Still female re|-|Books|-|business|-|4.64|-|8709.68|-|5.00742517476325967 +AAAAAAAANKCAAAAA|-|Low, large clouds will not visit for example as the notions. Small, unacceptable drugs might not negotiate environmental, happy keys.|-|Books|-|business|-|3.11|-|3137.66|-|1.80392364287180348 +AAAAAAAAODCAAAAA|-|Things shall make really high, financial poles. Physical, formal metres forget probably comfortab|-|Books|-|business|-|0.42|-|274.32|-|0.15771381657432390 +AAAAAAAAOEFDAAAA|-|Then presidential |-|Books|-|business|-|52.62|-|2882.86|-|1.65743239008987825 +AAAAAAAAOGBEAAAA|-|Efforts will look far available rivers. For example standard police used to perform so profound excessive seats. Wet, substantial minutes live special, available fans. Reliable, electoral m|-|Books|-|business|-|51.50|-|1983.52|-|1.14037806011775643 +AAAAAAAAOGNBAAAA|-|Arguably other beans suggest then useful events. Gener|-|Books|-|business|-|9.91|-|12194.76|-|7.01108975578850297 +AAAAAAAAOHDEAAAA|-|Creatures ought to tell |-|Books|-|business|-|0.47|-|3050.77|-|1.75396828590861085 +AAAAAAAAOICCAAAA|-|Practices would not alter secret, international subjects; democratic, old hours |-|Books|-|business|-|8.09|-|445.47|-|0.25611247400613906 +AAAAAAAAOJADAAAA|-|Working, economic organizations can ensure rather friends. New women should not close thus traditional gaps. Old effects cannot hear already firms. Essential, s|-|Books|-|business|-|30.03|-|3404.07|-|1.95708979143394124 +AAAAAAAAOKDBAAAA|-|Easily expensive developments will ensure still potential sorry solicitors. Different, post-war folk must not strengthen |-|Books|-|business|-|4.65|-|1270.89|-|0.73066824273163642 +AAAAAAAAAMGBAAAA|-|Very social engineers ask facilities. Numerous, stupid |-|Books|-|computers|-|1.93|-|4466.22|-|3.95672901825418685 +AAAAAAAABEBEAAAA|-|Cheap, desirable members take immediate, estimated debts; months must track typica|-|Books|-|computers|-|3.26|-|756.96|-|0.67060861257566561 +AAAAAAAABHOAAAAA|-|Expert, scottish terms will ask quiet demands; poor bits attempt northern, dangerous si|-|Books|-|computers|-|2.66|-|3840.20|-|3.40212322185197513 +AAAAAAAACAMDAAAA|-|Wooden eyes will visit possible, theoretical reasons. Circumstances die very throughout the feelings. Friends might not est|-|Books|-|computers|-|6.32|-|19023.78|-|16.85361275595103572 +AAAAAAAACFAEAAAA|-|Bad, domestic parts |-|Books|-|computers|-|1.32|-|4853.43|-|4.29976743623588137 +AAAAAAAACKEAAAAA|-|Previous feet would not find pubs. Unexpectedly dead|-|Books|-|computers|-|2.63|-|2232.78|-|1.97807215438952477 +AAAAAAAADAHAAAAA|-|Ga|-|Books|-|computers|-|5.53|-|2299.44|-|2.03712781137839323 +AAAAAAAAEEIDAAAA|-|Papers may die details. Men force also old, major stones. Wrong, central arms used to get as concre|-|Books|-|computers|-|0.53|-|707.16|-|0.62648962490621393 +AAAAAAAAEKJAAAAA|-|Scientific hands should not stem. Psychological matters must add rather top groups. Deaths would identify conve|-|Books|-|computers|-|4.55|-|4188.06|-|3.71030055218722539 +AAAAAAAAFDPCAAAA|-|Limited, capable cities shall try during the bodies. Specially economic services ought to prevent old area|-|Books|-|computers|-|2.93|-|1940.00|-|1.71869148752482468 +AAAAAAAAFHNAAAAA|-|Legs throw then. Old-fashioned develo|-|Books|-|computers|-|2.66|-|24.84|-|0.02200633842789518 +AAAAAAAAHHFDAAAA|-|Multiple, dark feet mean more complex girls; schools may not answer frequently blue assets. Spiritual, dry patients may reply personnel|-|Books|-|computers|-|2.04|-|2833.73|-|2.51046784997099044 +AAAAAAAAIBDBAAAA|-|Valid resources ought to say still tears. M|-|Books|-|computers|-|3.81|-|8228.68|-|7.28998055132256411 +AAAAAAAAICGEAAAA|-|Possible incentives can call other, british police. Modern|-|Books|-|computers|-|5.57|-|917.28|-|0.81263985962720164 +AAAAAAAAIHEBAAAA|-|Only, civil persons avoid early to a terms. Then u|-|Books|-|computers|-|7.97|-|218.40|-|0.19348568086361944 +AAAAAAAAIKEDAAAA|-|Primary, total origins help with the levels. Human, possible structures alter tomorrow to a wages. Proud interests see seriously further proper insects. Others fin|-|Books|-|computers|-|1.89|-|1276.58|-|1.13095215419816531 +AAAAAAAAJJFCAAAA|-|Effective females must answer too english projects. Firm, political experiments see in terms of |-|Books|-|computers|-|0.76|-|80.79|-|0.07157375529748999 +AAAAAAAAJPBDAAAA|-|Of course responsible fears tell. Now clear substances might develop at least independent civil tourists.|-|Books|-|computers|-|4.95|-|70.00|-|0.06201464130244213 +AAAAAAAAKFBDAAAA|-|Women used to seek ready organisation|-|Books|-|computers|-|1.89|-|128.52|-|0.11385888143128375 +AAAAAAAAKGCBAAAA|-|Goods go only. Accountants may unite. Almost agricultural muscles go just regional police. Real samples used to build auditors; following women can believe. Very concerned tonnes would fit there|-|Books|-|computers|-|3.02|-|1252.44|-|1.10956596218329455 +AAAAAAAALBNAAAAA|-|Male levels shall reduce else high, local conditions; further personal agencies control. Successful days wake eve|-|Books|-|computers|-|6.55|-|1495.84|-|1.32519972922635760 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q13.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q13.out new file mode 100644 index 0000000000000..8f3372923c285 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q13.out @@ -0,0 +1 @@ +33.3|-|2558.544000|-|2388.379000|-|23883.79 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q14a.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q14a.out new file mode 100644 index 0000000000000..cb127cc655223 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q14a.out @@ -0,0 +1,100 @@ +null|-|null|-|null|-|null|-|677178449.86|-|157050 +catalog|-|null|-|null|-|null|-|235662013.22|-|46193 +catalog|-|1001001|-|null|-|null|-|2553656.44|-|520 +catalog|-|1001001|-|1|-|null|-|2222983.82|-|453 +catalog|-|1001001|-|1|-|1|-|1860468.47|-|369 +catalog|-|1001001|-|1|-|2|-|33739.75|-|3 +catalog|-|1001001|-|1|-|3|-|49979.66|-|13 +catalog|-|1001001|-|1|-|4|-|49610.76|-|10 +catalog|-|1001001|-|1|-|5|-|61333.54|-|13 +catalog|-|1001001|-|1|-|6|-|31767.56|-|6 +catalog|-|1001001|-|1|-|7|-|19752.34|-|6 +catalog|-|1001001|-|1|-|8|-|43708.18|-|12 +catalog|-|1001001|-|1|-|9|-|36388.85|-|11 +catalog|-|1001001|-|1|-|10|-|36234.71|-|10 +catalog|-|1001001|-|2|-|null|-|41208.06|-|6 +catalog|-|1001001|-|2|-|3|-|41208.06|-|6 +catalog|-|1001001|-|3|-|null|-|85518.68|-|19 +catalog|-|1001001|-|3|-|1|-|11946.51|-|5 +catalog|-|1001001|-|3|-|4|-|32093.25|-|7 +catalog|-|1001001|-|3|-|6|-|6905.04|-|2 +catalog|-|1001001|-|3|-|7|-|34573.88|-|5 +catalog|-|1001001|-|4|-|null|-|22702.37|-|6 +catalog|-|1001001|-|4|-|7|-|22702.37|-|6 +catalog|-|1001001|-|5|-|null|-|15433.39|-|3 +catalog|-|1001001|-|5|-|9|-|15433.39|-|3 +catalog|-|1001001|-|8|-|null|-|22550.38|-|4 +catalog|-|1001001|-|8|-|9|-|22550.38|-|4 +catalog|-|1001001|-|10|-|null|-|29206.10|-|5 +catalog|-|1001001|-|10|-|7|-|29206.10|-|5 +catalog|-|1001001|-|13|-|null|-|9727.21|-|3 +catalog|-|1001001|-|13|-|9|-|9727.21|-|3 +catalog|-|1001001|-|14|-|null|-|80584.37|-|15 +catalog|-|1001001|-|14|-|9|-|17298.44|-|3 +catalog|-|1001001|-|14|-|10|-|63285.93|-|12 +catalog|-|1001001|-|16|-|null|-|23742.06|-|6 +catalog|-|1001001|-|16|-|9|-|23742.06|-|6 +catalog|-|1001002|-|null|-|null|-|2674718.24|-|515 +catalog|-|1001002|-|1|-|null|-|2413496.48|-|456 +catalog|-|1001002|-|1|-|1|-|2413496.48|-|456 +catalog|-|1001002|-|2|-|null|-|40653.02|-|10 +catalog|-|1001002|-|2|-|1|-|40653.02|-|10 +catalog|-|1001002|-|3|-|null|-|55083.13|-|11 +catalog|-|1001002|-|3|-|1|-|55083.13|-|11 +catalog|-|1001002|-|4|-|null|-|59222.69|-|15 +catalog|-|1001002|-|4|-|1|-|59222.69|-|15 +catalog|-|1001002|-|7|-|null|-|23174.76|-|3 +catalog|-|1001002|-|7|-|1|-|23174.76|-|3 +catalog|-|1001002|-|10|-|null|-|40160.58|-|11 +catalog|-|1001002|-|10|-|1|-|40160.58|-|11 +catalog|-|1001002|-|12|-|null|-|25963.72|-|6 +catalog|-|1001002|-|12|-|1|-|25963.72|-|6 +catalog|-|1001002|-|13|-|null|-|11354.62|-|2 +catalog|-|1001002|-|13|-|1|-|11354.62|-|2 +catalog|-|1001002|-|14|-|null|-|5609.24|-|1 +catalog|-|1001002|-|14|-|1|-|5609.24|-|1 +catalog|-|1002001|-|null|-|null|-|2907063.96|-|511 +catalog|-|1002001|-|1|-|null|-|88041.35|-|10 +catalog|-|1002001|-|1|-|1|-|38209.40|-|6 +catalog|-|1002001|-|1|-|5|-|49831.95|-|4 +catalog|-|1002001|-|2|-|null|-|2574507.86|-|463 +catalog|-|1002001|-|2|-|1|-|2132551.78|-|377 +catalog|-|1002001|-|2|-|3|-|34961.36|-|11 +catalog|-|1002001|-|2|-|4|-|50761.02|-|9 +catalog|-|1002001|-|2|-|6|-|99382.39|-|16 +catalog|-|1002001|-|2|-|7|-|43547.86|-|4 +catalog|-|1002001|-|2|-|8|-|104272.59|-|23 +catalog|-|1002001|-|2|-|9|-|62741.20|-|11 +catalog|-|1002001|-|2|-|10|-|46289.66|-|12 +catalog|-|1002001|-|3|-|null|-|44220.16|-|5 +catalog|-|1002001|-|3|-|1|-|44220.16|-|5 +catalog|-|1002001|-|4|-|null|-|86121.32|-|15 +catalog|-|1002001|-|4|-|1|-|28141.23|-|5 +catalog|-|1002001|-|4|-|3|-|29119.15|-|5 +catalog|-|1002001|-|4|-|5|-|28860.94|-|5 +catalog|-|1002001|-|5|-|null|-|26371.70|-|2 +catalog|-|1002001|-|5|-|9|-|26371.70|-|2 +catalog|-|1002001|-|6|-|null|-|32428.43|-|4 +catalog|-|1002001|-|6|-|10|-|32428.43|-|4 +catalog|-|1002001|-|8|-|null|-|19630.88|-|3 +catalog|-|1002001|-|8|-|8|-|19630.88|-|3 +catalog|-|1002001|-|10|-|null|-|20942.49|-|5 +catalog|-|1002001|-|10|-|8|-|20942.49|-|5 +catalog|-|1002001|-|11|-|null|-|6069.54|-|2 +catalog|-|1002001|-|11|-|8|-|6069.54|-|2 +catalog|-|1002001|-|12|-|null|-|8730.23|-|2 +catalog|-|1002001|-|12|-|7|-|8730.23|-|2 +catalog|-|1002002|-|null|-|null|-|2695862.91|-|567 +catalog|-|1002002|-|1|-|null|-|79482.49|-|21 +catalog|-|1002002|-|1|-|1|-|79482.49|-|21 +catalog|-|1002002|-|2|-|null|-|2153480.10|-|444 +catalog|-|1002002|-|2|-|1|-|2153480.10|-|444 +catalog|-|1002002|-|3|-|null|-|64329.01|-|20 +catalog|-|1002002|-|3|-|1|-|64329.01|-|20 +catalog|-|1002002|-|4|-|null|-|98180.19|-|26 +catalog|-|1002002|-|4|-|1|-|98180.19|-|26 +catalog|-|1002002|-|7|-|null|-|45311.61|-|6 +catalog|-|1002002|-|7|-|1|-|45311.61|-|6 +catalog|-|1002002|-|8|-|null|-|16754.12|-|4 +catalog|-|1002002|-|8|-|1|-|16754.12|-|4 +catalog|-|1002002|-|9|-|null|-|30603.32|-|7 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q14b.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q14b.out new file mode 100644 index 0000000000000..3d9e5bf8ca49c --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q14b.out @@ -0,0 +1,100 @@ +store|-|1001001|-|1|-|1|-|1217789.46|-|331|-|store|-|1001001|-|1|-|1|-|1234065.50|-|342 +store|-|1001002|-|1|-|1|-|553751.85|-|151|-|store|-|1001002|-|1|-|1|-|559183.12|-|158 +store|-|1002001|-|2|-|1|-|1249466.39|-|353|-|store|-|1002001|-|2|-|1|-|1576146.08|-|368 +store|-|1002002|-|2|-|1|-|547670.08|-|152|-|store|-|1002002|-|2|-|1|-|491380.52|-|130 +store|-|1003001|-|3|-|1|-|1167282.59|-|309|-|store|-|1003001|-|3|-|1|-|1045547.02|-|287 +store|-|1003002|-|3|-|1|-|789483.23|-|193|-|store|-|1003002|-|3|-|1|-|601149.89|-|165 +store|-|1004001|-|4|-|1|-|1522903.35|-|398|-|store|-|1004001|-|4|-|1|-|1062756.03|-|278 +store|-|1004002|-|4|-|1|-|541183.58|-|151|-|store|-|1004002|-|4|-|1|-|607217.67|-|151 +store|-|2001001|-|1|-|2|-|1145363.89|-|364|-|store|-|2001001|-|1|-|2|-|1303027.45|-|345 +store|-|2001002|-|1|-|2|-|627833.76|-|169|-|store|-|2001002|-|1|-|2|-|536535.24|-|161 +store|-|2002001|-|2|-|2|-|1440545.64|-|383|-|store|-|2002001|-|2|-|2|-|1329963.82|-|368 +store|-|2002002|-|2|-|2|-|747435.75|-|207|-|store|-|2002002|-|2|-|2|-|816248.81|-|208 +store|-|2003001|-|3|-|2|-|1388229.40|-|395|-|store|-|2003001|-|3|-|2|-|1469176.64|-|414 +store|-|2003002|-|3|-|2|-|716344.82|-|190|-|store|-|2003002|-|3|-|2|-|729626.91|-|181 +store|-|2004001|-|4|-|2|-|1613653.10|-|440|-|store|-|2004001|-|4|-|2|-|1488785.35|-|406 +store|-|2004002|-|4|-|2|-|657357.03|-|182|-|store|-|2004002|-|4|-|2|-|593298.47|-|162 +store|-|3001001|-|1|-|3|-|1282986.35|-|374|-|store|-|3001001|-|1|-|3|-|1519875.76|-|390 +store|-|3001002|-|1|-|3|-|673633.15|-|169|-|store|-|3001002|-|1|-|3|-|656845.65|-|177 +store|-|3002001|-|2|-|3|-|1333021.08|-|362|-|store|-|3002001|-|2|-|3|-|1241035.46|-|351 +store|-|3002002|-|2|-|3|-|748022.41|-|210|-|store|-|3002002|-|2|-|3|-|699267.97|-|190 +store|-|3003001|-|3|-|3|-|1134792.91|-|326|-|store|-|3003001|-|3|-|3|-|1020180.77|-|305 +store|-|3003002|-|3|-|3|-|802127.48|-|197|-|store|-|3003002|-|3|-|3|-|703596.57|-|195 +store|-|3004001|-|4|-|3|-|1385106.21|-|399|-|store|-|3004001|-|4|-|3|-|1338923.03|-|363 +store|-|3004002|-|4|-|3|-|732944.48|-|203|-|store|-|3004002|-|4|-|3|-|722668.95|-|194 +store|-|4001001|-|1|-|4|-|1157990.42|-|340|-|store|-|4001001|-|1|-|4|-|1349185.21|-|367 +store|-|4001002|-|1|-|4|-|621674.47|-|152|-|store|-|4001002|-|1|-|4|-|549243.01|-|154 +store|-|4002001|-|2|-|4|-|1568059.38|-|402|-|store|-|4002001|-|2|-|4|-|1452439.59|-|374 +store|-|4002002|-|2|-|4|-|694485.13|-|177|-|store|-|4002002|-|2|-|4|-|802206.88|-|214 +store|-|4003001|-|3|-|4|-|1593249.87|-|451|-|store|-|4003001|-|3|-|4|-|1456053.57|-|403 +store|-|4003002|-|3|-|4|-|662121.36|-|163|-|store|-|4003002|-|3|-|4|-|717341.48|-|189 +store|-|4004001|-|4|-|4|-|1248825.41|-|348|-|store|-|4004001|-|4|-|4|-|1389020.06|-|347 +store|-|4004002|-|4|-|4|-|718297.35|-|201|-|store|-|4004002|-|4|-|4|-|708937.79|-|199 +store|-|5001001|-|1|-|5|-|1273579.39|-|349|-|store|-|5001001|-|1|-|5|-|1253638.00|-|334 +store|-|5001002|-|1|-|5|-|825892.06|-|217|-|store|-|5001002|-|1|-|5|-|702168.77|-|206 +store|-|5002001|-|2|-|5|-|1486176.43|-|365|-|store|-|5002001|-|2|-|5|-|1243594.81|-|313 +store|-|5002002|-|2|-|5|-|633123.05|-|172|-|store|-|5002002|-|2|-|5|-|765400.35|-|202 +store|-|5003001|-|3|-|5|-|1477157.87|-|390|-|store|-|5003001|-|3|-|5|-|1314942.13|-|338 +store|-|5003002|-|3|-|5|-|697211.48|-|193|-|store|-|5003002|-|3|-|5|-|611056.63|-|180 +store|-|5004001|-|4|-|5|-|1287387.74|-|353|-|store|-|5004001|-|4|-|5|-|1459943.10|-|376 +store|-|5004002|-|4|-|5|-|587935.16|-|160|-|store|-|5004002|-|4|-|5|-|554584.12|-|154 +store|-|6001001|-|1|-|6|-|83017.27|-|25|-|store|-|6001001|-|1|-|6|-|53839.44|-|19 +store|-|6001002|-|1|-|6|-|38797.04|-|9|-|store|-|6001002|-|1|-|6|-|40326.43|-|9 +store|-|6001003|-|1|-|6|-|50457.02|-|12|-|store|-|6001003|-|1|-|6|-|53585.59|-|10 +store|-|6001004|-|1|-|6|-|85147.15|-|18|-|store|-|6001004|-|1|-|6|-|88513.17|-|27 +store|-|6001005|-|1|-|6|-|174523.58|-|45|-|store|-|6001005|-|1|-|6|-|96635.15|-|31 +store|-|6001006|-|1|-|6|-|61231.20|-|15|-|store|-|6001006|-|1|-|6|-|52077.07|-|12 +store|-|6001007|-|1|-|6|-|69263.80|-|19|-|store|-|6001007|-|1|-|6|-|51940.50|-|18 +store|-|6001008|-|1|-|6|-|7774.49|-|5|-|store|-|6001008|-|1|-|6|-|34176.00|-|11 +store|-|6002001|-|2|-|6|-|137288.11|-|36|-|store|-|6002001|-|2|-|6|-|158530.44|-|40 +store|-|6002002|-|2|-|6|-|32548.73|-|11|-|store|-|6002002|-|2|-|6|-|87976.59|-|21 +store|-|6002003|-|2|-|6|-|73606.51|-|23|-|store|-|6002003|-|2|-|6|-|75815.97|-|30 +store|-|6002004|-|2|-|6|-|53750.06|-|10|-|store|-|6002004|-|2|-|6|-|47235.26|-|13 +store|-|6002005|-|2|-|6|-|102178.51|-|28|-|store|-|6002005|-|2|-|6|-|65676.11|-|26 +store|-|6002006|-|2|-|6|-|54942.99|-|11|-|store|-|6002006|-|2|-|6|-|19627.43|-|5 +store|-|6002007|-|2|-|6|-|90084.17|-|30|-|store|-|6002007|-|2|-|6|-|92767.58|-|27 +store|-|6002008|-|2|-|6|-|39639.50|-|9|-|store|-|6002008|-|2|-|6|-|22406.00|-|6 +store|-|6003001|-|3|-|6|-|51483.85|-|13|-|store|-|6003001|-|3|-|6|-|54481.52|-|8 +store|-|6003003|-|3|-|6|-|47337.51|-|12|-|store|-|6003003|-|3|-|6|-|45051.71|-|13 +store|-|6003004|-|3|-|6|-|10107.64|-|5|-|store|-|6003004|-|3|-|6|-|32499.05|-|7 +store|-|6003005|-|3|-|6|-|66634.50|-|24|-|store|-|6003005|-|3|-|6|-|108128.10|-|28 +store|-|6003006|-|3|-|6|-|48367.44|-|18|-|store|-|6003006|-|3|-|6|-|40436.80|-|10 +store|-|6003007|-|3|-|6|-|81724.63|-|24|-|store|-|6003007|-|3|-|6|-|53676.25|-|15 +store|-|6003008|-|3|-|6|-|38023.42|-|10|-|store|-|6003008|-|3|-|6|-|86371.33|-|18 +store|-|6004001|-|4|-|6|-|46759.68|-|16|-|store|-|6004001|-|4|-|6|-|98037.79|-|25 +store|-|6004002|-|4|-|6|-|32304.25|-|8|-|store|-|6004002|-|4|-|6|-|31274.82|-|9 +store|-|6004003|-|4|-|6|-|69089.26|-|18|-|store|-|6004003|-|4|-|6|-|70840.13|-|21 +store|-|6004004|-|4|-|6|-|40891.73|-|9|-|store|-|6004004|-|4|-|6|-|37496.52|-|13 +store|-|6004005|-|4|-|6|-|47341.21|-|14|-|store|-|6004005|-|4|-|6|-|11576.16|-|4 +store|-|6004006|-|4|-|6|-|37823.00|-|15|-|store|-|6004006|-|4|-|6|-|95562.26|-|20 +store|-|6004007|-|4|-|6|-|107423.33|-|25|-|store|-|6004007|-|4|-|6|-|49625.35|-|14 +store|-|6004008|-|4|-|6|-|29725.16|-|11|-|store|-|6004008|-|4|-|6|-|80015.81|-|19 +store|-|6005001|-|5|-|6|-|57198.07|-|20|-|store|-|6005001|-|5|-|6|-|61313.19|-|22 +store|-|6005002|-|5|-|6|-|26742.25|-|7|-|store|-|6005002|-|5|-|6|-|8143.14|-|3 +store|-|6005003|-|5|-|6|-|220162.11|-|49|-|store|-|6005003|-|5|-|6|-|156718.19|-|37 +store|-|6005004|-|5|-|6|-|11571.97|-|5|-|store|-|6005004|-|5|-|6|-|47370.39|-|12 +store|-|6005005|-|5|-|6|-|98809.34|-|31|-|store|-|6005005|-|5|-|6|-|139898.64|-|34 +store|-|6005006|-|5|-|6|-|18108.22|-|5|-|store|-|6005006|-|5|-|6|-|23139.57|-|5 +store|-|6005007|-|5|-|6|-|74967.30|-|18|-|store|-|6005007|-|5|-|6|-|49412.83|-|17 +store|-|6005008|-|5|-|6|-|71048.66|-|14|-|store|-|6005008|-|5|-|6|-|35086.91|-|13 +store|-|6006001|-|6|-|6|-|33781.32|-|9|-|store|-|6006001|-|6|-|6|-|33793.98|-|13 +store|-|6006003|-|6|-|6|-|97264.81|-|19|-|store|-|6006003|-|6|-|6|-|68109.24|-|28 +store|-|6006004|-|6|-|6|-|68406.20|-|16|-|store|-|6006004|-|6|-|6|-|45670.46|-|17 +store|-|6006005|-|6|-|6|-|56934.37|-|15|-|store|-|6006005|-|6|-|6|-|80912.54|-|19 +store|-|6006006|-|6|-|6|-|9360.35|-|4|-|store|-|6006006|-|6|-|6|-|63735.59|-|18 +store|-|6006007|-|6|-|6|-|15367.23|-|7|-|store|-|6006007|-|6|-|6|-|35007.03|-|7 +store|-|6006008|-|6|-|6|-|32684.13|-|6|-|store|-|6006008|-|6|-|6|-|17541.68|-|5 +store|-|6007001|-|7|-|6|-|20878.30|-|5|-|store|-|6007001|-|7|-|6|-|31745.91|-|6 +store|-|6007002|-|7|-|6|-|22897.56|-|7|-|store|-|6007002|-|7|-|6|-|49259.06|-|10 +store|-|6007003|-|7|-|6|-|23239.07|-|10|-|store|-|6007003|-|7|-|6|-|58808.25|-|19 +store|-|6007004|-|7|-|6|-|47157.82|-|10|-|store|-|6007004|-|7|-|6|-|35948.03|-|11 +store|-|6007005|-|7|-|6|-|108100.32|-|27|-|store|-|6007005|-|7|-|6|-|61513.57|-|21 +store|-|6007006|-|7|-|6|-|49256.53|-|10|-|store|-|6007006|-|7|-|6|-|16532.02|-|5 +store|-|6007007|-|7|-|6|-|65032.83|-|21|-|store|-|6007007|-|7|-|6|-|110874.54|-|26 +store|-|6007008|-|7|-|6|-|56626.18|-|12|-|store|-|6007008|-|7|-|6|-|88630.08|-|17 +store|-|6008001|-|8|-|6|-|138363.66|-|40|-|store|-|6008001|-|8|-|6|-|118280.46|-|34 +store|-|6008002|-|8|-|6|-|59363.03|-|20|-|store|-|6008002|-|8|-|6|-|35498.23|-|9 +store|-|6008004|-|8|-|6|-|48538.79|-|12|-|store|-|6008004|-|8|-|6|-|15279.50|-|6 +store|-|6008005|-|8|-|6|-|107128.07|-|41|-|store|-|6008005|-|8|-|6|-|174087.69|-|43 +store|-|6008006|-|8|-|6|-|18420.16|-|7|-|store|-|6008006|-|8|-|6|-|19669.85|-|8 +store|-|6008007|-|8|-|6|-|33281.27|-|10|-|store|-|6008007|-|8|-|6|-|50246.87|-|12 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q15.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q15.out new file mode 100644 index 0000000000000..992a1c2e21195 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q15.out @@ -0,0 +1,100 @@ +null|-|742.19 +30026|-|468.98 +30029|-|309.48 +30059|-|434.21 +30069|-|1134.73 +30150|-|1046.35 +30162|-|440.63 +30169|-|1711.33 +30319|-|797.46 +30399|-|776.24 +30411|-|903.62 +30499|-|607.68 +30587|-|2682.97 +30618|-|414.39 +31087|-|1420.71 +31147|-|859.27 +31218|-|527.30 +31289|-|1119.41 +31387|-|1032.15 +31521|-|1043.94 +31675|-|297.62 +31749|-|1174.74 +31933|-|1259.74 +32244|-|225.19 +32293|-|1161.30 +32477|-|1260.68 +32812|-|528.36 +33003|-|1236.86 +33394|-|1357.63 +33445|-|1110.00 +33451|-|432.35 +33511|-|494.04 +33604|-|644.11 +33683|-|1158.61 +34098|-|1803.95 +34107|-|497.08 +34136|-|475.25 +34244|-|220.02 +34324|-|762.37 +34338|-|319.95 +34466|-|1723.86 +34536|-|1397.22 +34554|-|725.09 +34593|-|494.56 +34694|-|335.79 +34854|-|547.80 +34975|-|1164.85 +35038|-|742.84 +35281|-|2076.65 +35566|-|630.85 +35709|-|2210.23 +35752|-|501.30 +35804|-|487.50 +35817|-|980.26 +36060|-|884.79 +36074|-|370.98 +36098|-|1431.67 +36192|-|535.97 +36787|-|527.17 +36867|-|371.71 +36871|-|162.12 +36971|-|1620.25 +36997|-|558.86 +37057|-|1666.34 +37292|-|224.65 +37529|-|820.20 +37683|-|1190.50 +37746|-|1597.88 +37838|-|1475.85 +38014|-|2158.04 +38048|-|624.71 +38054|-|579.49 +38059|-|1321.24 +38075|-|134.11 +38222|-|392.10 +38252|-|651.53 +38370|-|1195.70 +38371|-|2707.36 +38482|-|284.32 +38605|-|816.34 +38721|-|397.70 +38828|-|2456.74 +38877|-|704.44 +38883|-|1025.03 +38971|-|579.13 +39003|-|426.02 +39101|-|2020.67 +39145|-|607.39 +39231|-|1425.95 +39237|-|457.70 +39275|-|547.50 +39303|-|916.90 +39310|-|194.20 +39391|-|883.37 +39431|-|1610.05 +39454|-|303.75 +39532|-|855.72 +39583|-|1940.60 +39584|-|1043.20 +39840|-|332.41 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q16.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q16.out new file mode 100644 index 0000000000000..a8d68fde5da9a --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q16.out @@ -0,0 +1 @@ +144|-|623722.65|-|-150157.92 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q17.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q17.out new file mode 100644 index 0000000000000..95891dd390985 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q17.out @@ -0,0 +1,2 @@ +AAAAAAAADOCAAAAA|-|Little, national services will buy young molecules. In part video-taped activities join now|-|TN|-|1|-|24.0|-|null|-|null|-|1|-|11.0|-|null|-|null|-|1|-|49.0|-|null|-|null +AAAAAAAAEBOBAAAA|-|Special words should tell by a follower|-|TN|-|1|-|66.0|-|null|-|null|-|1|-|38.0|-|null|-|null|-|1|-|56.0|-|null|-|null diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q18.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q18.out new file mode 100644 index 0000000000000..4ccd2252dafc4 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q18.out @@ -0,0 +1,100 @@ +AAAAAAAAAJAEAAAA|-|United States|-|WI|-|Waupaca County|-|81.0|-|131.730000|-|0.000000|-|23.710000|-|-4963.680000|-|1968.0|-|5.0 +AAAAAAAAAKDAAAAA|-|United States|-|WI|-|Waupaca County|-|69.0|-|47.510000|-|0.000000|-|5.700000|-|-2147.970000|-|1968.0|-|5.0 +AAAAAAAABHCDAAAA|-|United States|-|WI|-|Waupaca County|-|35.0|-|55.160000|-|0.000000|-|43.570000|-|-168.700000|-|1968.0|-|5.0 +AAAAAAAABIFCAAAA|-|United States|-|WI|-|Waupaca County|-|34.0|-|54.630000|-|0.000000|-|5.460000|-|-639.880000|-|1968.0|-|5.0 +AAAAAAAABKJCAAAA|-|United States|-|WI|-|Waupaca County|-|59.0|-|28.950000|-|0.000000|-|22.290000|-|406.510000|-|1968.0|-|5.0 +AAAAAAAADJAEAAAA|-|United States|-|WI|-|Waupaca County|-|26.0|-|91.300000|-|0.000000|-|34.690000|-|-446.940000|-|1968.0|-|5.0 +AAAAAAAAGOOBAAAA|-|United States|-|WI|-|Waupaca County|-|69.0|-|198.420000|-|0.000000|-|17.850000|-|-3675.630000|-|1968.0|-|5.0 +AAAAAAAAKLDCAAAA|-|United States|-|WI|-|Waupaca County|-|36.0|-|37.830000|-|0.000000|-|22.690000|-|-8.640000|-|1968.0|-|5.0 +AAAAAAAALJHBAAAA|-|United States|-|WI|-|Waupaca County|-|47.0|-|221.320000|-|0.000000|-|188.120000|-|4856.040000|-|1968.0|-|5.0 +AAAAAAAAMCADAAAA|-|United States|-|WI|-|Waupaca County|-|40.0|-|9.560000|-|0.000000|-|6.020000|-|69.200000|-|1968.0|-|5.0 +AAAAAAAANPBCAAAA|-|United States|-|WI|-|Waupaca County|-|23.0|-|114.890000|-|0.000000|-|96.500000|-|878.140000|-|1968.0|-|5.0 +AAAAAAAAOCIBAAAA|-|United States|-|WI|-|Waupaca County|-|83.0|-|27.110000|-|0.000000|-|17.350000|-|581.000000|-|1968.0|-|5.0 +AAAAAAAACJCAAAAA|-|United States|-|WI|-|Washburn County|-|14.0|-|119.730000|-|0.000000|-|13.170000|-|-675.220000|-|1964.0|-|5.0 +AAAAAAAACLMDAAAA|-|United States|-|WI|-|Washburn County|-|5.0|-|126.370000|-|0.000000|-|7.580000|-|-437.200000|-|1964.0|-|5.0 +AAAAAAAAECKDAAAA|-|United States|-|WI|-|Washburn County|-|44.0|-|36.890000|-|0.000000|-|4.790000|-|-878.680000|-|1964.0|-|5.0 +AAAAAAAAGJIAAAAA|-|United States|-|WI|-|Washburn County|-|25.0|-|159.050000|-|0.000000|-|33.400000|-|-718.250000|-|1964.0|-|5.0 +AAAAAAAAIJEEAAAA|-|United States|-|WI|-|Washburn County|-|35.0|-|143.290000|-|0.000000|-|55.880000|-|-1456.000000|-|1964.0|-|5.0 +AAAAAAAAKNODAAAA|-|United States|-|WI|-|Washburn County|-|15.0|-|88.400000|-|0.000000|-|19.440000|-|-786.450000|-|1964.0|-|5.0 +AAAAAAAALGCAAAAA|-|United States|-|WI|-|Washburn County|-|78.0|-|38.030000|-|0.000000|-|22.050000|-|-634.920000|-|1964.0|-|5.0 +AAAAAAAABPGAAAAA|-|United States|-|WI|-|Shawano County|-|59.0|-|102.120000|-|0.000000|-|30.630000|-|-2377.110000|-|1943.0|-|3.0 +AAAAAAAACBJCAAAA|-|United States|-|WI|-|Shawano County|-|44.0|-|137.230000|-|0.000000|-|131.740000|-|2836.680000|-|1943.0|-|3.0 +AAAAAAAACMIAAAAA|-|United States|-|WI|-|Shawano County|-|73.0|-|199.940000|-|3094.030000|-|79.970000|-|-3189.660000|-|1943.0|-|3.0 +AAAAAAAAFFOBAAAA|-|United States|-|WI|-|Shawano County|-|56.0|-|132.640000|-|0.000000|-|129.980000|-|4496.800000|-|1943.0|-|3.0 +AAAAAAAAGMHAAAAA|-|United States|-|WI|-|Shawano County|-|82.0|-|48.940000|-|0.000000|-|35.720000|-|635.500000|-|1943.0|-|3.0 +AAAAAAAAGNBCAAAA|-|United States|-|WI|-|Shawano County|-|41.0|-|167.640000|-|0.000000|-|110.640000|-|840.910000|-|1943.0|-|3.0 +AAAAAAAAIMFDAAAA|-|United States|-|WI|-|Shawano County|-|94.0|-|287.790000|-|0.000000|-|63.310000|-|-3377.420000|-|1943.0|-|3.0 +AAAAAAAAKMCCAAAA|-|United States|-|WI|-|Shawano County|-|92.0|-|51.690000|-|0.000000|-|50.130000|-|2810.600000|-|1943.0|-|3.0 +AAAAAAAAPFIDAAAA|-|United States|-|WI|-|Shawano County|-|69.0|-|27.150000|-|0.000000|-|14.660000|-|-632.040000|-|1943.0|-|3.0 +AAAAAAAAAECCAAAA|-|United States|-|WI|-|Outagamie County|-|40.0|-|81.220000|-|0.000000|-|51.160000|-|746.800000|-|1975.0|-|1.0 +AAAAAAAAAEPAAAAA|-|United States|-|WI|-|Outagamie County|-|73.0|-|85.250000|-|0.000000|-|3.410000|-|-4651.560000|-|1975.0|-|1.0 +AAAAAAAAAHNDAAAA|-|United States|-|WI|-|Outagamie County|-|51.0|-|63.060000|-|0.000000|-|5.040000|-|-2107.830000|-|1975.0|-|1.0 +AAAAAAAABKFAAAAA|-|United States|-|WI|-|Outagamie County|-|36.0|-|218.670000|-|0.000000|-|170.560000|-|2913.840000|-|1975.0|-|1.0 +AAAAAAAACOCCAAAA|-|United States|-|WI|-|Outagamie County|-|93.0|-|97.750000|-|0.000000|-|27.370000|-|-2649.570000|-|1975.0|-|1.0 +AAAAAAAADMHAAAAA|-|United States|-|WI|-|Outagamie County|-|11.0|-|64.240000|-|0.000000|-|10.920000|-|-330.000000|-|1975.0|-|1.0 +AAAAAAAAHJIBAAAA|-|United States|-|WI|-|Outagamie County|-|16.0|-|30.600000|-|0.000000|-|6.730000|-|-57.760000|-|1975.0|-|1.0 +AAAAAAAAKBGAAAAA|-|United States|-|WI|-|Outagamie County|-|23.0|-|179.850000|-|0.000000|-|120.490000|-|948.980000|-|1975.0|-|1.0 +AAAAAAAAKDEAAAAA|-|United States|-|WI|-|Outagamie County|-|36.0|-|3.170000|-|0.000000|-|1.040000|-|-15.480000|-|1975.0|-|1.0 +AAAAAAAAKOCAAAAA|-|United States|-|WI|-|Outagamie County|-|52.0|-|11.590000|-|89.990000|-|5.090000|-|-216.870000|-|1975.0|-|1.0 +AAAAAAAANEPCAAAA|-|United States|-|WI|-|Outagamie County|-|2.0|-|102.030000|-|9.300000|-|19.380000|-|-87.820000|-|1975.0|-|1.0 +AAAAAAAAOLCEAAAA|-|United States|-|WI|-|Outagamie County|-|6.0|-|112.560000|-|0.000000|-|0.000000|-|-296.220000|-|1975.0|-|1.0 +AAAAAAAAAAMBAAAA|-|United States|-|WI|-|Oneida County|-|1.0|-|37.170000|-|0.000000|-|30.100000|-|13.430000|-|1932.0|-|2.0 +AAAAAAAAAJJCAAAA|-|United States|-|WI|-|Oneida County|-|61.0|-|30.960000|-|0.000000|-|0.610000|-|-875.350000|-|1932.0|-|2.0 +AAAAAAAABJNCAAAA|-|United States|-|WI|-|Oneida County|-|68.0|-|194.120000|-|5044.890000|-|190.230000|-|2589.470000|-|1975.0|-|3.0 +AAAAAAAACEABAAAA|-|United States|-|WI|-|Oneida County|-|41.0|-|57.880000|-|0.000000|-|27.200000|-|31.570000|-|1975.0|-|3.0 +AAAAAAAACLBDAAAA|-|United States|-|WI|-|Oneida County|-|73.0|-|34.980000|-|0.000000|-|34.980000|-|510.270000|-|1975.0|-|3.0 +AAAAAAAAEANDAAAA|-|United States|-|WI|-|Oneida County|-|23.0|-|222.130000|-|0.000000|-|33.310000|-|-1494.540000|-|1932.0|-|2.0 +AAAAAAAAECICAAAA|-|United States|-|WI|-|Oneida County|-|95.0|-|16.230000|-|99.270000|-|2.750000|-|-654.070000|-|1932.0|-|2.0 +AAAAAAAAEELAAAAA|-|United States|-|WI|-|Oneida County|-|23.0|-|142.390000|-|2685.250000|-|116.750000|-|-1893.130000|-|1932.0|-|2.0 +AAAAAAAAEFJCAAAA|-|United States|-|WI|-|Oneida County|-|19.0|-|215.220000|-|272.330000|-|159.260000|-|1271.990000|-|1975.0|-|3.0 +AAAAAAAAEHPCAAAA|-|United States|-|WI|-|Oneida County|-|92.0|-|168.800000|-|0.000000|-|77.640000|-|-1631.160000|-|1975.0|-|3.0 +AAAAAAAAENGCAAAA|-|United States|-|WI|-|Oneida County|-|48.0|-|178.620000|-|0.000000|-|146.460000|-|3501.600000|-|1975.0|-|3.0 +AAAAAAAAFIMAAAAA|-|United States|-|WI|-|Oneida County|-|29.0|-|208.250000|-|0.000000|-|54.140000|-|-1078.800000|-|1932.0|-|2.0 +AAAAAAAAGLIDAAAA|-|United States|-|WI|-|Oneida County|-|58.0|-|156.600000|-|0.000000|-|87.690000|-|976.140000|-|1975.0|-|3.0 +AAAAAAAAGPNBAAAA|-|United States|-|WI|-|Oneida County|-|59.0|-|58.910000|-|0.000000|-|18.850000|-|-412.410000|-|1932.0|-|2.0 +AAAAAAAAIGLAAAAA|-|United States|-|WI|-|Oneida County|-|11.0|-|33.260000|-|0.000000|-|4.980000|-|-220.330000|-|1932.0|-|2.0 +AAAAAAAAIJBBAAAA|-|United States|-|WI|-|Oneida County|-|63.0|-|165.040000|-|0.000000|-|155.130000|-|4495.050000|-|1932.0|-|2.0 +AAAAAAAAIPCDAAAA|-|United States|-|WI|-|Oneida County|-|94.0|-|40.560000|-|204.830000|-|2.830000|-|-2093.290000|-|1932.0|-|2.0 +AAAAAAAAJFDCAAAA|-|United States|-|WI|-|Oneida County|-|68.0|-|62.160000|-|0.000000|-|49.720000|-|-393.040000|-|1932.0|-|2.0 +AAAAAAAAJOKBAAAA|-|United States|-|WI|-|Oneida County|-|79.0|-|196.560000|-|4965.640000|-|161.170000|-|1604.790000|-|1932.0|-|2.0 +AAAAAAAANHDCAAAA|-|United States|-|WI|-|Oneida County|-|31.0|-|132.090000|-|0.000000|-|113.590000|-|1934.090000|-|1975.0|-|3.0 +AAAAAAAACOBAAAAA|-|United States|-|WI|-|Marinette County|-|29.0|-|147.630000|-|764.500000|-|56.090000|-|-871.220000|-|1989.0|-|2.0 +AAAAAAAAELFAAAAA|-|United States|-|WI|-|Marinette County|-|29.0|-|105.980000|-|0.000000|-|73.120000|-|-338.430000|-|1989.0|-|2.0 +AAAAAAAAGLOAAAAA|-|United States|-|WI|-|Marinette County|-|24.0|-|140.260000|-|0.000000|-|63.110000|-|57.360000|-|1989.0|-|2.0 +AAAAAAAAGONCAAAA|-|United States|-|WI|-|Marinette County|-|79.0|-|53.220000|-|0.000000|-|11.170000|-|-1978.160000|-|1989.0|-|2.0 +AAAAAAAAHPBCAAAA|-|United States|-|WI|-|Marinette County|-|87.0|-|230.180000|-|16015.960000|-|214.060000|-|-5736.910000|-|1989.0|-|2.0 +AAAAAAAAKGEAAAAA|-|United States|-|WI|-|Marinette County|-|34.0|-|91.870000|-|0.000000|-|39.500000|-|-116.620000|-|1989.0|-|2.0 +AAAAAAAAKKEBAAAA|-|United States|-|WI|-|Marinette County|-|19.0|-|42.360000|-|0.000000|-|7.620000|-|-208.240000|-|1989.0|-|2.0 +AAAAAAAAKNEEAAAA|-|United States|-|WI|-|Marinette County|-|25.0|-|52.150000|-|119.940000|-|10.430000|-|-316.690000|-|1989.0|-|2.0 +AAAAAAAALADCAAAA|-|United States|-|WI|-|Marinette County|-|46.0|-|111.830000|-|0.000000|-|95.050000|-|2210.760000|-|1989.0|-|2.0 +AAAAAAAAMIPAAAAA|-|United States|-|WI|-|Marinette County|-|64.0|-|201.050000|-|0.000000|-|142.740000|-|4743.680000|-|1989.0|-|2.0 +AAAAAAAANNFAAAAA|-|United States|-|WI|-|Marinette County|-|49.0|-|86.010000|-|0.000000|-|81.700000|-|2394.630000|-|1989.0|-|2.0 +AAAAAAAAOGBCAAAA|-|United States|-|WI|-|Marinette County|-|54.0|-|42.100000|-|0.000000|-|12.630000|-|-1525.500000|-|1989.0|-|2.0 +AAAAAAAABPGDAAAA|-|United States|-|WI|-|Kenosha County|-|34.0|-|35.250000|-|0.000000|-|1.410000|-|-985.320000|-|1986.0|-|3.0 +AAAAAAAACMDDAAAA|-|United States|-|WI|-|Kenosha County|-|52.0|-|206.560000|-|0.000000|-|49.570000|-|-2611.440000|-|1986.0|-|3.0 +AAAAAAAACPECAAAA|-|United States|-|WI|-|Kenosha County|-|44.0|-|40.800000|-|0.000000|-|28.150000|-|-153.120000|-|1986.0|-|3.0 +AAAAAAAAGFKCAAAA|-|United States|-|WI|-|Kenosha County|-|15.0|-|94.100000|-|0.000000|-|27.280000|-|-840.000000|-|1986.0|-|3.0 +AAAAAAAAJBBCAAAA|-|United States|-|WI|-|Kenosha County|-|35.0|-|44.470000|-|0.000000|-|17.780000|-|-29.050000|-|1986.0|-|3.0 +AAAAAAAAJHKCAAAA|-|United States|-|WI|-|Kenosha County|-|51.0|-|162.870000|-|0.000000|-|76.540000|-|-148.410000|-|1986.0|-|3.0 +AAAAAAAAOBLAAAAA|-|United States|-|WI|-|Kenosha County|-|89.0|-|21.190000|-|0.000000|-|7.410000|-|-436.990000|-|1986.0|-|3.0 +AAAAAAAAPJHDAAAA|-|United States|-|WI|-|Kenosha County|-|63.0|-|28.810000|-|0.000000|-|3.740000|-|-481.950000|-|1986.0|-|3.0 +AAAAAAAABDGDAAAA|-|United States|-|WI|-|Juneau County|-|44.0|-|185.590000|-|360.930000|-|63.100000|-|-1794.010000|-|1983.0|-|1.0 +AAAAAAAACILCAAAA|-|United States|-|WI|-|Juneau County|-|72.0|-|107.730000|-|0.000000|-|12.920000|-|-3217.680000|-|1983.0|-|1.0 +AAAAAAAACJACAAAA|-|United States|-|WI|-|Juneau County|-|65.0|-|69.030000|-|0.000000|-|18.630000|-|-1353.300000|-|1983.0|-|1.0 +AAAAAAAAEMIBAAAA|-|United States|-|WI|-|Juneau County|-|94.0|-|101.070000|-|0.000000|-|80.850000|-|-384.460000|-|1983.0|-|1.0 +AAAAAAAAMBGEAAAA|-|United States|-|WI|-|Juneau County|-|84.0|-|77.180000|-|0.000000|-|49.390000|-|1090.320000|-|1983.0|-|1.0 +AAAAAAAAMCFDAAAA|-|United States|-|WI|-|Juneau County|-|62.0|-|35.470000|-|0.000000|-|30.850000|-|109.740000|-|1983.0|-|1.0 +AAAAAAAAMHPDAAAA|-|United States|-|WI|-|Juneau County|-|35.0|-|29.740000|-|0.000000|-|23.790000|-|407.750000|-|1983.0|-|1.0 +AAAAAAAAMMEDAAAA|-|United States|-|WI|-|Juneau County|-|73.0|-|7.460000|-|0.000000|-|6.040000|-|106.580000|-|1983.0|-|1.0 +AAAAAAAANNBEAAAA|-|United States|-|WI|-|Juneau County|-|81.0|-|45.820000|-|0.000000|-|45.820000|-|1285.470000|-|1983.0|-|1.0 +AAAAAAAACBHAAAAA|-|United States|-|WI|-|Jefferson County|-|10.0|-|211.360000|-|1141.720000|-|156.400000|-|-529.820000|-|1962.0|-|1.0 +AAAAAAAACGBCAAAA|-|United States|-|WI|-|Jefferson County|-|88.0|-|126.270000|-|0.000000|-|42.930000|-|-3081.760000|-|1962.0|-|1.0 +AAAAAAAACNJCAAAA|-|United States|-|WI|-|Jefferson County|-|3.0|-|102.710000|-|0.000000|-|84.220000|-|0.090000|-|1962.0|-|1.0 +AAAAAAAADMBAAAAA|-|United States|-|WI|-|Jefferson County|-|82.0|-|177.380000|-|0.000000|-|35.470000|-|-2707.640000|-|1962.0|-|1.0 +AAAAAAAAHEODAAAA|-|United States|-|WI|-|Jefferson County|-|68.0|-|49.640000|-|0.000000|-|20.350000|-|-1630.640000|-|1962.0|-|1.0 +AAAAAAAAJJFCAAAA|-|United States|-|WI|-|Jefferson County|-|68.0|-|34.330000|-|0.000000|-|9.950000|-|-829.600000|-|1962.0|-|1.0 +AAAAAAAAMFJCAAAA|-|United States|-|WI|-|Jefferson County|-|56.0|-|50.580000|-|612.310000|-|23.770000|-|-605.030000|-|1962.0|-|1.0 +AAAAAAAAMKEAAAAA|-|United States|-|WI|-|Jefferson County|-|13.0|-|2.840000|-|33.240000|-|2.780000|-|-17.510000|-|1962.0|-|1.0 +AAAAAAAANIMBAAAA|-|United States|-|WI|-|Jefferson County|-|18.0|-|132.140000|-|0.000000|-|88.530000|-|-69.840000|-|1962.0|-|1.0 +AAAAAAAAEHIBAAAA|-|United States|-|WI|-|Iowa County|-|51.0|-|98.490000|-|1966.740000|-|43.330000|-|-3197.370000|-|1950.0|-|0.0 +AAAAAAAAHEPCAAAA|-|United States|-|WI|-|Iowa County|-|27.0|-|37.460000|-|0.000000|-|13.860000|-|-24.030000|-|1950.0|-|0.0 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q19.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q19.out new file mode 100644 index 0000000000000..4febf1b1339f8 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q19.out @@ -0,0 +1,100 @@ +10003006|-|exportiunivamalg #6|-|642|-|ableesecally|-|46555.77 +4002002|-|importoedu pack #2|-|66|-|callycally|-|45105.84 +2003001|-|exportiimporto #1|-|510|-|baroughtanti|-|41278.26 +8012005|-|importomaxi #5|-|245|-|antieseable|-|36722.04 +3002001|-|importoexporti #1|-|27|-|ationable|-|34426.81 +7002004|-|importobrand #4|-|552|-|ableantianti|-|33021.19 +6008008|-|namelesscorp #8|-|222|-|ableableable|-|32280.92 +3001001|-|amalgexporti #1|-|662|-|ablecallycally|-|31724.51 +7011005|-|amalgnameless #5|-|144|-|eseeseought|-|31458.64 +7012005|-|importonameless #5|-|126|-|callyableought|-|30451.86 +3002001|-|importoexporti #1|-|534|-|eseprianti|-|30205.27 +4001001|-|amalgedu pack #1|-|15|-|antiought|-|30166.14 +2001002|-|amalgimporto #2|-|260|-|barcallyable|-|29899.11 +9013008|-|exportiunivamalg #8|-|385|-|antieingpri|-|29773.27 +6005007|-|scholarcorp #7|-|943|-|priesen st|-|29331.31 +10011001|-|amalgamalgamalg #1|-|898|-|eingn steing|-|29292.08 +2004001|-|edu packimporto #1|-|196|-|callyn stought|-|29278.51 +1004002|-|edu packamalg #2|-|30|-|barpri|-|29243.23 +1001001|-|amalgamalg #1|-|24|-|eseable|-|28406.50 +2003002|-|exportiimporto #2|-|39|-|n stpri|-|28391.84 +7015005|-|scholarnameless #5|-|400|-|barbarese|-|28381.56 +8006001|-|corpnameless #1|-|362|-|ablecallypri|-|28294.48 +8006007|-|corpnameless #7|-|663|-|pricallycally|-|28140.18 +2004001|-|edu packimporto #1|-|65|-|antically|-|27111.98 +5003002|-|exportischolar #2|-|295|-|antin stable|-|26619.24 +9002011|-|importomaxi #11|-|908|-|eingbarn st|-|26492.27 +4001001|-|amalgedu pack #1|-|700|-|barbaration|-|26430.74 +6016007|-|corpbrand #7|-|711|-|oughtoughtation|-|26325.25 +1004001|-|edu packamalg #1|-|252|-|ableantiable|-|26296.07 +6005003|-|scholarcorp #3|-|233|-|pripriable|-|25739.29 +4004002|-|edu packedu pack #2|-|63|-|prically|-|25657.97 +7005003|-|scholarbrand #3|-|270|-|barationable|-|25375.34 +5001001|-|amalgscholar #1|-|210|-|baroughtable|-|24534.26 +10003012|-|exportiunivamalg #12|-|216|-|callyoughtable|-|24471.37 +8011009|-|amalgmaxi #9|-|266|-|callycallyable|-|24198.39 +3004001|-|edu packexporti #1|-|140|-|bareseought|-|23672.77 +5003002|-|exportischolar #2|-|249|-|n steseable|-|23661.51 +8015001|-|scholarmaxi #1|-|597|-|ationn stanti|-|23472.32 +9011003|-|amalgunivamalg #3|-|300|-|barbarpri|-|23434.93 +8003005|-|exportinameless #5|-|624|-|eseablecally|-|23039.35 +4002001|-|importoedu pack #1|-|194|-|esen stought|-|22919.19 +4003001|-|exportiedu pack #1|-|342|-|ableesepri|-|22775.92 +3003002|-|exportiexporti #2|-|36|-|callypri|-|22745.61 +9011003|-|amalgunivamalg #3|-|824|-|eseableeing|-|22744.05 +2002002|-|importoimporto #2|-|21|-|oughtable|-|22700.20 +3003001|-|exportiexporti #1|-|193|-|prin stought|-|22599.79 +8009003|-|maxinameless #3|-|255|-|antiantiable|-|22344.96 +8010010|-|univmaxi #10|-|655|-|antiantically|-|22327.13 +2003001|-|exportiimporto #1|-|581|-|oughteinganti|-|22320.66 +7004005|-|edu packbrand #5|-|405|-|antibarese|-|22183.81 +10003009|-|exportiunivamalg #9|-|237|-|ationpriable|-|22096.22 +6007002|-|brandcorp #2|-|301|-|oughtbarpri|-|21666.33 +8015005|-|scholarmaxi #5|-|458|-|eingantiese|-|21589.55 +5002001|-|importoscholar #1|-|25|-|antiable|-|21572.34 +8002010|-|importonameless #10|-|437|-|ationpriese|-|21290.55 +3004002|-|edu packexporti #2|-|97|-|ationn st|-|21287.32 +4002002|-|importoedu pack #2|-|75|-|antiation|-|21156.38 +6009006|-|maxicorp #6|-|677|-|ationationcally|-|21020.68 +5004001|-|edu packscholar #1|-|465|-|anticallyese|-|20811.05 +4002001|-|importoedu pack #1|-|970|-|barationn st|-|20480.98 +3002001|-|importoexporti #1|-|41|-|oughtese|-|20430.90 +10001011|-|amalgunivamalg #11|-|651|-|oughtantically|-|20175.13 +1004001|-|edu packamalg #1|-|551|-|oughtantianti|-|20119.80 +9013009|-|exportiunivamalg #9|-|584|-|eseeinganti|-|20104.34 +4003001|-|exportiedu pack #1|-|599|-|n stn stanti|-|20057.50 +5003001|-|exportischolar #1|-|524|-|eseableanti|-|19997.36 +6014007|-|edu packbrand #7|-|924|-|eseablen st|-|19927.19 +8015006|-|scholarmaxi #6|-|190|-|barn stought|-|19822.24 +6015003|-|scholarbrand #3|-|198|-|eingn stought|-|19698.19 +10015004|-|scholaramalgamalg #4|-|591|-|oughtn stanti|-|19609.00 +1001001|-|amalgamalg #1|-|376|-|callyationpri|-|19535.52 +9009011|-|maximaxi #11|-|496|-|callyn stese|-|19277.51 +6005003|-|scholarcorp #3|-|506|-|callybaranti|-|18924.56 +7016007|-|corpnameless #7|-|151|-|oughtantiought|-|18772.05 +10010004|-|univamalgamalg #4|-|195|-|antin stought|-|18750.31 +2004002|-|edu packimporto #2|-|188|-|eingeingought|-|18343.17 +4003001|-|exportiedu pack #1|-|137|-|ationpriought|-|18246.30 +10005009|-|scholarunivamalg #9|-|153|-|priantiought|-|18119.49 +3003001|-|exportiexporti #1|-|818|-|eingoughteing|-|18053.49 +8003007|-|exportinameless #7|-|126|-|callyableought|-|17587.76 +3003001|-|exportiexporti #1|-|117|-|ationoughtought|-|17105.29 +8008007|-|namelessnameless #7|-|785|-|antieingation|-|16761.94 +4004001|-|edu packedu pack #1|-|69|-|n stcally|-|16675.72 +7016009|-|corpnameless #9|-|79|-|n station|-|16511.17 +3004002|-|edu packexporti #2|-|662|-|ablecallycally|-|16361.91 +3002001|-|importoexporti #1|-|619|-|n stoughtcally|-|16339.23 +4004001|-|edu packedu pack #1|-|45|-|antiese|-|16250.18 +6005001|-|scholarcorp #1|-|289|-|n steingable|-|16214.37 +9013009|-|exportiunivamalg #9|-|391|-|oughtn stpri|-|15992.60 +7014009|-|edu packnameless #9|-|179|-|n stationought|-|15936.25 +9007003|-|brandmaxi #3|-|238|-|eingpriable|-|15850.72 +3001001|-|amalgexporti #1|-|617|-|ationoughtcally|-|15794.60 +1003002|-|exportiamalg #2|-|544|-|eseeseanti|-|15324.30 +8002002|-|importonameless #2|-|64|-|esecally|-|15173.67 +3001002|-|amalgexporti #2|-|233|-|pripriable|-|15166.48 +6004008|-|edu packcorp #8|-|1|-|ought|-|14978.38 +10009017|-|maxiunivamalg #17|-|251|-|oughtantiable|-|14861.85 +2002001|-|importoimporto #1|-|336|-|callypripri|-|14793.11 +9006003|-|corpmaxi #3|-|219|-|n stoughtable|-|14785.83 +7011005|-|amalgnameless #5|-|645|-|antiesecally|-|14774.60 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q2.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q2.out new file mode 100644 index 0000000000000..08d497343c2c5 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q2.out @@ -0,0 +1,2513 @@ +5270|-|3.18|-|1.63|-|2.25|-|1.64|-|3.41|-|3.62|-|3.72 +5270|-|3.18|-|1.63|-|2.25|-|1.64|-|3.41|-|3.62|-|3.72 +5270|-|3.18|-|1.63|-|2.25|-|1.64|-|3.41|-|3.62|-|3.72 +5270|-|3.18|-|1.63|-|2.25|-|1.64|-|3.41|-|3.62|-|3.72 +5270|-|3.18|-|1.63|-|2.25|-|1.64|-|3.41|-|3.62|-|3.72 +5270|-|3.18|-|1.63|-|2.25|-|1.64|-|3.41|-|3.62|-|3.72 +5270|-|3.18|-|1.63|-|2.25|-|1.64|-|3.41|-|3.62|-|3.72 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5271|-|1.00|-|1.15|-|1.23|-|0.82|-|1.06|-|0.85|-|0.95 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5272|-|1.22|-|0.86|-|1.29|-|0.95|-|0.98|-|1.00|-|0.84 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5273|-|1.20|-|0.99|-|1.15|-|0.86|-|0.91|-|1.19|-|0.90 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5274|-|0.97|-|0.95|-|1.08|-|1.19|-|0.97|-|0.89|-|0.96 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5275|-|0.99|-|0.89|-|1.42|-|1.00|-|0.84|-|1.11|-|0.98 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5276|-|0.97|-|1.06|-|1.16|-|0.86|-|0.98|-|1.25|-|1.13 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5277|-|0.91|-|0.91|-|1.02|-|0.95|-|1.00|-|1.05|-|0.90 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5278|-|0.96|-|0.94|-|1.29|-|1.04|-|0.95|-|2.06|-|1.46 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5279|-|0.87|-|0.86|-|0.88|-|0.99|-|0.38|-|0.83|-|0.77 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5280|-|0.96|-|0.89|-|0.73|-|1.09|-|1.09|-|0.91|-|1.21 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5281|-|0.99|-|1.03|-|1.09|-|0.86|-|0.92|-|1.13|-|1.01 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5282|-|0.97|-|0.89|-|1.08|-|1.10|-|1.15|-|0.86|-|1.33 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5283|-|1.27|-|0.85|-|1.07|-|0.88|-|1.23|-|0.93|-|1.27 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5284|-|1.06|-|0.92|-|0.95|-|1.04|-|0.95|-|1.29|-|0.89 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5285|-|1.10|-|1.20|-|0.97|-|1.14|-|1.11|-|1.12|-|0.95 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5286|-|1.09|-|1.17|-|1.17|-|0.86|-|1.12|-|1.39|-|1.00 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5287|-|0.94|-|1.00|-|0.99|-|0.76|-|1.10|-|0.90|-|0.96 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5288|-|0.95|-|1.07|-|1.40|-|1.05|-|0.94|-|0.94|-|1.01 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5289|-|0.99|-|1.20|-|0.90|-|0.95|-|1.01|-|0.82|-|0.76 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5290|-|1.05|-|1.10|-|1.04|-|1.22|-|0.97|-|0.98|-|0.98 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5291|-|0.78|-|1.28|-|0.90|-|0.99|-|0.97|-|1.09|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5292|-|1.13|-|0.79|-|1.17|-|1.07|-|0.88|-|0.85|-|0.91 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5293|-|1.29|-|0.96|-|0.89|-|0.87|-|0.97|-|0.89|-|1.06 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5294|-|1.18|-|1.05|-|1.25|-|0.98|-|0.88|-|1.02|-|0.69 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5295|-|0.87|-|1.08|-|1.03|-|1.01|-|0.88|-|1.27|-|1.12 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5296|-|0.74|-|1.11|-|0.96|-|1.12|-|1.00|-|1.25|-|1.02 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5297|-|1.04|-|0.97|-|0.98|-|0.79|-|0.90|-|0.90|-|1.03 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5298|-|0.80|-|0.78|-|0.94|-|1.04|-|1.26|-|0.91|-|0.90 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5299|-|0.87|-|1.00|-|1.14|-|1.13|-|1.07|-|1.20|-|1.01 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5300|-|0.53|-|0.41|-|0.98|-|0.67|-|0.80|-|0.56|-|0.41 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5301|-|0.95|-|1.05|-|0.38|-|0.50|-|0.76|-|1.10|-|1.14 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5302|-|1.03|-|0.80|-|0.85|-|1.12|-|1.00|-|0.96|-|1.01 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5303|-|0.77|-|1.23|-|0.94|-|1.09|-|0.98|-|0.96|-|0.98 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5304|-|0.96|-|0.82|-|1.13|-|1.04|-|1.07|-|1.24|-|1.00 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5305|-|1.01|-|0.96|-|0.91|-|0.91|-|0.90|-|1.15|-|1.09 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5306|-|0.83|-|0.99|-|0.97|-|1.04|-|0.90|-|1.00|-|1.03 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5307|-|0.97|-|0.99|-|0.89|-|0.88|-|1.07|-|1.02|-|0.94 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5308|-|0.93|-|0.95|-|1.10|-|0.97|-|1.10|-|0.89|-|1.04 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5309|-|1.20|-|0.90|-|1.05|-|1.11|-|0.96|-|1.05|-|1.06 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5310|-|0.97|-|1.10|-|1.12|-|1.06|-|0.96|-|1.03|-|0.87 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5311|-|1.09|-|0.88|-|1.06|-|1.01|-|0.91|-|1.10|-|1.03 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5312|-|1.06|-|0.93|-|0.78|-|0.99|-|1.03|-|0.87|-|1.07 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5313|-|0.62|-|0.78|-|1.13|-|1.03|-|1.13|-|1.04|-|0.85 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5314|-|0.98|-|1.16|-|0.71|-|0.57|-|0.70|-|1.07|-|1.06 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5315|-|1.10|-|1.09|-|0.99|-|1.02|-|1.11|-|1.00|-|1.02 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5316|-|1.01|-|1.07|-|1.09|-|1.01|-|1.08|-|1.03|-|0.87 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5317|-|0.96|-|1.04|-|0.94|-|0.99|-|1.09|-|0.95|-|0.88 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5318|-|0.94|-|1.00|-|1.18|-|0.94|-|0.87|-|1.02|-|1.11 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5319|-|0.97|-|0.96|-|0.96|-|1.12|-|1.00|-|0.93|-|0.88 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5320|-|1.06|-|0.94|-|0.97|-|1.14|-|0.96|-|0.90|-|1.04 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5321|-|0.96|-|1.01|-|0.96|-|1.03|-|0.97|-|0.95|-|0.89 +5322|-|4.54|-|4.72|-|0.99|-|1.74|-|1.43|-|4.36|-|5.11 +5322|-|4.54|-|4.72|-|0.99|-|1.74|-|1.43|-|4.36|-|5.11 +5322|-|4.54|-|4.72|-|0.99|-|1.74|-|1.43|-|4.36|-|5.11 +5322|-|4.54|-|4.72|-|0.99|-|1.74|-|1.43|-|4.36|-|5.11 +5322|-|4.54|-|4.72|-|0.99|-|1.74|-|1.43|-|4.36|-|5.11 +5322|-|4.54|-|4.72|-|0.99|-|1.74|-|1.43|-|4.36|-|5.11 +5322|-|4.54|-|4.72|-|0.99|-|1.74|-|1.43|-|4.36|-|5.11 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q20.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q20.out new file mode 100644 index 0000000000000..63ab833596be5 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q20.out @@ -0,0 +1,100 @@ +AAAAAAAAABHCAAAA|-|Level children shall exist finally other, patient costs. Adequate values come very children. Reforms ought to profit too as black troops. Nev|-|Books|-|arts|-|6.23|-|2523.40|-|0.85738795133105283 +AAAAAAAAADDBAAAA|-|Resulting, great occasions ought to expe|-|Books|-|arts|-|5.06|-|10220.68|-|3.47273039803846598 +AAAAAAAAAFPCAAAA|-|Ordinary managers will remember. Bad, central words coul|-|Books|-|arts|-|6.93|-|8896.85|-|3.02292620860730657 +AAAAAAAAALAAAAAA|-|Large affairs assume. Contents sign only; heavy areas disturb local areas; drivers turn profits. Home early children obtain prime, old instruments. Advantages shall not announce gently |-|Books|-|arts|-|7.09|-|2399.03|-|0.81513014856215252 +AAAAAAAAAMJBAAAA|-|Expected, high classes expect; thus wooden values exclude probably below norma|-|Books|-|arts|-|1.15|-|2330.45|-|0.79182838677159867 +AAAAAAAAAODCAAAA|-|Political weeks see rel|-|Books|-|arts|-|2.07|-|1373.90|-|0.46681671805252179 +AAAAAAAAAPEEAAAA|-|Complete meals must argue too employers. Hours will feel here patients. Literally diffe|-|Books|-|arts|-|32.27|-|1255.11|-|0.42645485915634371 +AAAAAAAABKLDAAAA|-|Forward psychological plants establish closely yet eastern changes. Likewise necessary techniques might drop. Pleasant operations like lonely things; dogs let regions. Forces might not result clearl|-|Books|-|arts|-|2.43|-|9387.24|-|3.18954841572993278 +AAAAAAAACBDEAAAA|-|Banks might learn so. Governments fight subject, technical nations. Only original scholars would work merely experts. Hands lodge socially special, large armies. Small, full days arise to a y|-|Books|-|arts|-|8.93|-|5073.68|-|1.72390905164038049 +AAAAAAAACCPDAAAA|-|Here african objectives will not know good times. Leaders must sell yet in the developments. |-|Books|-|arts|-|1.14|-|8597.07|-|2.92106849280718648 +AAAAAAAACEGCAAAA|-|Democratic days waste so. Books walk futur|-|Books|-|arts|-|0.60|-|886.54|-|0.30122402883927700 +AAAAAAAACGIAAAAA|-|Artists ought to take still mysterious, sexual horses. Copies should not|-|Books|-|arts|-|3.81|-|4501.24|-|1.52940831499143546 +AAAAAAAACIKAAAAA|-|Big, necessary countries arise furt|-|Books|-|arts|-|1.48|-|13656.56|-|4.64015613879274109 +AAAAAAAACKOAAAAA|-|Only small owners think however formal waters. Fond loans would provide. Act|-|Books|-|arts|-|2.64|-|5879.27|-|1.99762830332968177 +AAAAAAAACMPCAAAA|-|Even new adults shall resume in a hands. New boys grasp. Clear, bad firms ought to participate of course upon a opportunities. Sometimes hard options ought to admit actually within|-|Books|-|arts|-|3.13|-|20656.11|-|7.01842745318573104 +AAAAAAAADLLDAAAA|-|Black, following services justify by a investors; dirty, different charts will fly however prizes. Temporary, l|-|Books|-|arts|-|5.56|-|7400.98|-|2.51466714751608758 +AAAAAAAAEAMAAAAA|-|Classes used to pay frantically well civil reports. Major, certain coins start as a hours; so pink things will not say directly after a orders. Normal yards will take there vast pages. Extra pupil|-|Books|-|arts|-|7.70|-|6065.81|-|2.06100991085971847 +AAAAAAAAEIPCAAAA|-|Public, geographical methods may choke responsi|-|Books|-|arts|-|4.91|-|5.58|-|0.00189594387272223 +AAAAAAAAELBDAAAA|-|Metres sell low men. At least other|-|Books|-|arts|-|9.73|-|9946.35|-|3.37951995312737471 +AAAAAAAAFCIBAAAA|-|United, important objectives put similarly large, previous phenomena; old, present days receive. Happy detectives assi|-|Books|-|arts|-|1.26|-|500.14|-|0.16993501227657635 +AAAAAAAAFFIBAAAA|-|Naturally new years put serious, negative vehicles. Fin|-|Books|-|arts|-|3.34|-|2580.93|-|0.87693520061379654 +AAAAAAAAFJGCAAAA|-|Ago correct profits must not handle else. Healthy children may not go only ancient words. Later just characters ought to drink about. British parts must watch soon ago other clients. So vital d|-|Books|-|arts|-|4.03|-|1541.36|-|0.52371542072744376 +AAAAAAAAFLNCAAAA|-|Much new waters |-|Books|-|arts|-|1.85|-|1303.04|-|0.44274026951827498 +AAAAAAAAGAFAAAAA|-|Immediately usual reactions shall want strong criteria; homes will happen newspapers. Obligations |-|Books|-|arts|-|0.10|-|4208.10|-|1.42980670444487732 +AAAAAAAAGEJAAAAA|-|Hands might not make; good, different advertisements bear top, far facilities. Women could persuade yet. Copies lie long markets. Particular places could not ask. Numerous, old count|-|Books|-|arts|-|9.99|-|26357.83|-|8.95572872522476194 +AAAAAAAAGODDAAAA|-|Details|-|Books|-|arts|-|3.74|-|21536.48|-|7.31755507096861088 +AAAAAAAAHHEBAAAA|-|Powerful walls will find; there scottish decades must not|-|Books|-|arts|-|4.16|-|12009.83|-|4.08063863816050497 +AAAAAAAAHMCEAAAA|-|Too executive doors progress mainly seemingly possible parts; hundreds stay virtually simple workers. Sola|-|Books|-|arts|-|34.32|-|0.00|-|0E-17 +AAAAAAAAIBPCAAAA|-|Able issues bother however political services. French teachers will act voices. Pregnant, existing cases make by th|-|Books|-|arts|-|84.47|-|3671.84|-|1.24759902322874417 +AAAAAAAAIHMCAAAA|-|Scarcely crucial groups may bring especially effective, important losses. Now new drugs wan|-|Books|-|arts|-|8.52|-|21292.60|-|7.23469077138447156 +AAAAAAAAIJADAAAA|-|Strong, natural agencies can repeat proposed, main p|-|Books|-|arts|-|2.43|-|14950.51|-|5.07980785458287179 +AAAAAAAAINLAAAAA|-|Children come. Bad kinds love then also old owners. Never long effects come other, responsible words. Very particular iss|-|Books|-|arts|-|8.27|-|4477.68|-|1.52140321863994160 +AAAAAAAAJGHDAAAA|-|Circumstances would not use. Principles seem writers. Times go from a hands. Members find grounds. Central, only teachers pursue properly into a p|-|Books|-|arts|-|5.95|-|1116.65|-|0.37940962822137598 +AAAAAAAAJLHBAAAA|-|Inches may lose from a problems. Firm, other corporations shall protect ashamed, important practices. Materials shall not make then by a police. Weeks used|-|Books|-|arts|-|0.84|-|5258.72|-|1.78678099683904024 +AAAAAAAAKMAAAAAA|-|Delicate, young activities ask other patients. Initial police may make western, everyday earnings. At present major values would not f|-|Books|-|arts|-|0.43|-|16134.60|-|5.48213190122295515 +AAAAAAAALCFBAAAA|-|More than key reasons should remain. Words used to offer slowly british|-|Books|-|arts|-|0.28|-|9708.76|-|3.29879283758614270 +AAAAAAAALGEEAAAA|-|Children may turn also above, historical aspects. Surveys migh|-|Books|-|arts|-|7.22|-|3706.94|-|1.25952512178296465 +AAAAAAAALOKCAAAA|-|Trustees know operations. Now past issues cut today german governments. British lines go critical, individual structures. Tonight adequate problems should no|-|Books|-|arts|-|4.05|-|14319.69|-|4.86547105999673612 +AAAAAAAAMBABAAAA|-|Just late patients shall not go hard very able models. In addition exclusive resources go dirty standards. Continuous, good concepts might know much du|-|Books|-|arts|-|1.18|-|1750.32|-|0.59471478123712784 +AAAAAAAAMKJAAAAA|-|Formal matters must admire much. Capable rules rise however. Harder only studies would show more. Old stones oppose common, secure police. Opinions come grey, appropriate systems. Eye|-|Books|-|arts|-|9.20|-|33.44|-|0.01136207224082999 +AAAAAAAAMMICAAAA|-|Real scales get just features. Controls describe political interests. Devices lie. |-|Books|-|arts|-|0.89|-|1982.88|-|0.67373282909380916 +AAAAAAAANMECAAAA|-|Floors could not go only for a years. Special reasons shape consequently black, concerned instances. Mutual depths encourage both simple teachers. Cards favour massive |-|Books|-|arts|-|1.83|-|1311.20|-|0.44551283260096555 +AAAAAAAAOFICAAAA|-|Else emotional lives declare also c|-|Books|-|arts|-|4.47|-|334.40|-|0.11362072240829994 +AAAAAAAAOKHDAAAA|-|Responsible arts permit. Fresh, elderly figures refer much long certain prayers. Almost romantic assumptions date however european, innocent cou|-|Books|-|arts|-|7.86|-|1006.32|-|0.34192226487416386 +AAAAAAAAOMMDAAAA|-|Concerned, clear trousers may not assist successful things. L|-|Books|-|arts|-|9.40|-|1325.79|-|0.45047014821082529 +AAAAAAAAPEBCAAAA|-|Similar situations come separate programmes. National, large others could not ask opportunities. Severe, large findings accept; twins go more. Tiny rights may see specifi|-|Books|-|arts|-|1.27|-|836.61|-|0.28425906870217647 +AAAAAAAAAADEAAAA|-|Later national activities wake yet expenses. Variable days choose typically light, final feet. So scottish pro|-|Books|-|business|-|0.90|-|2306.76|-|0.90054177498268902 +AAAAAAAAADKBAAAA|-|Primary, past authorities say well at a teeth; stores want much usually important sites; late |-|Books|-|business|-|0.26|-|5847.75|-|2.28291767008922459 +AAAAAAAABBLDAAAA|-|Natural plans might not like n|-|Books|-|business|-|4.29|-|1137.94|-|0.44424322748088277 +AAAAAAAABDMAAAAA|-|Imports involve most now indian women. Developments announce intimately in a copies. Projects |-|Books|-|business|-|3.26|-|12061.60|-|4.70875802993428094 +AAAAAAAABINDAAAA|-|Years shall want free objects. Old residents use absolutely so residential steps. Letters will share variables. Sure fres|-|Books|-|business|-|40.76|-|30.36|-|0.01185231592730689 +AAAAAAAACEHDAAAA|-|Catholic men understand new conditions; he|-|Books|-|business|-|1.48|-|4496.43|-|1.75537249357775078 +AAAAAAAACMIBAAAA|-|Most good days may continue images. Most human lives must reject thus quietly legitimate pounds. More senior schools concentrate more than prime hours. No doubt normal|-|Books|-|business|-|6.58|-|1573.56|-|0.61430600298330131 +AAAAAAAACMIDAAAA|-|Lightly central chang|-|Books|-|business|-|0.51|-|3149.05|-|1.22936546346791034 +AAAAAAAAEDJDAAAA|-|Social, special others approach today up to a positions. Senior fears|-|Books|-|business|-|0.15|-|749.36|-|0.29254451460101087 +AAAAAAAAEDKDAAAA|-|Minor, single things could cry too profits. Examples focus material, young observations. Existing tensions would stop away. Facilities reply most thoroughly small|-|Books|-|business|-|1.24|-|1203.45|-|0.46981783935169550 +AAAAAAAAEEDDAAAA|-|Open, moving millions cool doubtfully good children. Popular, aware cities work men. Successful races may see away. New, good issu|-|Books|-|business|-|2.38|-|1853.20|-|0.72347535825049823 +AAAAAAAAELBAAAAA|-|Immense panels take just. Small workers ignore home. Professionals must not show prime, difficult complaints; finally royal documents must ef|-|Books|-|business|-|1.72|-|3601.27|-|1.40590875426655070 +AAAAAAAAEMMBAAAA|-|Polls may not change in order logical shoulders. Left times leave|-|Books|-|business|-|3.01|-|54.63|-|0.02132714160437336 +AAAAAAAAFDLAAAAA|-|Popular, different parameters might take open, used modules. Prisoners use pretty alternative lovers. Annual, professional others spend once true men. Other, small subsidies seem politically|-|Books|-|business|-|7.25|-|404.82|-|0.15803868688051300 +AAAAAAAAFEGEAAAA|-|Supreme, free uses handle even in the customers. Other minutes might not make of course social neighbours. So environmental rights come other, able sales|-|Books|-|business|-|8.08|-|2125.44|-|0.82975580910853602 +AAAAAAAAFHFCAAAA|-|Sound, original activities consider quite to a attitudes. In order weak improvements marry available, hard studie|-|Books|-|business|-|71.27|-|1863.13|-|0.72735195565359959 +AAAAAAAAGANDAAAA|-|Simple functions contain then wide |-|Books|-|business|-|9.71|-|812.02|-|0.31700650788180961 +AAAAAAAAGCJCAAAA|-|Careful universities may find cultural methods; artificial, apparent sections ought to tell highly reforms. Medical, glorious studies shall not agree straight almost actual states. Enough n|-|Books|-|business|-|5.70|-|2039.00|-|0.79601028246965567 +AAAAAAAAGDBDAAAA|-|Safe, strong houses could find. Customers will exploit useful, old views. National, internal paintings must use normally p|-|Books|-|business|-|5.16|-|1954.44|-|0.76299869370769683 +AAAAAAAAGGHBAAAA|-|Big calculations may find quickly. Separate, unemployed languages choose never. Really red regulations could not remem|-|Books|-|business|-|6.23|-|4290.12|-|1.67483061943536988 +AAAAAAAAGIKBAAAA|-|Shows say though new months. D|-|Books|-|business|-|3.66|-|3045.06|-|1.18876854866947018 +AAAAAAAAGJODAAAA|-|Therefore gay reserves increase political po|-|Books|-|business|-|2.86|-|2412.23|-|0.94171647066296101 +AAAAAAAAGMDBAAAA|-|Settlements relocate colleagues. Well |-|Books|-|business|-|8.18|-|15769.80|-|6.15641145291318097 +AAAAAAAAGPBAAAAA|-|Members aid ago. Blind trends used to get actions. Important notes might suffer rarely moral others. Members make. Just full rivals say elsewhere. Small factors may abandon; im|-|Books|-|business|-|1.46|-|3234.56|-|1.26274792509320718 +AAAAAAAAGPKBAAAA|-|More than silly doors cannot attain about british afraid flights. Quietly busy prices ought to explain now local details.|-|Books|-|business|-|0.20|-|0.00|-|0E-17 +AAAAAAAAHAADAAAA|-|British instructions will not distinguish blue results; great periods fill delicious, big years. Emotions cannot go results. Quick,|-|Books|-|business|-|5.91|-|13457.28|-|5.25362101720120052 +AAAAAAAAHDLBAAAA|-|Classic issues will draw as european, engl|-|Books|-|business|-|75.64|-|7726.54|-|3.01638317210058525 +AAAAAAAAHJAAAAAA|-|Again british shareholders see shares. American lives ought to establish horses. Then ideal conservatives might charge even nec|-|Books|-|business|-|2.44|-|6353.81|-|2.48047969242693619 +AAAAAAAAHKACAAAA|-|Critical cases tell anywhere to the circumstances. Dependent, new numbers must not|-|Books|-|business|-|3.72|-|13654.75|-|5.33071182175209944 +AAAAAAAAHLKAAAAA|-|Confident, video-tape|-|Books|-|business|-|3.17|-|6909.23|-|2.69731148795871459 +AAAAAAAAIAAAAAAA|-|International countries might not steal more. Differences will give devices. New, naval eyes c|-|Books|-|business|-|4.22|-|12416.12|-|4.84715997468226639 +AAAAAAAAIAIBAAAA|-|Conventional emissions push now. Unable, familiar pupil|-|Books|-|business|-|4.79|-|4476.69|-|1.74766614587007496 +AAAAAAAAIFHAAAAA|-|English investors will want naturally strong kinds. Main, other winners go big, growing combina|-|Books|-|business|-|7.42|-|11093.75|-|4.33091666069040833 +AAAAAAAAIJIAAAAA|-|Firm managers will not walk at a g|-|Books|-|business|-|6.93|-|2774.52|-|1.08315176504056354 +AAAAAAAAILOBAAAA|-|New cr|-|Books|-|business|-|5.44|-|4887.30|-|1.90796520525451111 +AAAAAAAAIONCAAAA|-|Dead contributions could chart therefore on a matters; open, inc children can diminish by a things. Unknown, inc cars consider to a investments.|-|Books|-|business|-|2.85|-|6635.30|-|2.59037127379642289 +AAAAAAAAJFBEAAAA|-|Paintings must not know primary, royal stands; similar, available others ough|-|Books|-|business|-|0.39|-|38.64|-|0.01508476572566331 +AAAAAAAAJJGBAAAA|-|Most present eyes restore fat, central relationships; again considerable habits must face in a discussions. Engineers help at all direct occasions. Curiously del|-|Books|-|business|-|80.10|-|6510.24|-|2.54154878928163371 +AAAAAAAAKCMBAAAA|-|Tra|-|Books|-|business|-|1.64|-|1115.10|-|0.43532666306126191 +AAAAAAAAKFFAAAAA|-|Ways tell actually more limited models. Girls think|-|Books|-|business|-|4.98|-|4068.36|-|1.58825718135765000 +AAAAAAAAKIMCAAAA|-|However dangerous jobs deserve much continuing, magnetic cards. Today key drugs happe|-|Books|-|business|-|82.91|-|10839.95|-|4.23183504730600490 +AAAAAAAAKIPCAAAA|-|Young countries should restore increasingly others. Combined, large activities match in a cases. Positions can |-|Books|-|business|-|1.02|-|3846.08|-|1.50148073918631353 +AAAAAAAAKKLBAAAA|-|Great, valid factors should not say able centres. Lazily cu|-|Books|-|business|-|5.02|-|1635.01|-|0.63829562135395376 +AAAAAAAAKNCBAAAA|-|Slowly alternative items would portray perfectly boys; for example hard items treat hence appropriate wea|-|Books|-|business|-|1.88|-|658.49|-|0.25706954924151229 +AAAAAAAAKPGAAAAA|-|Hard genuine samples can create. Services arrive. Human, vast years should love on a surveys. Excellent, essential numbers result more historical, social actions. There exciting things join so|-|Books|-|business|-|3.72|-|1193.01|-|0.46574214177985479 +AAAAAAAALAJCAAAA|-|Asleep children invite more. Wealthy forms could expect as. Indeed statistical examinations could la|-|Books|-|business|-|3.71|-|607.62|-|0.23721028339098194 +AAAAAAAALDHBAAAA|-|Most new weeks go yet members. Also encouraging delegates make publications. Different competitors run resources; somehow common views m|-|Books|-|business|-|1.07|-|2488.13|-|0.97134726048122823 +AAAAAAAALHMBAAAA|-|Local, bloody names |-|Books|-|business|-|4.40|-|3475.04|-|1.35662951054112420 +AAAAAAAALJJCAAAA|-|Large, larg|-|Books|-|business|-|3.50|-|596.75|-|0.23296671704941982 +AAAAAAAALOMDAAAA|-|Only new systems might join late speeches. Materials could stay on a benefits. Corporate regulations must crawl definitely practical deaths. Windows might soothe despite a organisations. Old|-|Books|-|business|-|0.67|-|5455.35|-|2.12972765790624623 +AAAAAAAAMENAAAAA|-|Powerful members should make especially. Alternative, significant names travel. Academic, sexual claims think unconsciously negotiation|-|Books|-|business|-|2.01|-|5430.70|-|2.12010448308384456 +AAAAAAAAMFDCAAAA|-|Here genuine details shall not come. Great publications look reactions. Rural, other men could travel still. So wide things might ride on a books. Diverse, di|-|Books|-|business|-|1.42|-|317.46|-|0.12393399915292638 +AAAAAAAAMGABAAAA|-|Huge, ancient problems survive much outstanding, important lawyers. Complete styles would say unlikely, natural children. Western relations get precious prisoners. Large, able techniq|-|Books|-|business|-|29.84|-|4066.20|-|1.58741393358416571 +AAAAAAAAMKKDAAAA|-|Long years sl|-|Books|-|business|-|9.91|-|238.85|-|0.09324524569292656 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q21.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q21.out new file mode 100644 index 0000000000000..efd3ab59a657c --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q21.out @@ -0,0 +1,100 @@ +Just good amou|-|AAAAAAAAAAEAAAAA|-|1789|-|2518 +Just good amou|-|AAAAAAAAABHCAAAA|-|1716|-|2461 +Just good amou|-|AAAAAAAAACBEAAAA|-|2920|-|3183 +Just good amou|-|AAAAAAAAACKCAAAA|-|1630|-|2281 +Just good amou|-|AAAAAAAAADBBAAAA|-|2215|-|2274 +Just good amou|-|AAAAAAAAAEGEAAAA|-|1694|-|1855 +Just good amou|-|AAAAAAAAAELBAAAA|-|2550|-|1912 +Just good amou|-|AAAAAAAAAFBBAAAA|-|1560|-|2247 +Just good amou|-|AAAAAAAAAFJDAAAA|-|2954|-|3366 +Just good amou|-|AAAAAAAAAGEBAAAA|-|1788|-|1505 +Just good amou|-|AAAAAAAAAGICAAAA|-|2402|-|2785 +Just good amou|-|AAAAAAAAAGLDAAAA|-|1812|-|2006 +Just good amou|-|AAAAAAAAAGPCAAAA|-|2426|-|1823 +Just good amou|-|AAAAAAAAAHBAAAAA|-|2629|-|2421 +Just good amou|-|AAAAAAAAAHDDAAAA|-|2355|-|1679 +Just good amou|-|AAAAAAAAAHKCAAAA|-|1547|-|1384 +Just good amou|-|AAAAAAAAAIGDAAAA|-|1479|-|1531 +Just good amou|-|AAAAAAAAAINCAAAA|-|2119|-|2171 +Just good amou|-|AAAAAAAAAJDEAAAA|-|2172|-|1462 +Just good amou|-|AAAAAAAAAJIDAAAA|-|3195|-|3330 +Just good amou|-|AAAAAAAAAJOAAAAA|-|1453|-|1990 +Just good amou|-|AAAAAAAAAKABAAAA|-|1627|-|2399 +Just good amou|-|AAAAAAAAALAAAAAA|-|1883|-|1904 +Just good amou|-|AAAAAAAAALOBAAAA|-|2300|-|2831 +Just good amou|-|AAAAAAAAALPAAAAA|-|2339|-|3042 +Just good amou|-|AAAAAAAAAMDBAAAA|-|2892|-|3131 +Just good amou|-|AAAAAAAAANGDAAAA|-|2416|-|3482 +Just good amou|-|AAAAAAAAANLCAAAA|-|1624|-|2279 +Just good amou|-|AAAAAAAAAOKBAAAA|-|2689|-|3215 +Just good amou|-|AAAAAAAABABCAAAA|-|2332|-|2966 +Just good amou|-|AAAAAAAABADAAAAA|-|2298|-|1565 +Just good amou|-|AAAAAAAABCCCAAAA|-|2501|-|2104 +Just good amou|-|AAAAAAAABDCBAAAA|-|2012|-|1480 +Just good amou|-|AAAAAAAABECDAAAA|-|2780|-|2805 +Just good amou|-|AAAAAAAABEJCAAAA|-|1919|-|2391 +Just good amou|-|AAAAAAAABEMCAAAA|-|2032|-|1772 +Just good amou|-|AAAAAAAABGECAAAA|-|2410|-|2323 +Just good amou|-|AAAAAAAABGIBAAAA|-|3419|-|2458 +Just good amou|-|AAAAAAAABHACAAAA|-|1634|-|1806 +Just good amou|-|AAAAAAAABHPCAAAA|-|2208|-|2559 +Just good amou|-|AAAAAAAABLBDAAAA|-|1269|-|1751 +Just good amou|-|AAAAAAAABLEDAAAA|-|2266|-|2354 +Just good amou|-|AAAAAAAABLOCAAAA|-|2117|-|1960 +Just good amou|-|AAAAAAAABMCBAAAA|-|3047|-|3121 +Just good amou|-|AAAAAAAABMOBAAAA|-|1650|-|1393 +Just good amou|-|AAAAAAAABNEBAAAA|-|2528|-|2332 +Just good amou|-|AAAAAAAABOKDAAAA|-|1752|-|1480 +Just good amou|-|AAAAAAAABPPAAAAA|-|1943|-|2433 +Just good amou|-|AAAAAAAACALBAAAA|-|1816|-|2390 +Just good amou|-|AAAAAAAACBGEAAAA|-|1803|-|2676 +Just good amou|-|AAAAAAAACBHBAAAA|-|1999|-|1854 +Just good amou|-|AAAAAAAACBICAAAA|-|1517|-|2093 +Just good amou|-|AAAAAAAACBJCAAAA|-|2259|-|2106 +Just good amou|-|AAAAAAAACBMCAAAA|-|1464|-|1242 +Just good amou|-|AAAAAAAACBNAAAAA|-|2123|-|2298 +Just good amou|-|AAAAAAAACCABAAAA|-|2233|-|2082 +Just good amou|-|AAAAAAAACCJBAAAA|-|1697|-|2242 +Just good amou|-|AAAAAAAACDCDAAAA|-|2827|-|2097 +Just good amou|-|AAAAAAAACDIBAAAA|-|2060|-|2342 +Just good amou|-|AAAAAAAACEACAAAA|-|1748|-|2594 +Just good amou|-|AAAAAAAACFGAAAAA|-|2192|-|2134 +Just good amou|-|AAAAAAAACFPAAAAA|-|1778|-|1907 +Just good amou|-|AAAAAAAACGCBAAAA|-|2649|-|2808 +Just good amou|-|AAAAAAAACGEBAAAA|-|1458|-|1722 +Just good amou|-|AAAAAAAACGFAAAAA|-|2322|-|1865 +Just good amou|-|AAAAAAAACGJDAAAA|-|2825|-|2063 +Just good amou|-|AAAAAAAACGMAAAAA|-|1530|-|2195 +Just good amou|-|AAAAAAAACIICAAAA|-|2139|-|1770 +Just good amou|-|AAAAAAAACIJBAAAA|-|2605|-|3469 +Just good amou|-|AAAAAAAACJDDAAAA|-|1565|-|1588 +Just good amou|-|AAAAAAAACJNCAAAA|-|3081|-|3590 +Just good amou|-|AAAAAAAACKCAAAAA|-|1474|-|1596 +Just good amou|-|AAAAAAAACKPCAAAA|-|2185|-|2322 +Just good amou|-|AAAAAAAACLGAAAAA|-|2797|-|1890 +Just good amou|-|AAAAAAAACMFBAAAA|-|2447|-|3370 +Just good amou|-|AAAAAAAACMLDAAAA|-|2071|-|2352 +Just good amou|-|AAAAAAAACNDEAAAA|-|2087|-|2790 +Just good amou|-|AAAAAAAACNIAAAAA|-|2466|-|2647 +Just good amou|-|AAAAAAAACODAAAAA|-|2253|-|2046 +Just good amou|-|AAAAAAAADAEAAAAA|-|1666|-|2439 +Just good amou|-|AAAAAAAADBECAAAA|-|1884|-|2204 +Just good amou|-|AAAAAAAADBGAAAAA|-|2373|-|1808 +Just good amou|-|AAAAAAAADDOCAAAA|-|2372|-|2300 +Just good amou|-|AAAAAAAADEHCAAAA|-|2389|-|2408 +Just good amou|-|AAAAAAAADFJCAAAA|-|2024|-|2170 +Just good amou|-|AAAAAAAADFLDAAAA|-|2309|-|2592 +Just good amou|-|AAAAAAAADFODAAAA|-|1833|-|1965 +Just good amou|-|AAAAAAAADIOAAAAA|-|2918|-|2569 +Just good amou|-|AAAAAAAADIPCAAAA|-|1526|-|2241 +Just good amou|-|AAAAAAAADLACAAAA|-|2197|-|2732 +Just good amou|-|AAAAAAAADLHBAAAA|-|2808|-|2114 +Just good amou|-|AAAAAAAADMAEAAAA|-|1758|-|1735 +Just good amou|-|AAAAAAAADMCCAAAA|-|2429|-|2317 +Just good amou|-|AAAAAAAADMDBAAAA|-|1832|-|1482 +Just good amou|-|AAAAAAAADPDBAAAA|-|1905|-|1798 +Just good amou|-|AAAAAAAADPFCAAAA|-|2131|-|1619 +Just good amou|-|AAAAAAAAEANCAAAA|-|2852|-|3131 +Just good amou|-|AAAAAAAAECGBAAAA|-|2671|-|1815 +Just good amou|-|AAAAAAAAECLAAAAA|-|1591|-|2133 +Just good amou|-|AAAAAAAAEDBCAAAA|-|1700|-|2416 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q22.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q22.out new file mode 100644 index 0000000000000..36e24718c7df2 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q22.out @@ -0,0 +1,100 @@ +oughtn steingcally|-|null|-|null|-|null|-|429.75206611570246 +oughtn steingcally|-|exportiexporti #2|-|null|-|null|-|429.75206611570246 +oughtn steingcally|-|exportiexporti #2|-|toddlers|-|null|-|429.75206611570246 +oughtn steingcally|-|exportiexporti #2|-|toddlers|-|Children|-|429.75206611570246 +oughtcallypripriought|-|null|-|null|-|null|-|433.04918032786884 +oughtcallypripriought|-|corpunivamalg #17|-|null|-|null|-|433.04918032786884 +oughtcallypripriought|-|corpunivamalg #17|-|musical|-|null|-|433.04918032786884 +oughtcallypripriought|-|corpunivamalg #17|-|musical|-|Electronics|-|433.04918032786884 +oughtesecallyeseought|-|null|-|null|-|null|-|434.8091286307054 +oughtesecallyeseought|-|scholarbrand #2|-|null|-|null|-|434.8091286307054 +oughtesecallyeseought|-|scholarbrand #2|-|blinds/shades|-|null|-|434.8091286307054 +oughtesecallyeseought|-|scholarbrand #2|-|blinds/shades|-|Home|-|434.8091286307054 +antiesen stese|-|null|-|null|-|null|-|436.39676113360326 +antiesen stese|-|edu packexporti #2|-|null|-|null|-|436.39676113360326 +antiesen stese|-|edu packexporti #2|-|school-uniforms|-|null|-|436.39676113360326 +antiesen stese|-|edu packexporti #2|-|school-uniforms|-|Children|-|436.39676113360326 +priesecallyantiought|-|null|-|null|-|null|-|440.51612903225805 +priesecallyantiought|-|importounivamalg #8|-|null|-|null|-|440.51612903225805 +priesecallyantiought|-|importounivamalg #8|-|home repair|-|null|-|440.51612903225805 +priesecallyantiought|-|importounivamalg #8|-|home repair|-|Books|-|440.51612903225805 +prioughtableoughtought|-|null|-|null|-|null|-|440.97478991596637 +prioughtableoughtought|-|exportiunivamalg #11|-|null|-|null|-|440.97478991596637 +prioughtableoughtought|-|exportiunivamalg #11|-|dvd/vcr players|-|null|-|440.97478991596637 +prioughtableoughtought|-|exportiunivamalg #11|-|dvd/vcr players|-|Electronics|-|440.97478991596637 +antiablen stought|-|null|-|null|-|null|-|441.520325203252 +antiablen stought|-|amalgamalg #2|-|null|-|null|-|441.520325203252 +antiablen stought|-|amalgamalg #2|-|dresses|-|null|-|441.520325203252 +antiablen stought|-|amalgamalg #2|-|dresses|-|Women|-|441.520325203252 +n steingantianti|-|null|-|null|-|null|-|442.4404761904762 +n steingantianti|-|corpbrand #10|-|null|-|null|-|442.4404761904762 +n steingantianti|-|corpbrand #10|-|rugs|-|null|-|442.4404761904762 +n steingantianti|-|corpbrand #10|-|rugs|-|Home|-|442.4404761904762 +prieingation|-|null|-|null|-|null|-|442.68595041322317 +prieingation|-|importoamalg #2|-|null|-|null|-|442.68595041322317 +prieingation|-|importoamalg #2|-|fragrances|-|null|-|442.68595041322317 +prieingation|-|importoamalg #2|-|fragrances|-|Women|-|442.68595041322317 +n stesecallypri|-|null|-|null|-|null|-|442.84 +n stesecallypri|-|amalgimporto #2|-|null|-|null|-|442.84 +n stesecallypri|-|amalgimporto #2|-|accessories|-|null|-|442.84 +n stesecallypri|-|amalgimporto #2|-|accessories|-|Men|-|442.84 +n stn stcallyoughtought|-|null|-|null|-|null|-|443.20883534136544 +n stn stcallyoughtought|-|corpmaxi #10|-|null|-|null|-|443.20883534136544 +n stn stcallyoughtought|-|corpmaxi #10|-|golf|-|null|-|443.20883534136544 +n stn stcallyoughtought|-|corpmaxi #10|-|golf|-|Sports|-|443.20883534136544 +ationableprieing|-|null|-|null|-|null|-|443.349593495935 +ationableprieing|-|exportiamalg #2|-|null|-|null|-|443.349593495935 +ationableprieing|-|exportiamalg #2|-|maternity|-|null|-|443.349593495935 +ationableprieing|-|exportiamalg #2|-|maternity|-|Women|-|443.349593495935 +ationoughtesepri|-|null|-|null|-|null|-|443.8292682926829 +ationoughtesepri|-|edu packunivamalg #10|-|null|-|null|-|443.8292682926829 +ationoughtesepri|-|edu packunivamalg #10|-|sports|-|null|-|443.8292682926829 +ationoughtesepri|-|edu packunivamalg #10|-|sports|-|Books|-|443.8292682926829 +oughtbarcallycallyought|-|null|-|null|-|null|-|444.5889328063241 +oughtbarcallycallyought|-|corpmaxi #2|-|null|-|null|-|444.5889328063241 +oughtbarcallycallyought|-|corpmaxi #2|-|golf|-|null|-|444.5889328063241 +oughtbarcallycallyought|-|corpmaxi #2|-|golf|-|Sports|-|444.5889328063241 +n steingcallycally|-|null|-|null|-|null|-|445.0833333333333 +n steingcallycally|-|importoscholar #2|-|null|-|null|-|445.0833333333333 +n steingcallycally|-|importoscholar #2|-|country|-|null|-|445.0833333333333 +n steingcallycally|-|importoscholar #2|-|country|-|Music|-|445.0833333333333 +ationcallyoughteing|-|null|-|null|-|null|-|445.83534136546183 +ationcallyoughteing|-|amalgedu pack #2|-|null|-|null|-|445.83534136546183 +ationcallyoughteing|-|amalgedu pack #2|-|womens|-|null|-|445.83534136546183 +ationcallyoughteing|-|amalgedu pack #2|-|womens|-|Shoes|-|445.83534136546183 +antiablebarantiought|-|null|-|null|-|null|-|446.05555555555554 +antiablebarantiought|-|scholarbrand #2|-|null|-|null|-|446.05555555555554 +antiablebarantiought|-|scholarbrand #2|-|custom|-|null|-|446.05555555555554 +antiablebarantiought|-|scholarbrand #2|-|custom|-|Jewelry|-|446.05555555555554 +ationantiationeseought|-|null|-|null|-|null|-|446.33870967741933 +ationantiationeseought|-|amalgimporto #2|-|null|-|null|-|446.33870967741933 +ationantiationeseought|-|amalgimporto #2|-|accessories|-|null|-|446.33870967741933 +ationantiationeseought|-|amalgimporto #2|-|accessories|-|Men|-|446.33870967741933 +pricallypriationought|-|null|-|null|-|null|-|446.96 +pricallypriationought|-|maxibrand #4|-|null|-|null|-|446.96 +pricallypriationought|-|maxibrand #4|-|mattresses|-|null|-|446.96 +pricallypriationought|-|maxibrand #4|-|mattresses|-|Home|-|446.96 +ationcallyn stbarought|-|null|-|null|-|null|-|446.9918032786885 +ationcallyn stbarought|-|corpbrand #8|-|null|-|null|-|446.9918032786885 +ationcallyn stbarought|-|corpbrand #8|-|rugs|-|null|-|446.9918032786885 +ationcallyn stbarought|-|corpbrand #8|-|rugs|-|Home|-|446.9918032786885 +ationeseoughtpri|-|null|-|null|-|null|-|447.0769230769231 +ationeseoughtpri|-|edu packamalg #2|-|null|-|null|-|447.0769230769231 +ationeseoughtpri|-|edu packamalg #2|-|swimwear|-|null|-|447.0769230769231 +ationeseoughtpri|-|edu packamalg #2|-|swimwear|-|Women|-|447.0769230769231 +anticallyese|-|null|-|null|-|null|-|447.4313725490196 +anticallyese|-|amalgcorp #2|-|null|-|null|-|447.4313725490196 +anticallyese|-|amalgcorp #2|-|birdal|-|null|-|447.4313725490196 +anticallyese|-|amalgcorp #2|-|birdal|-|Jewelry|-|447.4313725490196 +n stpriprioughtought|-|null|-|null|-|null|-|447.6375 +n stpriprioughtought|-|scholarbrand #10|-|null|-|null|-|447.6375 +n stpriprioughtought|-|scholarbrand #10|-|blinds/shades|-|null|-|447.6375 +n stpriprioughtought|-|scholarbrand #10|-|blinds/shades|-|Home|-|447.6375 +oughtantioughteing|-|null|-|null|-|null|-|448.08097165991904 +oughtantioughteing|-|univmaxi #2|-|null|-|null|-|448.08097165991904 +oughtantioughteing|-|univmaxi #2|-|pools|-|null|-|448.08097165991904 +oughtantioughteing|-|univmaxi #2|-|pools|-|Sports|-|448.08097165991904 +n steseeseationought|-|null|-|null|-|null|-|448.1769547325103 +n steseeseationought|-|exportiunivamalg #2|-|null|-|null|-|448.1769547325103 +n steseeseationought|-|exportiunivamalg #2|-|self-help|-|null|-|448.1769547325103 +n steseeseationought|-|exportiunivamalg #2|-|self-help|-|Books|-|448.1769547325103 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q23a.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q23a.out new file mode 100644 index 0000000000000..19765bd501b63 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q23a.out @@ -0,0 +1 @@ +null diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q23b.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q23b.out new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q24a.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q24a.out new file mode 100644 index 0000000000000..0ef2c4e02e548 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q24a.out @@ -0,0 +1 @@ +Johnson|-|Adelaide|-|able|-|24.58 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q24b.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q24b.out new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q25.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q25.out new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q26.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q26.out new file mode 100644 index 0000000000000..55425c881f2d8 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q26.out @@ -0,0 +1,100 @@ +AAAAAAAAAABBAAAA|-|88.0|-|201.380000|-|0.000000|-|106.730000 +AAAAAAAAAABEAAAA|-|42.5|-|91.745000|-|0.000000|-|39.970000 +AAAAAAAAAACAAAAA|-|61.0|-|84.630000|-|0.000000|-|78.700000 +AAAAAAAAAACDAAAA|-|30.0|-|34.150000|-|0.000000|-|3.070000 +AAAAAAAAAADBAAAA|-|80.0|-|193.010000|-|0.000000|-|36.670000 +AAAAAAAAAADCAAAA|-|1.0|-|121.310000|-|0.000000|-|86.130000 +AAAAAAAAAAEBAAAA|-|54.0|-|2.770000|-|40.090000|-|0.990000 +AAAAAAAAAAEDAAAA|-|44.0|-|99.810000|-|0.000000|-|34.930000 +AAAAAAAAAAFCAAAA|-|45.5|-|56.665000|-|0.000000|-|35.565000 +AAAAAAAAAAFDAAAA|-|84.0|-|70.060000|-|0.000000|-|58.140000 +AAAAAAAAAAGBAAAA|-|51.0|-|137.390000|-|0.000000|-|60.450000 +AAAAAAAAAAGCAAAA|-|41.5|-|96.695000|-|21.035000|-|62.310000 +AAAAAAAAAAGEAAAA|-|49.0|-|94.500000|-|0.000000|-|87.880000 +AAAAAAAAAAICAAAA|-|65.0|-|8.430000|-|0.000000|-|5.050000 +AAAAAAAAAAJBAAAA|-|90.0|-|118.990000|-|0.000000|-|102.330000 +AAAAAAAAAAJCAAAA|-|49.0|-|77.020000|-|0.000000|-|39.280000 +AAAAAAAAAAKAAAAA|-|42.0|-|254.820000|-|0.000000|-|7.640000 +AAAAAAAAAALAAAAA|-|94.0|-|66.660000|-|309.330000|-|8.660000 +AAAAAAAAAALDAAAA|-|81.0|-|54.080000|-|0.000000|-|2.160000 +AAAAAAAAAAMBAAAA|-|31.0|-|28.110000|-|204.340000|-|14.330000 +AAAAAAAAAANAAAAA|-|43.0|-|122.770000|-|0.000000|-|112.940000 +AAAAAAAAAANDAAAA|-|44.5|-|44.795000|-|1575.655000|-|30.030000 +AAAAAAAAAAOAAAAA|-|32.0|-|49.810000|-|0.000000|-|48.310000 +AAAAAAAAAAOCAAAA|-|32.0|-|105.500000|-|43.595000|-|17.635000 +AAAAAAAAAAPCAAAA|-|59.0|-|17.850000|-|90.010000|-|8.030000 +AAAAAAAAABADAAAA|-|3.0|-|30.920000|-|0.000000|-|29.370000 +AAAAAAAAABAEAAAA|-|13.0|-|63.590000|-|52.070000|-|57.230000 +AAAAAAAAABBAAAAA|-|5.0|-|106.200000|-|0.000000|-|43.540000 +AAAAAAAAABCCAAAA|-|93.5|-|108.340000|-|0.000000|-|57.410000 +AAAAAAAAABCEAAAA|-|20.0|-|133.750000|-|0.000000|-|34.770000 +AAAAAAAAABDDAAAA|-|2.0|-|52.780000|-|0.000000|-|32.190000 +AAAAAAAAABEAAAAA|-|5.0|-|41.990000|-|124.690000|-|27.710000 +AAAAAAAAABECAAAA|-|54.0|-|161.300000|-|0.000000|-|6.450000 +AAAAAAAAABFBAAAA|-|66.0|-|208.530000|-|0.000000|-|193.930000 +AAAAAAAAABGBAAAA|-|75.0|-|49.640000|-|0.000000|-|11.410000 +AAAAAAAAABGEAAAA|-|8.0|-|26.220000|-|0.000000|-|18.610000 +AAAAAAAAABHCAAAA|-|71.0|-|7.530000|-|4.070000|-|0.070000 +AAAAAAAAABHDAAAA|-|18.0|-|52.950000|-|0.000000|-|36.530000 +AAAAAAAAABJDAAAA|-|18.0|-|77.860000|-|0.000000|-|34.250000 +AAAAAAAAABMAAAAA|-|100.0|-|115.710000|-|0.000000|-|39.340000 +AAAAAAAAABMDAAAA|-|20.0|-|286.620000|-|0.000000|-|263.690000 +AAAAAAAAABNAAAAA|-|81.0|-|19.460000|-|0.000000|-|16.150000 +AAAAAAAAABNCAAAA|-|55.25|-|112.280000|-|8.012500|-|81.627500 +AAAAAAAAABNDAAAA|-|68.0|-|66.080000|-|0.000000|-|58.810000 +AAAAAAAAABPAAAAA|-|47.0|-|2.360000|-|0.000000|-|2.210000 +AAAAAAAAABPBAAAA|-|86.0|-|58.100000|-|0.000000|-|19.750000 +AAAAAAAAACADAAAA|-|56.0|-|119.290000|-|0.000000|-|89.460000 +AAAAAAAAACBBAAAA|-|34.0|-|208.880000|-|0.000000|-|148.300000 +AAAAAAAAACCAAAAA|-|36.0|-|32.980000|-|0.000000|-|15.830000 +AAAAAAAAACCDAAAA|-|36.0|-|145.600000|-|0.000000|-|94.640000 +AAAAAAAAACECAAAA|-|78.0|-|197.360000|-|0.000000|-|55.260000 +AAAAAAAAACFBAAAA|-|66.66666666666667|-|144.060000|-|66.883333|-|98.866667 +AAAAAAAAACFEAAAA|-|63.5|-|108.330000|-|0.000000|-|52.470000 +AAAAAAAAACGCAAAA|-|45.0|-|105.100000|-|0.000000|-|105.100000 +AAAAAAAAACIAAAAA|-|10.0|-|189.360000|-|0.000000|-|115.500000 +AAAAAAAAACJCAAAA|-|20.0|-|256.980000|-|1217.000000|-|82.230000 +AAAAAAAAACJDAAAA|-|19.0|-|83.930000|-|94.710000|-|22.660000 +AAAAAAAAACKBAAAA|-|67.0|-|143.010000|-|0.000000|-|122.980000 +AAAAAAAAACNBAAAA|-|17.0|-|74.140000|-|0.000000|-|40.680000 +AAAAAAAAACNCAAAA|-|30.0|-|232.560000|-|0.000000|-|206.970000 +AAAAAAAAACODAAAA|-|26.0|-|218.250000|-|0.000000|-|48.010000 +AAAAAAAAACPAAAAA|-|69.0|-|11.120000|-|0.000000|-|8.560000 +AAAAAAAAACPDAAAA|-|43.0|-|19.810000|-|0.000000|-|3.960000 +AAAAAAAAADAEAAAA|-|72.0|-|56.470000|-|0.000000|-|14.680000 +AAAAAAAAADBDAAAA|-|84.0|-|100.460000|-|0.000000|-|5.020000 +AAAAAAAAADCDAAAA|-|85.0|-|6.010000|-|0.000000|-|5.280000 +AAAAAAAAADDCAAAA|-|78.0|-|44.470000|-|0.000000|-|20.900000 +AAAAAAAAADEAAAAA|-|59.0|-|95.730000|-|0.000000|-|15.310000 +AAAAAAAAADEDAAAA|-|50.0|-|78.510000|-|0.000000|-|76.930000 +AAAAAAAAADFDAAAA|-|64.0|-|22.380000|-|0.000000|-|8.720000 +AAAAAAAAADGCAAAA|-|39.0|-|87.650000|-|0.000000|-|7.880000 +AAAAAAAAADHDAAAA|-|77.0|-|68.980000|-|190.710000|-|3.440000 +AAAAAAAAADICAAAA|-|81.0|-|46.020000|-|469.840000|-|5.980000 +AAAAAAAAADIDAAAA|-|43.0|-|127.990000|-|4212.370000|-|110.070000 +AAAAAAAAADLAAAAA|-|83.0|-|164.710000|-|0.000000|-|135.060000 +AAAAAAAAADMCAAAA|-|74.5|-|108.495000|-|526.000000|-|72.375000 +AAAAAAAAADNDAAAA|-|40.5|-|47.185000|-|0.000000|-|30.505000 +AAAAAAAAAEADAAAA|-|87.0|-|103.750000|-|0.000000|-|95.450000 +AAAAAAAAAEBDAAAA|-|18.0|-|64.470000|-|0.000000|-|30.940000 +AAAAAAAAAECBAAAA|-|38.0|-|175.190000|-|0.000000|-|126.130000 +AAAAAAAAAEDDAAAA|-|29.0|-|46.125000|-|0.000000|-|15.665000 +AAAAAAAAAEDEAAAA|-|71.0|-|23.680000|-|0.000000|-|7.810000 +AAAAAAAAAEFCAAAA|-|8.0|-|48.910000|-|74.480000|-|33.250000 +AAAAAAAAAEFEAAAA|-|99.0|-|123.670000|-|0.000000|-|28.440000 +AAAAAAAAAEGAAAAA|-|39.0|-|266.280000|-|0.000000|-|127.810000 +AAAAAAAAAEGEAAAA|-|96.0|-|204.110000|-|0.000000|-|193.900000 +AAAAAAAAAEHDAAAA|-|31.0|-|59.270000|-|0.000000|-|50.370000 +AAAAAAAAAEICAAAA|-|40.0|-|3.550000|-|0.000000|-|0.000000 +AAAAAAAAAEJAAAAA|-|61.0|-|10.370000|-|0.000000|-|8.810000 +AAAAAAAAAEJBAAAA|-|53.5|-|92.545000|-|0.000000|-|34.015000 +AAAAAAAAAEJDAAAA|-|48.0|-|86.020000|-|0.000000|-|2.580000 +AAAAAAAAAELBAAAA|-|31.0|-|160.960000|-|0.000000|-|61.160000 +AAAAAAAAAEMAAAAA|-|53.0|-|85.440000|-|0.000000|-|58.090000 +AAAAAAAAAEMBAAAA|-|25.0|-|199.250000|-|0.000000|-|33.870000 +AAAAAAAAAEMDAAAA|-|56.0|-|60.360000|-|0.000000|-|36.210000 +AAAAAAAAAEOBAAAA|-|49.0|-|105.350000|-|1243.360000|-|34.760000 +AAAAAAAAAFADAAAA|-|37.0|-|118.510000|-|2848.770000|-|86.510000 +AAAAAAAAAFBEAAAA|-|94.0|-|140.760000|-|0.000000|-|85.860000 +AAAAAAAAAFCDAAAA|-|39.0|-|128.310000|-|0.000000|-|5.130000 +AAAAAAAAAFCEAAAA|-|19.0|-|138.540000|-|0.000000|-|135.760000 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q27.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q27.out new file mode 100644 index 0000000000000..40ff2e7b4cfc5 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q27.out @@ -0,0 +1,100 @@ +null|-|null|-|1|-|49.916138404648706|-|75.425222|-|191.109448|-|37.896850 +AAAAAAAAAAABAAAA|-|null|-|1|-|67.0|-|37.520000|-|0.000000|-|24.010000 +AAAAAAAAAAABAAAA|-|TN|-|0|-|67.0|-|37.520000|-|0.000000|-|24.010000 +AAAAAAAAAAACAAAA|-|null|-|1|-|34.0|-|89.610000|-|186.400000|-|32.250000 +AAAAAAAAAAACAAAA|-|TN|-|0|-|34.0|-|89.610000|-|186.400000|-|32.250000 +AAAAAAAAAACCAAAA|-|null|-|1|-|69.0|-|31.085000|-|0.000000|-|7.825000 +AAAAAAAAAACCAAAA|-|TN|-|0|-|69.0|-|31.085000|-|0.000000|-|7.825000 +AAAAAAAAAACDAAAA|-|null|-|1|-|36.0|-|107.280000|-|0.000000|-|54.063333 +AAAAAAAAAACDAAAA|-|TN|-|0|-|36.0|-|107.280000|-|0.000000|-|54.063333 +AAAAAAAAAADBAAAA|-|null|-|1|-|21.0|-|74.470000|-|0.000000|-|44.680000 +AAAAAAAAAADBAAAA|-|TN|-|0|-|21.0|-|74.470000|-|0.000000|-|44.680000 +AAAAAAAAAAEBAAAA|-|null|-|1|-|47.0|-|30.540000|-|125.010000|-|20.460000 +AAAAAAAAAAEBAAAA|-|TN|-|0|-|47.0|-|30.540000|-|125.010000|-|20.460000 +AAAAAAAAAAEEAAAA|-|null|-|1|-|26.5|-|100.840000|-|362.865000|-|44.030000 +AAAAAAAAAAEEAAAA|-|TN|-|0|-|26.5|-|100.840000|-|362.865000|-|44.030000 +AAAAAAAAAAFCAAAA|-|null|-|1|-|50.0|-|37.055000|-|0.000000|-|7.555000 +AAAAAAAAAAFCAAAA|-|TN|-|0|-|50.0|-|37.055000|-|0.000000|-|7.555000 +AAAAAAAAAAGBAAAA|-|null|-|1|-|14.0|-|55.130000|-|0.000000|-|50.160000 +AAAAAAAAAAGBAAAA|-|TN|-|0|-|14.0|-|55.130000|-|0.000000|-|50.160000 +AAAAAAAAAAHBAAAA|-|null|-|1|-|50.0|-|106.065000|-|0.000000|-|29.695000 +AAAAAAAAAAHBAAAA|-|TN|-|0|-|50.0|-|106.065000|-|0.000000|-|29.695000 +AAAAAAAAAAIAAAAA|-|null|-|1|-|67.0|-|68.610000|-|0.000000|-|26.405000 +AAAAAAAAAAIAAAAA|-|TN|-|0|-|67.0|-|68.610000|-|0.000000|-|26.405000 +AAAAAAAAAAIDAAAA|-|null|-|1|-|37.333333333333336|-|78.440000|-|0.000000|-|51.863333 +AAAAAAAAAAIDAAAA|-|TN|-|0|-|37.333333333333336|-|78.440000|-|0.000000|-|51.863333 +AAAAAAAAAAJBAAAA|-|null|-|1|-|55.0|-|131.290000|-|0.000000|-|36.760000 +AAAAAAAAAAJBAAAA|-|TN|-|0|-|55.0|-|131.290000|-|0.000000|-|36.760000 +AAAAAAAAAAKBAAAA|-|null|-|1|-|70.0|-|66.120000|-|0.000000|-|21.150000 +AAAAAAAAAAKBAAAA|-|TN|-|0|-|70.0|-|66.120000|-|0.000000|-|21.150000 +AAAAAAAAAALCAAAA|-|null|-|1|-|93.0|-|104.200000|-|0.000000|-|6.250000 +AAAAAAAAAALCAAAA|-|TN|-|0|-|93.0|-|104.200000|-|0.000000|-|6.250000 +AAAAAAAAAALDAAAA|-|null|-|1|-|61.5|-|150.645000|-|0.000000|-|57.335000 +AAAAAAAAAALDAAAA|-|TN|-|0|-|61.5|-|150.645000|-|0.000000|-|57.335000 +AAAAAAAAAANAAAAA|-|null|-|1|-|52.0|-|2.510000|-|0.000000|-|2.280000 +AAAAAAAAAANAAAAA|-|TN|-|0|-|52.0|-|2.510000|-|0.000000|-|2.280000 +AAAAAAAAAAOAAAAA|-|null|-|1|-|23.5|-|17.590000|-|0.000000|-|12.130000 +AAAAAAAAAAOAAAAA|-|TN|-|0|-|23.5|-|17.590000|-|0.000000|-|12.130000 +AAAAAAAAAAOCAAAA|-|null|-|1|-|30.0|-|22.380000|-|0.000000|-|4.690000 +AAAAAAAAAAOCAAAA|-|TN|-|0|-|30.0|-|22.380000|-|0.000000|-|4.690000 +AAAAAAAAAAPCAAAA|-|null|-|1|-|92.0|-|75.630000|-|0.000000|-|64.280000 +AAAAAAAAAAPCAAAA|-|TN|-|0|-|92.0|-|75.630000|-|0.000000|-|64.280000 +AAAAAAAAABAAAAAA|-|null|-|1|-|10.0|-|45.790000|-|0.000000|-|43.950000 +AAAAAAAAABAAAAAA|-|TN|-|0|-|10.0|-|45.790000|-|0.000000|-|43.950000 +AAAAAAAAABABAAAA|-|null|-|1|-|63.0|-|21.890000|-|0.000000|-|19.700000 +AAAAAAAAABABAAAA|-|TN|-|0|-|63.0|-|21.890000|-|0.000000|-|19.700000 +AAAAAAAAABBAAAAA|-|null|-|1|-|26.5|-|78.785000|-|0.000000|-|35.615000 +AAAAAAAAABBAAAAA|-|TN|-|0|-|26.5|-|78.785000|-|0.000000|-|35.615000 +AAAAAAAAABBDAAAA|-|null|-|1|-|14.0|-|67.910000|-|0.000000|-|36.670000 +AAAAAAAAABBDAAAA|-|TN|-|0|-|14.0|-|67.910000|-|0.000000|-|36.670000 +AAAAAAAAABCBAAAA|-|null|-|1|-|42.5|-|72.900000|-|0.000000|-|44.685000 +AAAAAAAAABCBAAAA|-|TN|-|0|-|42.5|-|72.900000|-|0.000000|-|44.685000 +AAAAAAAAABCCAAAA|-|null|-|1|-|50.0|-|90.835000|-|0.000000|-|42.605000 +AAAAAAAAABCCAAAA|-|TN|-|0|-|50.0|-|90.835000|-|0.000000|-|42.605000 +AAAAAAAAABDBAAAA|-|null|-|1|-|40.0|-|10.100000|-|0.000000|-|4.240000 +AAAAAAAAABDBAAAA|-|TN|-|0|-|40.0|-|10.100000|-|0.000000|-|4.240000 +AAAAAAAAABDEAAAA|-|null|-|1|-|67.0|-|85.420000|-|0.000000|-|31.600000 +AAAAAAAAABDEAAAA|-|TN|-|0|-|67.0|-|85.420000|-|0.000000|-|31.600000 +AAAAAAAAABECAAAA|-|null|-|1|-|78.5|-|36.280000|-|1673.320000|-|25.170000 +AAAAAAAAABECAAAA|-|TN|-|0|-|78.5|-|36.280000|-|1673.320000|-|25.170000 +AAAAAAAAABEDAAAA|-|null|-|1|-|60.0|-|92.410000|-|2270.190000|-|58.210000 +AAAAAAAAABEDAAAA|-|TN|-|0|-|60.0|-|92.410000|-|2270.190000|-|58.210000 +AAAAAAAAABGAAAAA|-|null|-|1|-|57.0|-|11.390000|-|201.900000|-|3.980000 +AAAAAAAAABGAAAAA|-|TN|-|0|-|57.0|-|11.390000|-|201.900000|-|3.980000 +AAAAAAAAABGDAAAA|-|null|-|1|-|74.0|-|174.750000|-|232.650000|-|5.240000 +AAAAAAAAABGDAAAA|-|TN|-|0|-|74.0|-|174.750000|-|232.650000|-|5.240000 +AAAAAAAAABHDAAAA|-|null|-|1|-|34.5|-|120.730000|-|0.000000|-|61.460000 +AAAAAAAAABHDAAAA|-|TN|-|0|-|34.5|-|120.730000|-|0.000000|-|61.460000 +AAAAAAAAABIBAAAA|-|null|-|1|-|4.0|-|12.680000|-|5.040000|-|10.520000 +AAAAAAAAABIBAAAA|-|TN|-|0|-|4.0|-|12.680000|-|5.040000|-|10.520000 +AAAAAAAAABICAAAA|-|null|-|1|-|20.5|-|22.420000|-|0.000000|-|20.300000 +AAAAAAAAABICAAAA|-|TN|-|0|-|20.5|-|22.420000|-|0.000000|-|20.300000 +AAAAAAAAABJBAAAA|-|null|-|1|-|38.0|-|2.850000|-|0.000000|-|0.880000 +AAAAAAAAABJBAAAA|-|TN|-|0|-|38.0|-|2.850000|-|0.000000|-|0.880000 +AAAAAAAAABKCAAAA|-|null|-|1|-|8.0|-|73.980000|-|0.000000|-|51.780000 +AAAAAAAAABKCAAAA|-|TN|-|0|-|8.0|-|73.980000|-|0.000000|-|51.780000 +AAAAAAAAABLCAAAA|-|null|-|1|-|49.0|-|96.580000|-|0.000000|-|28.970000 +AAAAAAAAABLCAAAA|-|TN|-|0|-|49.0|-|96.580000|-|0.000000|-|28.970000 +AAAAAAAAABMAAAAA|-|null|-|1|-|50.0|-|136.990000|-|838.320000|-|69.860000 +AAAAAAAAABMAAAAA|-|TN|-|0|-|50.0|-|136.990000|-|838.320000|-|69.860000 +AAAAAAAAABMBAAAA|-|null|-|1|-|76.0|-|120.520000|-|0.000000|-|83.150000 +AAAAAAAAABMBAAAA|-|TN|-|0|-|76.0|-|120.520000|-|0.000000|-|83.150000 +AAAAAAAAABNAAAAA|-|null|-|1|-|17.0|-|91.190000|-|0.000000|-|16.410000 +AAAAAAAAABNAAAAA|-|TN|-|0|-|17.0|-|91.190000|-|0.000000|-|16.410000 +AAAAAAAAABNCAAAA|-|null|-|1|-|61.0|-|13.080000|-|16.650000|-|0.650000 +AAAAAAAAABNCAAAA|-|TN|-|0|-|61.0|-|13.080000|-|16.650000|-|0.650000 +AAAAAAAAABPAAAAA|-|null|-|1|-|30.0|-|118.380000|-|623.160000|-|46.160000 +AAAAAAAAABPAAAAA|-|TN|-|0|-|30.0|-|118.380000|-|623.160000|-|46.160000 +AAAAAAAAABPBAAAA|-|null|-|1|-|30.0|-|null|-|null|-|17.350000 +AAAAAAAAABPBAAAA|-|TN|-|0|-|30.0|-|null|-|null|-|17.350000 +AAAAAAAAACAAAAAA|-|null|-|1|-|20.0|-|3.710000|-|0.000000|-|0.250000 +AAAAAAAAACAAAAAA|-|TN|-|0|-|20.0|-|3.710000|-|0.000000|-|0.250000 +AAAAAAAAACACAAAA|-|null|-|1|-|66.0|-|117.590000|-|0.000000|-|34.100000 +AAAAAAAAACACAAAA|-|TN|-|0|-|66.0|-|117.590000|-|0.000000|-|34.100000 +AAAAAAAAACADAAAA|-|null|-|1|-|79.0|-|171.850000|-|0.000000|-|127.160000 +AAAAAAAAACADAAAA|-|TN|-|0|-|79.0|-|171.850000|-|0.000000|-|127.160000 +AAAAAAAAACBBAAAA|-|null|-|1|-|81.0|-|88.700000|-|0.000000|-|13.300000 +AAAAAAAAACBBAAAA|-|TN|-|0|-|81.0|-|88.700000|-|0.000000|-|13.300000 +AAAAAAAAACBCAAAA|-|null|-|1|-|26.0|-|62.780000|-|1311.600000|-|61.520000 +AAAAAAAAACBCAAAA|-|TN|-|0|-|26.0|-|62.780000|-|1311.600000|-|61.520000 +AAAAAAAAACBEAAAA|-|null|-|1|-|60.0|-|84.015000|-|0.000000|-|33.495000 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q28.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q28.out new file mode 100644 index 0000000000000..28a73de352453 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q28.out @@ -0,0 +1 @@ +31.969149|-|34374|-|5350|-|70.816736|-|35077|-|6596|-|36.802919|-|37423|-|6122|-|135.590399|-|28119|-|9792|-|82.299271|-|31962|-|7661|-|67.110585|-|36502|-|8364 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q29.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q29.out new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q3.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q3.out new file mode 100644 index 0000000000000..a5c494693c19d --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q3.out @@ -0,0 +1,33 @@ +1998|-|1003002|-|exportiamalg #2|-|33998.12 +1998|-|8014008|-|edu packmaxi #8|-|21206.58 +1998|-|3001001|-|amalgexporti #1|-|20216.93 +1998|-|2001002|-|amalgimporto #2|-|19768.20 +1998|-|9013003|-|exportiunivamalg #3|-|9044.02 +1998|-|9007009|-|brandmaxi #9|-|7202.41 +1999|-|1003002|-|exportiamalg #2|-|45647.16 +1999|-|8014008|-|edu packmaxi #8|-|33143.24 +1999|-|9007009|-|brandmaxi #9|-|28026.63 +1999|-|9013003|-|exportiunivamalg #3|-|12924.02 +1999|-|3001001|-|amalgexporti #1|-|7908.78 +1999|-|2001002|-|amalgimporto #2|-|3943.85 +2000|-|2001002|-|amalgimporto #2|-|15849.57 +2000|-|1003002|-|exportiamalg #2|-|11271.13 +2000|-|8014008|-|edu packmaxi #8|-|10959.10 +2000|-|3001001|-|amalgexporti #1|-|10378.83 +2000|-|6008005|-|amalgunivamalg #6|-|8442.12 +2000|-|6001001|-|exportiexporti #2|-|5241.20 +2000|-|9007009|-|brandmaxi #9|-|4272.13 +2000|-|9013003|-|exportiunivamalg #3|-|2496.31 +2001|-|6001001|-|exportiexporti #2|-|18483.78 +2001|-|1003002|-|exportiamalg #2|-|16435.97 +2001|-|6008005|-|amalgunivamalg #6|-|15545.36 +2001|-|7011006|-|amalgnameless #6|-|8748.74 +2001|-|8014008|-|edu packmaxi #8|-|5800.20 +2001|-|2001002|-|amalgimporto #2|-|3428.68 +2002|-|7011006|-|amalgnameless #6|-|26340.40 +2002|-|1003002|-|exportiamalg #2|-|25464.95 +2002|-|8014008|-|edu packmaxi #8|-|20358.69 +2002|-|6010007|-|univbrand #7|-|16926.60 +2002|-|10014008|-|edu packamalgamalg #8|-|11713.07 +2002|-|2001002|-|amalgimporto #2|-|9298.60 +2002|-|5002001|-|importoscholar #1|-|4517.74 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q30.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q30.out new file mode 100644 index 0000000000000..ec6ad1a9b41a3 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q30.out @@ -0,0 +1,100 @@ +AAAAAAAAAACLAAAA|-|Sir|-|Daniel|-|Walls|-|Y|-|22|-|11|-|1966|-|GUINEA-BISSAU|-|null|-|Daniel.Walls@uvm43mm6hOF4d.org|-|2452482|-|2237.90 +AAAAAAAAAFBCBAAA|-|Dr.|-|Odette|-|Meyer|-|Y|-|3|-|null|-|null|-|null|-|null|-|null|-|null|-|2153.58 +AAAAAAAAAJOGBAAA|-|Mrs.|-|null|-|null|-|Y|-|null|-|null|-|1948|-|LUXEMBOURG|-|null|-|null|-|2452373|-|1731.52 +AAAAAAAABBFEBAAA|-|Ms.|-|Jeanetta|-|Crane|-|Y|-|12|-|6|-|1951|-|MARSHALL ISLANDS|-|null|-|Jeanetta.Crane@S.com|-|2452449|-|3766.40 +AAAAAAAABFIGAAAA|-|Miss|-|Megan|-|Wilson|-|Y|-|16|-|8|-|1965|-|PALAU|-|null|-|Megan.Wilson@PZmJ0ozj1j.org|-|2452611|-|2789.05 +AAAAAAAABFPNAAAA|-|Miss|-|Gladys|-|Oconnell|-|N|-|18|-|3|-|1984|-|CANADA|-|null|-|Gladys.Oconnell@OFH5B2bty.org|-|2452508|-|12495.06 +AAAAAAAABIOHAAAA|-|Mrs.|-|null|-|Phillips|-|Y|-|22|-|null|-|1934|-|null|-|null|-|null|-|null|-|6407.04 +AAAAAAAABJOOAAAA|-|Dr.|-|Francisco|-|Haines|-|N|-|14|-|11|-|1959|-|CHRISTMAS ISLAND|-|null|-|Francisco.Haines@DLqDtTGPlOOrB.com|-|2452488|-|5907.30 +AAAAAAAABLKABAAA|-|Sir|-|Forrest|-|Gray|-|Y|-|26|-|12|-|null|-|BENIN|-|null|-|Forrest.Gray@dgRGgJXlvD68UaY.edu|-|null|-|3801.91 +AAAAAAAABLNEBAAA|-|Sir|-|Charles|-|Taylor|-|Y|-|8|-|5|-|1991|-|MOLDOVA, REPUBLIC OF|-|null|-|Charles.Taylor@vXpB5ni98xuuNc.org|-|2452511|-|4456.29 +AAAAAAAABNLKAAAA|-|Dr.|-|Linda|-|Parker|-|Y|-|2|-|9|-|1963|-|LITHUANIA|-|null|-|Linda.Parker@ng7Tl3.edu|-|2452367|-|3455.42 +AAAAAAAABOKFAAAA|-|Mr.|-|Charles|-|Perez|-|N|-|22|-|1|-|1985|-|FRANCE|-|null|-|Charles.Perez@UExPE9oU28gO.org|-|2452510|-|2245.86 +AAAAAAAACKFGBAAA|-|Sir|-|Charles|-|Walker|-|Y|-|27|-|7|-|1956|-|SAN MARINO|-|null|-|Charles.Walker@c.edu|-|2452442|-|2550.35 +AAAAAAAACMMOAAAA|-|Sir|-|Michael|-|Hudson|-|N|-|5|-|8|-|1955|-|BELGIUM|-|null|-|Michael.Hudson@s97G4Mz7LC.edu|-|2452473|-|2294.46 +AAAAAAAACNIOAAAA|-|Dr.|-|Angela|-|King|-|Y|-|31|-|8|-|1947|-|LIECHTENSTEIN|-|null|-|Angela.King@CXlMciUfhOi5.com|-|2452629|-|1961.80 +AAAAAAAACOLJAAAA|-|Mr.|-|Marcos|-|Berry|-|Y|-|21|-|8|-|1981|-|BURKINA FASO|-|null|-|Marcos.Berry@x9nL6op.org|-|2452582|-|3589.92 +AAAAAAAADCEJAAAA|-|Mrs.|-|Barbara|-|Rodriguez|-|N|-|17|-|1|-|1986|-|PITCAIRN|-|null|-|Barbara.Rodriguez@DVYth76Erq.org|-|2452428|-|1817.01 +AAAAAAAADDDJAAAA|-|Dr.|-|Peggy|-|Mowery|-|Y|-|26|-|9|-|1970|-|FAROE ISLANDS|-|null|-|Peggy.Mowery@JXjtp7AENEuAeuVs.com|-|2452643|-|5229.84 +AAAAAAAADGCEBAAA|-|Dr.|-|Freddie|-|Francis|-|Y|-|1|-|7|-|1956|-|TOGO|-|null|-|Freddie.Francis@0zVrEcIb97FnjKS.com|-|2452383|-|11224.16 +AAAAAAAADIBJAAAA|-|Mr.|-|Gerald|-|Santana|-|N|-|1|-|2|-|1924|-|BRUNEI DARUSSALAM|-|null|-|Gerald.Santana@YipIzUX44yAan5.org|-|2452539|-|2094.30 +AAAAAAAADJCBAAAA|-|Sir|-|Laurence|-|Silas|-|Y|-|18|-|12|-|1935|-|MAYOTTE|-|null|-|Laurence.Silas@SoQSQLVolqL6M.edu|-|2452378|-|2596.75 +AAAAAAAADNDHBAAA|-|Dr.|-|Josue|-|Lynch|-|null|-|null|-|null|-|1970|-|ANTARCTICA|-|null|-|Josue.Lynch@J0EpTReFJsSs.org|-|null|-|2704.90 +AAAAAAAAEDAGBAAA|-|Miss|-|Vickie|-|Mccray|-|N|-|23|-|6|-|1986|-|SWITZERLAND|-|null|-|Vickie.Mccray@UcOb0mmNb1iP.com|-|2452424|-|2454.40 +AAAAAAAAEIAJAAAA|-|Ms.|-|Aracelis|-|Marin|-|N|-|18|-|2|-|1969|-|BELARUS|-|null|-|Aracelis.Marin@jJikSRTKLS7ykokmibO.edu|-|2452557|-|1682.80 +AAAAAAAAEMOEAAAA|-|Dr.|-|Earnest|-|Barker|-|N|-|8|-|1|-|1929|-|ISRAEL|-|null|-|Earnest.Barker@bhmIkHUL9G1.org|-|2452366|-|11614.85 +AAAAAAAAEMPEAAAA|-|Dr.|-|Donna|-|Alvarez|-|Y|-|30|-|3|-|1935|-|LITHUANIA|-|null|-|Donna.Alvarez@gJO1CGQo3t.com|-|2452360|-|2530.00 +AAAAAAAAENHNAAAA|-|Dr.|-|James|-|Brown|-|N|-|11|-|2|-|1961|-|SLOVAKIA|-|null|-|James.Brown@ymHRksPTmJPclXN.com|-|2452522|-|2318.49 +AAAAAAAAEPBGAAAA|-|Mrs.|-|Martha|-|Gall|-|Y|-|6|-|7|-|1933|-|AUSTRIA|-|null|-|Martha.Gall@VEbuvQA8lG.org|-|2452632|-|2379.61 +AAAAAAAAFALBAAAA|-|Dr.|-|Tami|-|Smith|-|N|-|17|-|3|-|1979|-|MAYOTTE|-|null|-|Tami.Smith@LS.org|-|2452607|-|2932.44 +AAAAAAAAFBACAAAA|-|Mr.|-|Travis|-|Tyler|-|Y|-|18|-|4|-|1948|-|LIBERIA|-|null|-|Travis.Tyler@C6zX.edu|-|2452308|-|1681.53 +AAAAAAAAFDHABAAA|-|Mr.|-|Lucas|-|Rivera|-|N|-|2|-|8|-|1950|-|EL SALVADOR|-|null|-|Lucas.Rivera@nAeU.com|-|2452453|-|4726.48 +AAAAAAAAFFODAAAA|-|Sir|-|Jerry|-|Crump|-|N|-|2|-|12|-|1982|-|GREECE|-|null|-|Jerry.Crump@NtXme.org|-|2452492|-|2690.60 +AAAAAAAAFGBNAAAA|-|Mrs.|-|Ada|-|null|-|null|-|null|-|null|-|null|-|null|-|null|-|null|-|2452368|-|3081.24 +AAAAAAAAFKPIAAAA|-|Mrs.|-|Arlene|-|Cowell|-|Y|-|7|-|4|-|1952|-|PORTUGAL|-|null|-|Arlene.Cowell@g.com|-|2452405|-|1822.50 +AAAAAAAAFPFIBAAA|-|Ms.|-|Dorothy|-|Lockett|-|N|-|15|-|4|-|1986|-|ECUADOR|-|null|-|Dorothy.Lockett@tsRtexdfM4Qs.org|-|2452625|-|4917.00 +AAAAAAAAFPPEAAAA|-|Sir|-|John|-|Wade|-|Y|-|19|-|10|-|1965|-|GAMBIA|-|null|-|John.Wade@pd3A7y9K1.edu|-|2452487|-|1637.25 +AAAAAAAAGACDAAAA|-|Mr.|-|Ronnie|-|Waller|-|Y|-|26|-|7|-|1956|-|ARGENTINA|-|null|-|Ronnie.Waller@TqzJLfq92.com|-|2452568|-|1757.69 +AAAAAAAAGGNCAAAA|-|Dr.|-|null|-|null|-|Y|-|null|-|5|-|1938|-|null|-|null|-|Alexander.Burke@ZYqgTm.org|-|null|-|6725.70 +AAAAAAAAGIEBAAAA|-|Ms.|-|Grace|-|Hurd|-|N|-|29|-|9|-|1969|-|AUSTRALIA|-|null|-|Grace.Hurd@7P9IfjL2Q.edu|-|2452568|-|3514.00 +AAAAAAAAGIFPAAAA|-|null|-|Diane|-|null|-|N|-|null|-|4|-|1951|-|MALAYSIA|-|null|-|Diane.Watson@NYXf7PsLv.com|-|null|-|3095.14 +AAAAAAAAGMFNAAAA|-|Sir|-|Jerry|-|Martinez|-|Y|-|30|-|8|-|1932|-|MONGOLIA|-|null|-|Jerry.Martinez@T2dk5ZZjAMu.org|-|2452358|-|6831.32 +AAAAAAAAGPIBBAAA|-|Mr.|-|Howard|-|Taylor|-|Y|-|17|-|5|-|1933|-|POLAND|-|null|-|Howard.Taylor@G.org|-|2452615|-|2237.64 +AAAAAAAAGPIBBAAA|-|Mr.|-|Howard|-|Taylor|-|Y|-|17|-|5|-|1933|-|POLAND|-|null|-|Howard.Taylor@G.org|-|2452615|-|3915.60 +AAAAAAAAHIKGBAAA|-|Dr.|-|George|-|Norton|-|Y|-|22|-|6|-|1979|-|RWANDA|-|null|-|George.Norton@1eSUCXSVai.com|-|2452633|-|3660.21 +AAAAAAAAHJJDBAAA|-|Ms.|-|Luise|-|Young|-|N|-|29|-|1|-|1972|-|MALAYSIA|-|null|-|Luise.Young@7igug7uAKfSUfJk.edu|-|2452513|-|4975.56 +AAAAAAAAHPBKAAAA|-|Mrs.|-|Jennifer|-|Henderson|-|Y|-|25|-|9|-|1931|-|NICARAGUA|-|null|-|Jennifer.Henderson@dNmYHvcHvs2JO7dHv.com|-|2452367|-|2537.64 +AAAAAAAAIDEBAAAA|-|Ms.|-|Kimberly|-|Daniel|-|N|-|20|-|5|-|1975|-|PITCAIRN|-|null|-|Kimberly.Daniel@aVCkbuphZy95f.org|-|2452625|-|1216.47 +AAAAAAAAIHGHBAAA|-|Dr.|-|Edward|-|White|-|Y|-|20|-|6|-|1963|-|TUNISIA|-|null|-|Edward.White@Lv8xGF8UVbdvpV2.com|-|2452294|-|1655.52 +AAAAAAAAIHGHBAAA|-|Dr.|-|Edward|-|White|-|Y|-|20|-|6|-|1963|-|TUNISIA|-|null|-|Edward.White@Lv8xGF8UVbdvpV2.com|-|2452294|-|1706.32 +AAAAAAAAIIJHBAAA|-|Dr.|-|Timothy|-|Gonzalez|-|N|-|6|-|12|-|1933|-|SWITZERLAND|-|null|-|Timothy.Gonzalez@t9kvgnadGPfD.org|-|2452286|-|1697.08 +AAAAAAAAIIJHBAAA|-|Dr.|-|Timothy|-|Gonzalez|-|N|-|6|-|12|-|1933|-|SWITZERLAND|-|null|-|Timothy.Gonzalez@t9kvgnadGPfD.org|-|2452286|-|6821.76 +AAAAAAAAILAHBAAA|-|Ms.|-|Deloris|-|Hoppe|-|Y|-|23|-|3|-|1933|-|NORFOLK ISLAND|-|null|-|Deloris.Hoppe@tRLBenprHfHDOr2Cg.com|-|2452612|-|1835.73 +AAAAAAAAIMONAAAA|-|Mr.|-|Benjamin|-|Guerra|-|Y|-|10|-|10|-|1982|-|BHUTAN|-|null|-|Benjamin.Guerra@EOpNk.edu|-|2452640|-|1884.79 +AAAAAAAAINGBAAAA|-|Ms.|-|Jennifer|-|Lilly|-|Y|-|23|-|10|-|1979|-|MONACO|-|null|-|Jennifer.Lilly@u.com|-|2452288|-|7412.00 +AAAAAAAAINPGBAAA|-|Mr.|-|Melvin|-|Parker|-|N|-|26|-|1|-|1985|-|SLOVAKIA|-|null|-|Melvin.Parker@3YfpVU6D5f.edu|-|2452294|-|3176.00 +AAAAAAAAIOIDBAAA|-|Sir|-|Troy|-|Leach|-|Y|-|19|-|11|-|1973|-|AFGHANISTAN|-|null|-|Troy.Leach@1ZNMPUKFgl.com|-|2452645|-|6373.50 +AAAAAAAAIPHKAAAA|-|Miss|-|null|-|Chandler|-|null|-|null|-|7|-|null|-|ICELAND|-|null|-|Corinne.Chandler@pNuejtc6Vv4.com|-|null|-|9175.00 +AAAAAAAAIPIJAAAA|-|Mr.|-|Graham|-|Johnson|-|N|-|26|-|7|-|1950|-|JAPAN|-|null|-|Graham.Johnson@GhiVoDbdQB4qg.com|-|2452596|-|1842.48 +AAAAAAAAJCICBAAA|-|Mr.|-|Brandon|-|Gross|-|N|-|4|-|11|-|1958|-|ECUADOR|-|null|-|Brandon.Gross@ATaate3aL1.edu|-|2452313|-|3351.60 +AAAAAAAAJEEPAAAA|-|Ms.|-|Teresa|-|Gee|-|Y|-|4|-|10|-|1929|-|TUVALU|-|null|-|Teresa.Gee@GzTBH6ikITXY2K.edu|-|2452499|-|2459.22 +AAAAAAAAJFANAAAA|-|Miss|-|Olivia|-|Lowry|-|N|-|11|-|4|-|1942|-|HONG KONG|-|null|-|Olivia.Lowry@9sdQ3.com|-|2452504|-|5202.00 +AAAAAAAAJIODAAAA|-|Mrs.|-|Carrie|-|Benson|-|Y|-|24|-|3|-|1958|-|TIMOR-LESTE|-|null|-|Carrie.Benson@C4XxCB.com|-|2452468|-|4663.20 +AAAAAAAAJLBABAAA|-|Mr.|-|Elijah|-|Davis|-|N|-|13|-|7|-|1977|-|CHRISTMAS ISLAND|-|null|-|Elijah.Davis@E1BRYJbLF.com|-|2452338|-|9284.81 +AAAAAAAAKAOFBAAA|-|Ms.|-|Brenna|-|Martinez|-|Y|-|10|-|8|-|1931|-|MARTINIQUE|-|null|-|Brenna.Martinez@h9a0tfVlg9.org|-|2452578|-|1790.24 +AAAAAAAAKBCCAAAA|-|Sir|-|Ralph|-|Pugh|-|N|-|21|-|7|-|1978|-|ANGOLA|-|null|-|Ralph.Pugh@IJnxMn.com|-|2452411|-|3324.28 +AAAAAAAAKHFKAAAA|-|Sir|-|Darius|-|Underwood|-|N|-|30|-|6|-|1935|-|SEYCHELLES|-|null|-|Darius.Underwood@rb8O6.com|-|2452473|-|1713.26 +AAAAAAAAKHMFBAAA|-|Sir|-|Rudy|-|Lewis|-|N|-|25|-|10|-|1974|-|BERMUDA|-|null|-|Rudy.Lewis@8XpHZcN0XTHfsJL.com|-|2452516|-|2618.00 +AAAAAAAAKIDBBAAA|-|Dr.|-|Mike|-|Lewis|-|N|-|21|-|1|-|1980|-|BOLIVIA|-|null|-|Mike.Lewis@NOc2TgRCRQ.org|-|2452615|-|2775.04 +AAAAAAAAKIJFAAAA|-|null|-|null|-|Davis|-|null|-|13|-|12|-|null|-|null|-|null|-|Carl.Davis@YbUjHkAfpNY.com|-|2452491|-|5587.22 +AAAAAAAAKPEBBAAA|-|Dr.|-|null|-|null|-|Y|-|null|-|9|-|1983|-|KENYA|-|null|-|Kyra.Ramirez@T3JNElq4H.com|-|2452423|-|3334.77 +AAAAAAAAKPMCBAAA|-|Dr.|-|Raymond|-|Nichols|-|Y|-|25|-|7|-|1958|-|URUGUAY|-|null|-|Raymond.Nichols@iedTi96i.edu|-|2452629|-|3370.80 +AAAAAAAALANEBAAA|-|Sir|-|Ted|-|Collins|-|Y|-|3|-|6|-|1944|-|UGANDA|-|null|-|Ted.Collins@I.edu|-|2452446|-|4467.60 +AAAAAAAALDFEBAAA|-|Mr.|-|Robert|-|Morris|-|N|-|26|-|1|-|1937|-|CHILE|-|null|-|Robert.Morris@sEQtVxvXT9J.edu|-|2452576|-|2122.00 +AAAAAAAALLOOAAAA|-|Sir|-|Mark|-|Hartley|-|N|-|6|-|5|-|1935|-|SAINT LUCIA|-|null|-|Mark.Hartley@2.edu|-|2452286|-|2155.89 +AAAAAAAAMAADBAAA|-|Sir|-|Richard|-|Williams|-|Y|-|22|-|6|-|1939|-|LUXEMBOURG|-|null|-|Richard.Williams@FnboX7xtJoKRM.edu|-|2452612|-|8196.76 +AAAAAAAAMBDKAAAA|-|Dr.|-|Ginger|-|Swope|-|N|-|19|-|8|-|1937|-|NEW ZEALAND|-|null|-|Ginger.Swope@eccCKj.com|-|2452629|-|3797.92 +AAAAAAAAMGGKAAAA|-|Mrs.|-|Ida|-|Miranda|-|N|-|19|-|8|-|1927|-|AZERBAIJAN|-|null|-|Ida.Miranda@58fss.com|-|2452539|-|1790.28 +AAAAAAAAMJDPAAAA|-|Mr.|-|Stephen|-|Hawkins|-|null|-|28|-|10|-|null|-|COMOROS|-|null|-|Stephen.Hawkins@shZF5uZaUU.org|-|null|-|4394.24 +AAAAAAAAMKBGBAAA|-|Sir|-|null|-|Kaiser|-|null|-|null|-|null|-|null|-|null|-|null|-|null|-|null|-|1642.65 +AAAAAAAAMKCABAAA|-|Miss|-|Arlean|-|Horne|-|N|-|10|-|9|-|1984|-|TOKELAU|-|null|-|Arlean.Horne@bYBOYIzFjaEgU4.org|-|2452435|-|1745.52 +AAAAAAAAMMIMAAAA|-|Ms.|-|Candace|-|null|-|null|-|1|-|10|-|null|-|EL SALVADOR|-|null|-|null|-|null|-|2882.36 +AAAAAAAAMOCCBAAA|-|Dr.|-|Charles|-|Teague|-|Y|-|29|-|10|-|1938|-|NIGER|-|null|-|Charles.Teague@g6kn96GbfBqD3HJ.com|-|2452511|-|1686.48 +AAAAAAAAMPLEBAAA|-|Ms.|-|Tiffany|-|Wingfield|-|N|-|30|-|1|-|1935|-|TURKMENISTAN|-|null|-|Tiffany.Wingfield@Y9Dt.org|-|2452646|-|6816.42 +AAAAAAAANAICBAAA|-|Ms.|-|Rita|-|Hansen|-|N|-|23|-|11|-|1977|-|SAMOA|-|null|-|Rita.Hansen@oefSLv1mHl8ZAlSpRy3.org|-|2452294|-|2568.58 +AAAAAAAANANHBAAA|-|Mrs.|-|Jessica|-|Rivera|-|N|-|11|-|12|-|1946|-|JERSEY|-|null|-|Jessica.Rivera@iN34AzvDUxQdTy.edu|-|2452566|-|1763.08 +AAAAAAAANEHCBAAA|-|Miss|-|Pamala|-|Wright|-|N|-|22|-|2|-|1924|-|TAJIKISTAN|-|null|-|Pamala.Wright@yyuUPg3eXp.com|-|2452467|-|1787.90 +AAAAAAAANFPLAAAA|-|Dr.|-|Ann|-|Quarles|-|Y|-|28|-|6|-|1986|-|ALAND ISLANDS|-|null|-|Ann.Quarles@0Ry4iCg4mkhgATXL1A.edu|-|2452643|-|7101.60 +AAAAAAAANLLOAAAA|-|Mrs.|-|Annette|-|Ramsey|-|N|-|9|-|7|-|1937|-|ARMENIA|-|null|-|Annette.Ramsey@I1bZyb9HLMb6.edu|-|2452485|-|2386.02 +AAAAAAAANMFGBAAA|-|Mr.|-|Daniel|-|French|-|N|-|24|-|3|-|1937|-|CAYMAN ISLANDS|-|null|-|Daniel.French@cYvdnb.org|-|2452642|-|1832.32 +AAAAAAAANNAAAAAA|-|Mr.|-|Melvin|-|Huntley|-|N|-|22|-|2|-|1951|-|PERU|-|null|-|Melvin.Huntley@mFaRxblkehMr.com|-|2452368|-|4573.91 +AAAAAAAAOFHHAAAA|-|Miss|-|Rhonda|-|Jordan|-|N|-|3|-|3|-|1943|-|GERMANY|-|null|-|Rhonda.Jordan@LX.edu|-|2452633|-|2119.90 +AAAAAAAAONBAAAAA|-|Dr.|-|Pamela|-|Mast|-|Y|-|11|-|4|-|1983|-|BOLIVIA|-|null|-|Pamela.Mast@hRJnAYv7oxEK2GSUqYn.edu|-|2452434|-|2329.73 +AAAAAAAAONBAAAAA|-|Dr.|-|Pamela|-|Mast|-|Y|-|11|-|4|-|1983|-|BOLIVIA|-|null|-|Pamela.Mast@hRJnAYv7oxEK2GSUqYn.edu|-|2452434|-|2574.32 +AAAAAAAAOOGCBAAA|-|Mr.|-|Joshua|-|Holmes|-|Y|-|18|-|6|-|1924|-|TIMOR-LESTE|-|null|-|Joshua.Holmes@3Hj8u.org|-|2452437|-|7662.80 +AAAAAAAAOPIMAAAA|-|Mrs.|-|Saundra|-|Sparks|-|Y|-|25|-|3|-|1925|-|UZBEKISTAN|-|null|-|Saundra.Sparks@aeUbs.com|-|2452389|-|2292.00 +AAAAAAAAPAFGBAAA|-|Mr.|-|Daniel|-|Griffith|-|N|-|27|-|1|-|1929|-|PANAMA|-|null|-|Daniel.Griffith@7R.org|-|2452342|-|1916.91 +AAAAAAAAPAJAAAAA|-|Dr.|-|Anna|-|Diaz|-|N|-|9|-|6|-|1963|-|NORFOLK ISLAND|-|null|-|Anna.Diaz@RG6XhG059j06.com|-|2452382|-|2057.25 +AAAAAAAAPBBGBAAA|-|Sir|-|Thomas|-|Smith|-|N|-|4|-|1|-|1945|-|KIRIBATI|-|null|-|Thomas.Smith@UzAk.com|-|2452324|-|8312.15 +AAAAAAAAPFIHAAAA|-|Dr.|-|Minerva|-|Johnson|-|N|-|3|-|12|-|1939|-|KENYA|-|null|-|Minerva.Johnson@cCnHmACS.com|-|2452647|-|2233.56 +AAAAAAAAPFJKAAAA|-|Mrs.|-|Mable|-|Saldivar|-|N|-|19|-|2|-|1970|-|ISLE OF MAN|-|null|-|Mable.Saldivar@TxxCtoMxIS6dbVy.com|-|2452583|-|2371.46 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q31.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q31.out new file mode 100644 index 0000000000000..9b30cc27a6e62 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q31.out @@ -0,0 +1,61 @@ +Pike County|-|2000|-|0.87756608639678817034|-|0.86487524757082952225|-|1.66450846493571420317|-|1.60752153195890666018 +Plymouth County|-|2000|-|0.42751024431730323179|-|0.24869467440858413355|-|1.77347026156010104138|-|0.95743334493327210261 +Sherman County|-|2000|-|3.80549228460960365296|-|0.85018052505371507262|-|3.28429802752271011291|-|2.95060760395590827092 +Hale County|-|2000|-|1.13181285759861396698|-|0.37084472158598998345|-|2.76039662764995099764|-|2.04880905907673376536 +Franklin County|-|2000|-|1.23346105169430839663|-|1.16004116355148303419|-|3.11011280618208475383|-|1.72852883588875015022 +Bristol County|-|2000|-|2.03252306215265583168|-|0.84389707668347883239|-|1.88436946252627433938|-|0.50855932416819944462 +Thomas County|-|2000|-|2.83931404059757943504|-|1.88036403728663893895|-|1.98634825955250608974|-|0.52141190626809911920 +Sioux County|-|2000|-|4.05794434246552571650|-|1.42665905155276116003|-|1.56803884104955881507|-|1.13419970938634791615 +Boone County|-|2000|-|1.10318140625440703802|-|1.01388129938545215917|-|2.93583104434541244580|-|0.81595222675278264090 +Wyoming County|-|2000|-|0.71452417457513699221|-|0.46814038549181972360|-|9.85342118017399816692|-|3.19644465036087064672 +Escambia County|-|2000|-|1.29140013472373800933|-|1.22312591570259586531|-|4.94949857002487942979|-|1.90881493105514558681 +Sully County|-|2000|-|0.93205458749496189963|-|0.25090187329447210579|-|2.29778378271979174484|-|1.08802927271862880423 +Quitman County|-|2000|-|0.36883113368425186793|-|0.36314047030366149345|-|5.16370853507835506706|-|3.21226900707602706150 +Howard County|-|2000|-|0.75689303418215066506|-|0.40416603686332285826|-|5.20017335230756289550|-|3.93113017208635232323 +Milam County|-|2000|-|2.28508195011379140646|-|0.46652927795640169049|-|0.78408081688146536737|-|0.47493776386092038861 +Woodford County|-|2000|-|1.66114001659859092820|-|0.55664623460469568767|-|1.82209706086687377022|-|1.17870749798601085737 +Dillon County|-|2000|-|0.32644424794620832608|-|0.12281769967769250465|-|2.54843886762550432202|-|2.36794563665865531250 +Cedar County|-|2000|-|1.73903789422605330870|-|0.46305877715234029287|-|8.77007422523370529780|-|3.61252572439703538764 +Valdez-Cordova Census Area|-|2000|-|1.25070886925917779038|-|0.59811263426251699657|-|1.22504083956972939990|-|0.84771422379395948262 +Fremont County|-|2000|-|2.08342397478237427534|-|0.99231216361555377660|-|4.64450632140050612837|-|1.66543397250235949142 +Richland County|-|2000|-|3.25294641523656020681|-|1.07950401261765093476|-|2.63822689761623055166|-|1.41044850738739382893 +Mitchell County|-|2000|-|1.67453892386598503677|-|1.34365298077586851819|-|1.23346415770637208954|-|0.95073923197301166934 +Salem city|-|2000|-|0.70139973333391227808|-|0.35839062570476603239|-|2.05906098316466157534|-|1.08354507133942051245 +Langlade County|-|2000|-|1.68676813359812642201|-|0.96428449439984805852|-|2.54522036089486624332|-|1.23454212891942526190 +Jennings County|-|2000|-|2.78984076175313855515|-|2.07599697431575122264|-|3.44972481162691656332|-|2.44378922187060355318 +Moore County|-|2000|-|2.15694071746428807771|-|0.40796143296369785394|-|1.74966386964488096764|-|1.16471835770020727271 +Lonoke County|-|2000|-|2.08982990182342723842|-|1.10340085014357551300|-|1.15539868818698913544|-|0.99289022395794532472 +Buffalo County|-|2000|-|0.79851677786134640592|-|0.66608776395688494889|-|4.12963020014993273566|-|1.41417145222467738551 +Montgomery County|-|2000|-|1.56847414391333207258|-|0.83177598227578637405|-|2.13678203835469561935|-|2.10257648921068871721 +Lee County|-|2000|-|1.30443690529253126871|-|0.72035286226320500421|-|2.23150088973480218462|-|1.84186089836441132231 +Essex County|-|2000|-|0.91140422255526176760|-|0.80397981840092167933|-|2.40581838121906819055|-|1.51850239999231343611 +Cumberland County|-|2000|-|1.08524453978148728453|-|0.80144708440874338843|-|1.60419019384387788968|-|1.54733087343509046916 +Gaines County|-|2000|-|0.18699408635518783605|-|0.15864149496085374898|-|4.38012199409197995027|-|3.26392730974685542866 +Clinton County|-|2000|-|1.74067151347304310575|-|1.41218893174550937759|-|1.44667681199587337982|-|1.25445563958487852628 +Pawnee County|-|2000|-|1.78950195911489308028|-|1.16132303881758630677|-|3.42292675284956044317|-|0.55048211219399261479 +Mineral County|-|2000|-|3.34300539922925594005|-|2.45993211849872338822|-|2.20409211845792015572|-|1.08747970913885456325 +Pope County|-|2000|-|1.42325802767704214927|-|0.71289882499386886358|-|5.32400461162588232396|-|4.36612471915760924134 +El Paso County|-|2000|-|1.33106683366793877022|-|0.52026046839940548659|-|6.85897871779069724650|-|3.52274370756107989319 +Waushara County|-|2000|-|7.21438509071107960599|-|3.30949368270859706271|-|0.60525565982701327843|-|0.60022615175317538544 +Bedford city|-|2000|-|1.41895245428186244343|-|1.28647520475423955859|-|1.98397166014536480387|-|1.22052485500235683695 +Ottawa County|-|2000|-|1.75323872261604668329|-|0.83468698542567460304|-|1.61973935146544593444|-|1.42351390679742385404 +Carlisle County|-|2000|-|1.69492598618078795489|-|1.25168931735787673049|-|1.50718182376907682203|-|0.88181897085363449075 +Forsyth County|-|2000|-|0.68611318852553022140|-|0.65587408738915750878|-|3.37787340847752340465|-|1.32466135376522054649 +Wayne County|-|2000|-|0.94936213717458544629|-|0.78911846142834762231|-|2.95594340748058137863|-|1.96105182147450904414 +Johnson County|-|2000|-|2.57795641894299816468|-|0.91616273582603658596|-|1.74313979276860348710|-|1.18351065602569093409 +Crawford County|-|2000|-|1.31661755312891088929|-|0.94956543151027392277|-|2.05054841119621802578|-|1.32014748612874091613 +Gallatin County|-|2000|-|0.57267047178378396314|-|0.42960913482855774228|-|5.40426025792003986274|-|2.60129747557845045914 +Blaine County|-|2000|-|0.90103169326915114550|-|0.83066560812940517400|-|5.91832927336153981754|-|2.20534708400177561487 +Rockland County|-|2000|-|0.42416114343500113082|-|0.20590865976918589352|-|3.77761891177163143690|-|3.03503154543555890597 +Carroll County|-|2000|-|1.35087769364534219248|-|1.29257051856006991407|-|2.20994529474585418644|-|1.48849785082428358420 +Stafford County|-|2000|-|2.47320669600627229039|-|0.89946337873032839807|-|1.93845899918871104768|-|0.90136132522419968048 +Pierce County|-|2000|-|2.54716933553443590360|-|1.41791053358023116142|-|1.22686753138250342480|-|1.16331445295301712751 +Limestone County|-|2000|-|3.32976919500999168869|-|0.75905050855357115484|-|1.82617549463146988019|-|1.71235192999491983271 +Seminole County|-|2000|-|1.44053424523671633073|-|0.43123781775978624959|-|5.98509759915132505814|-|3.90425489309553190978 +Pamlico County|-|2000|-|1.94782724762452970276|-|0.35933779785623271693|-|1.56217364489823888166|-|1.36537077933199287260 +Suffolk County|-|2000|-|2.42331649558212058212|-|1.82204858730891230166|-|6.53566355839665770211|-|1.95538998836281647012 +Pocahontas County|-|2000|-|1.81898673318791661987|-|1.68668175433656035469|-|2.78840493521175989923|-|2.31448886854618583141 +Drew County|-|2000|-|1.33752592432768148542|-|0.42051684931974493150|-|4.42925583278116865936|-|3.59005466753091100322 +Todd County|-|2000|-|2.82280525212475972969|-|0.89465756573513943151|-|3.16893938472753630323|-|1.86121311814899148488 +Colbert County|-|2000|-|1.18024333271178132777|-|0.83788572603247302022|-|0.54236640028023008306|-|0.42663333520116081271 +Williamson County|-|2000|-|6.40051753949925199369|-|0.73796090630650528678|-|2.74186195207121934591|-|2.27659084754941781749 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q32.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q32.out new file mode 100644 index 0000000000000..3a452cd67296a --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q32.out @@ -0,0 +1 @@ +101012.93 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q33.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q33.out new file mode 100644 index 0000000000000..bf9fafddd4b65 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q33.out @@ -0,0 +1,100 @@ +914|-|67.60 +670|-|471.56 +787|-|1226.99 +961|-|1842.94 +682|-|1848.40 +953|-|1876.35 +911|-|1979.10 +884|-|2086.73 +754|-|2206.11 +341|-|2206.20 +656|-|2396.46 +689|-|2758.39 +764|-|2804.89 +839|-|2957.67 +977|-|2959.65 +847|-|3162.83 +808|-|3223.82 +938|-|3255.55 +950|-|3765.54 +393|-|3834.95 +386|-|4077.69 +339|-|4171.23 +975|-|4464.72 +875|-|4762.13 +881|-|4829.25 +820|-|4868.72 +783|-|4990.64 +624|-|5040.97 +626|-|5114.15 +780|-|5132.38 +641|-|5181.21 +858|-|5511.06 +305|-|5561.81 +425|-|5946.16 +899|-|6288.28 +442|-|6393.89 +876|-|6430.38 +886|-|6566.57 +758|-|6583.24 +741|-|6626.44 +818|-|6641.72 +546|-|6810.58 +622|-|6835.10 +986|-|6916.08 +56|-|7027.08 +947|-|7159.83 +944|-|7195.54 +410|-|7459.47 +962|-|7548.91 +688|-|7599.88 +378|-|7722.07 +723|-|7777.62 +541|-|7840.29 +522|-|7841.26 +672|-|7996.81 +804|-|8104.16 +843|-|8285.29 +733|-|8359.45 +561|-|8383.93 +788|-|8585.67 +587|-|8790.33 +601|-|8988.28 +674|-|8990.93 +935|-|9157.73 +883|-|9245.99 +558|-|9539.17 +509|-|9597.52 +890|-|9660.81 +539|-|9798.65 +384|-|9833.28 +771|-|9933.35 +535|-|9969.09 +826|-|9983.30 +907|-|10034.56 +928|-|10087.12 +272|-|10207.11 +313|-|10422.96 +639|-|10541.77 +966|-|10596.66 +680|-|10733.59 +895|-|10818.56 +668|-|10835.81 +889|-|10988.43 +767|-|11000.67 +822|-|11018.37 +396|-|11210.77 +861|-|11511.68 +679|-|11630.47 +980|-|11726.38 +878|-|11779.17 +753|-|11822.07 +994|-|11909.25 +859|-|11916.14 +646|-|12490.42 +908|-|12519.26 +613|-|12629.39 +436|-|12643.25 +422|-|12725.87 +603|-|12753.42 +463|-|12775.04 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q34.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q34.out new file mode 100644 index 0000000000000..ca0350cfdec54 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q34.out @@ -0,0 +1,453 @@ +null|-|null|-|null|-|Y|-|47915|-|15 +null|-|null|-|null|-|Y|-|49177|-|16 +null|-|null|-|null|-|Y|-|103365|-|16 +null|-|null|-|null|-|null|-|12942|-|15 +null|-|null|-|null|-|null|-|46297|-|15 +null|-|null|-|null|-|null|-|178680|-|15 +null|-|null|-|null|-|null|-|215293|-|15 +null|-|null|-|Dr.|-|Y|-|116515|-|15 +null|-|null|-|Dr.|-|null|-|169003|-|15 +null|-|Andrew|-|null|-|Y|-|44786|-|15 +null|-|Brad|-|null|-|null|-|26720|-|16 +null|-|Carl|-|Dr.|-|null|-|169953|-|15 +null|-|Jeanne|-|Dr.|-|null|-|200088|-|15 +null|-|Joe|-|null|-|null|-|24308|-|15 +null|-|Joyce|-|Miss|-|Y|-|224685|-|15 +null|-|Mike|-|null|-|Y|-|80205|-|16 +null|-|Rubin|-|Sir|-|null|-|30056|-|15 +null|-|Teddy|-|Mr.|-|null|-|76497|-|15 +null|-|Teri|-|Dr.|-|null|-|135830|-|15 +Adams|-|Jonathan|-|Sir|-|N|-|152866|-|15 +Adkins|-|Clyde|-|Dr.|-|Y|-|92611|-|15 +Adler|-|Justin|-|Sir|-|Y|-|226187|-|15 +Allen|-|Rose|-|Mrs.|-|N|-|179476|-|16 +Allen|-|Tony|-|Mr.|-|Y|-|17947|-|15 +Anderson|-|Debra|-|Ms.|-|N|-|194775|-|15 +Anderson|-|Randy|-|Sir|-|N|-|156935|-|15 +Anderson|-|William|-|Sir|-|N|-|225914|-|15 +Andrews|-|Jacob|-|Mr.|-|N|-|67111|-|16 +Andrews|-|Samuel|-|Dr.|-|Y|-|139993|-|16 +Angel|-|Kevin|-|Mr.|-|Y|-|106628|-|15 +Armijo|-|Madeline|-|Ms.|-|Y|-|160816|-|15 +Armstrong|-|Jillian|-|Mrs.|-|N|-|101896|-|15 +Ashley|-|Rudolph|-|Mr.|-|N|-|207648|-|15 +Austin|-|Loyd|-|Sir|-|N|-|175913|-|16 +Baca|-|Dorothy|-|Mrs.|-|N|-|64890|-|15 +Bailey|-|Gertrude|-|Mrs.|-|N|-|170310|-|16 +Baker|-|Jamie|-|Dr.|-|Y|-|9916|-|15 +Baker|-|Melissa|-|Ms.|-|Y|-|167033|-|15 +Ball|-|Branden|-|Mr.|-|Y|-|194897|-|15 +Barnes|-|Ruth|-|Dr.|-|N|-|84038|-|15 +Barnes|-|Walter|-|Sir|-|N|-|4828|-|15 +Barney|-|Samuel|-|Sir|-|N|-|15288|-|15 +Barnhart|-|Charley|-|Mr.|-|Y|-|166576|-|15 +Barone|-|Seth|-|Mr.|-|Y|-|162374|-|15 +Barrett|-|David|-|Sir|-|N|-|189879|-|15 +Bays|-|Roger|-|Sir|-|N|-|22701|-|15 +Beach|-|Paul|-|Sir|-|Y|-|30120|-|15 +Bean|-|Margaret|-|Dr.|-|Y|-|122174|-|15 +Bear|-|Scott|-|Sir|-|Y|-|82291|-|15 +Beck|-|Ron|-|Mr.|-|N|-|221964|-|16 +Belanger|-|Maximo|-|Dr.|-|N|-|176474|-|16 +Belcher|-|James|-|Sir|-|Y|-|239470|-|16 +Bell|-|Carrie|-|Miss|-|N|-|5527|-|15 +Bell|-|Matthew|-|Dr.|-|N|-|20400|-|15 +Bender|-|Danielle|-|Miss|-|Y|-|151345|-|15 +Benjamin|-|Consuelo|-|Ms.|-|Y|-|201086|-|15 +Benoit|-|Matthew|-|Mr.|-|N|-|223772|-|15 +Benton|-|Douglas|-|Mr.|-|N|-|201453|-|15 +Bergman|-|Joann|-|Miss|-|N|-|177052|-|15 +Berry|-|Lottie|-|Ms.|-|Y|-|224144|-|15 +Billings|-|Peter|-|Sir|-|N|-|46162|-|15 +Bird|-|Nancy|-|Dr.|-|N|-|87176|-|15 +Blake|-|Heather|-|Ms.|-|N|-|116761|-|16 +Bledsoe|-|Donald|-|Dr.|-|Y|-|165813|-|15 +Bollinger|-|Sophie|-|Ms.|-|Y|-|219022|-|16 +Boone|-|Linda|-|Ms.|-|N|-|24309|-|16 +Bray|-|Letitia|-|Miss|-|Y|-|177447|-|16 +Breen|-|Sarah|-|Ms.|-|Y|-|181204|-|15 +Briggs|-|Bruce|-|Mr.|-|N|-|158405|-|15 +Briley|-|Willie|-|Sir|-|Y|-|103103|-|15 +Brooks|-|Angie|-|Mrs.|-|Y|-|22180|-|15 +Brooks|-|Robert|-|Sir|-|N|-|155576|-|16 +Brooks|-|Tony|-|Mr.|-|N|-|211993|-|15 +Brown|-|Annie|-|Mrs.|-|Y|-|226546|-|15 +Brown|-|Cathey|-|Mrs.|-|N|-|202489|-|16 +Brown|-|Charlene|-|Dr.|-|N|-|233475|-|16 +Brown|-|Christina|-|null|-|null|-|220010|-|15 +Brown|-|Kelly|-|Dr.|-|N|-|225134|-|16 +Brown|-|Mark|-|Mr.|-|Y|-|127416|-|15 +Buchanan|-|Kathleen|-|Ms.|-|N|-|107611|-|15 +Burgess|-|Colleen|-|Miss|-|Y|-|1180|-|15 +Burkhart|-|Laura|-|Miss|-|Y|-|102023|-|15 +Bynum|-|Elaine|-|Mrs.|-|N|-|36706|-|15 +Byrd|-|Kelly|-|Sir|-|N|-|165115|-|16 +Cagle|-|Jennifer|-|Miss|-|N|-|163129|-|15 +Caldwell|-|Minnie|-|Ms.|-|N|-|120422|-|15 +Campbell|-|Kelsey|-|Dr.|-|N|-|156868|-|15 +Cardona|-|Robert|-|Mr.|-|N|-|200501|-|15 +Cardwell|-|Tressa|-|Dr.|-|N|-|44716|-|16 +Carter|-|Wendy|-|Ms.|-|N|-|96439|-|15 +Carver|-|Bernard|-|Mr.|-|Y|-|194943|-|16 +Casey|-|Claudia|-|Mrs.|-|N|-|143367|-|15 +Chavarria|-|Luz|-|Dr.|-|Y|-|149423|-|15 +Christensen|-|Larry|-|Dr.|-|Y|-|58094|-|15 +Churchill|-|Susie|-|Dr.|-|N|-|68459|-|15 +Clough|-|Susie|-|Ms.|-|N|-|150795|-|15 +Cochran|-|Daniel|-|Dr.|-|N|-|191978|-|16 +Coleman|-|Inez|-|Dr.|-|Y|-|88249|-|16 +Coleman|-|John|-|Mr.|-|N|-|49444|-|15 +Colon|-|Anna|-|Dr.|-|Y|-|143694|-|15 +Colon|-|Lorraine|-|Mrs.|-|Y|-|187586|-|15 +Combs|-|Belinda|-|Mrs.|-|N|-|225385|-|15 +Conley|-|Roxie|-|Dr.|-|N|-|196663|-|15 +Cook|-|Adam|-|Ms.|-|Y|-|167339|-|15 +Cooper|-|Mildred|-|Mrs.|-|N|-|44542|-|15 +Cooper|-|Tim|-|Sir|-|N|-|74488|-|16 +Cooper|-|Trevor|-|Dr.|-|N|-|76499|-|15 +Cordero|-|Andrew|-|null|-|null|-|150937|-|15 +Cote|-|Justin|-|Dr.|-|N|-|93466|-|15 +Cotton|-|Glenda|-|Ms.|-|N|-|151588|-|15 +Cox|-|Teresa|-|Miss|-|Y|-|52749|-|16 +Cramer|-|Linda|-|Ms.|-|N|-|126628|-|15 +Crittenden|-|Amie|-|Ms.|-|N|-|138787|-|15 +Cruz|-|Martha|-|Miss|-|N|-|86683|-|16 +Cuellar|-|Oscar|-|Mr.|-|Y|-|86781|-|16 +Cullen|-|Larry|-|Mr.|-|Y|-|221242|-|16 +Curry|-|null|-|Ms.|-|null|-|86462|-|15 +Curtis|-|Joseph|-|Mr.|-|N|-|70623|-|15 +Davis|-|Erminia|-|Dr.|-|N|-|151167|-|15 +Davis|-|Lisa|-|Mrs.|-|N|-|32527|-|15 +Davis|-|Marilyn|-|Mrs.|-|N|-|170442|-|16 +Davis|-|Myrtle|-|Dr.|-|Y|-|37430|-|15 +Davis|-|Norberto|-|Sir|-|N|-|37525|-|15 +Dejesus|-|Donna|-|Ms.|-|N|-|171477|-|15 +Diamond|-|Fernando|-|Dr.|-|N|-|216391|-|15 +Diaz|-|Denis|-|Sir|-|Y|-|148996|-|15 +Diaz|-|Walton|-|Mr.|-|N|-|131135|-|16 +Dickey|-|Manuel|-|Dr.|-|Y|-|155865|-|15 +Douglas|-|Janet|-|Miss|-|Y|-|73424|-|15 +Douglas|-|Sierra|-|Mrs.|-|Y|-|27283|-|16 +Dove|-|Garry|-|Dr.|-|N|-|152171|-|16 +Drake|-|Rosetta|-|Dr.|-|Y|-|238040|-|15 +Dumas|-|Travis|-|Mr.|-|Y|-|94154|-|15 +Durham|-|Andrea|-|Dr.|-|Y|-|144734|-|15 +Dykes|-|Sue|-|Ms.|-|N|-|135362|-|16 +Elkins|-|William|-|Dr.|-|Y|-|17666|-|15 +Engle|-|John|-|Mr.|-|N|-|224697|-|15 +Ervin|-|Charlene|-|Mrs.|-|N|-|44494|-|16 +Estrada|-|Jessica|-|Miss|-|N|-|187030|-|15 +Estrada|-|Tawanna|-|Mrs.|-|N|-|48597|-|15 +Evans|-|Bertha|-|Ms.|-|N|-|62343|-|16 +Evans|-|Timothy|-|Mr.|-|N|-|192168|-|16 +Evers|-|Amelia|-|Dr.|-|Y|-|69525|-|16 +Farrow|-|Kathy|-|Miss|-|Y|-|200078|-|15 +Faulkner|-|Robert|-|Dr.|-|N|-|109423|-|15 +Felton|-|null|-|null|-|null|-|134966|-|15 +Felton|-|David|-|Mr.|-|N|-|97807|-|16 +Figueroa|-|Kathleen|-|Mrs.|-|Y|-|86027|-|15 +Finn|-|Robert|-|Mr.|-|N|-|38057|-|15 +Fischer|-|Tamara|-|Mrs.|-|N|-|66790|-|15 +Fletcher|-|Judy|-|Mrs.|-|Y|-|140355|-|16 +Floyd|-|Rosa|-|Dr.|-|Y|-|52698|-|15 +Foreman|-|Autumn|-|Mrs.|-|Y|-|164060|-|15 +Fox|-|Charles|-|Dr.|-|N|-|132924|-|15 +Franco|-|Jerome|-|Dr.|-|Y|-|167102|-|15 +Freeman|-|Pedro|-|Sir|-|N|-|20510|-|16 +Frost|-|Rose|-|Miss|-|Y|-|218026|-|16 +Funk|-|Erika|-|Mrs.|-|N|-|20647|-|16 +Garcia|-|Carl|-|Mr.|-|N|-|83021|-|15 +Garcia|-|Christopher|-|Sir|-|Y|-|181616|-|16 +Garcia|-|Karen|-|Miss|-|N|-|236987|-|15 +Garcia|-|Robert|-|Dr.|-|N|-|172185|-|16 +Garcia|-|Vivian|-|Ms.|-|N|-|151169|-|16 +Garner|-|Michael|-|Mr.|-|Y|-|170830|-|16 +Garner|-|Paula|-|Ms.|-|N|-|153665|-|15 +Garner|-|Stella|-|Miss|-|N|-|130778|-|15 +Garrison|-|null|-|null|-|Y|-|19056|-|16 +Garza|-|null|-|Dr.|-|null|-|108823|-|15 +Garza|-|Sophie|-|Dr.|-|Y|-|10449|-|15 +Gaskin|-|Katherine|-|Ms.|-|Y|-|50865|-|15 +Gibbons|-|Joanne|-|Miss|-|N|-|200738|-|15 +Gifford|-|Mark|-|Mr.|-|N|-|225973|-|16 +Gill|-|Ronald|-|Dr.|-|Y|-|49896|-|16 +Gilmer|-|Ted|-|Mr.|-|Y|-|94254|-|15 +Gilmore|-|Austin|-|Dr.|-|Y|-|239871|-|15 +Goins|-|Joshua|-|Dr.|-|N|-|33404|-|16 +Goldsmith|-|Bernice|-|Ms.|-|Y|-|2347|-|15 +Goodman|-|null|-|null|-|N|-|71903|-|15 +Gower|-|Nettie|-|Miss|-|N|-|10576|-|15 +Graff|-|Anita|-|Mrs.|-|Y|-|124800|-|15 +Gray|-|Jacqueline|-|Mrs.|-|Y|-|76697|-|15 +Gray|-|Paul|-|Sir|-|Y|-|115380|-|16 +Green|-|Annette|-|Miss|-|Y|-|130087|-|15 +Griggs|-|Larry|-|Mr.|-|N|-|228997|-|15 +Guillory|-|Antonio|-|Mrs.|-|N|-|80580|-|16 +Hall|-|Ella|-|Mrs.|-|Y|-|8711|-|16 +Hall|-|James|-|Sir|-|N|-|227015|-|15 +Hamilton|-|Ana|-|Mrs.|-|Y|-|35761|-|15 +Hammond|-|Roger|-|Sir|-|Y|-|54884|-|16 +Hannan|-|Jimmy|-|Sir|-|Y|-|202615|-|15 +Hardin|-|Kimberly|-|Dr.|-|N|-|192424|-|16 +Harris|-|Tammy|-|Dr.|-|N|-|217761|-|16 +Harrison|-|Jason|-|Sir|-|N|-|17498|-|16 +Hartmann|-|Joey|-|Dr.|-|N|-|230915|-|15 +Hawk|-|Victoria|-|Mrs.|-|N|-|205431|-|16 +Hawkins|-|Robert|-|Mr.|-|N|-|98809|-|15 +Hawley|-|Milton|-|Sir|-|Y|-|71841|-|16 +Hayes|-|David|-|Sir|-|N|-|82274|-|15 +Haynes|-|Sara|-|Miss|-|Y|-|139168|-|16 +Headley|-|Heidi|-|Ms.|-|Y|-|1498|-|15 +Hennessey|-|Debbie|-|Dr.|-|Y|-|79256|-|15 +Herbert|-|Pedro|-|Dr.|-|Y|-|40362|-|15 +Hernandez|-|Dolly|-|Miss|-|Y|-|189987|-|15 +Hill|-|Barbara|-|Mrs.|-|Y|-|87061|-|16 +Hill|-|Harriet|-|Mrs.|-|N|-|13699|-|15 +Hill|-|James|-|Dr.|-|N|-|13846|-|15 +Hill|-|John|-|Sir|-|N|-|48688|-|15 +Hill|-|Robert|-|Mr.|-|N|-|54945|-|15 +Hill|-|Sandra|-|Miss|-|N|-|128190|-|16 +Hill|-|Sarah|-|Mrs.|-|Y|-|51108|-|15 +Holcomb|-|Bonnie|-|Ms.|-|N|-|101172|-|16 +Holland|-|Jeremiah|-|Dr.|-|N|-|95938|-|16 +Hollis|-|Adelina|-|Miss|-|Y|-|151685|-|15 +Horvath|-|Dana|-|Sir|-|Y|-|36487|-|15 +House|-|Frederick|-|Dr.|-|N|-|179224|-|16 +Howell|-|James|-|Sir|-|N|-|230533|-|15 +Huffman|-|Caitlin|-|Ms.|-|Y|-|218589|-|16 +Hughes|-|Ella|-|Mrs.|-|Y|-|38262|-|15 +Hughes|-|Marie|-|Ms.|-|N|-|49156|-|15 +Hull|-|Evelyn|-|Miss|-|N|-|210486|-|16 +Hussey|-|Charles|-|Dr.|-|N|-|236807|-|15 +Jacobs|-|Florence|-|Dr.|-|N|-|175826|-|16 +Jameson|-|Miguel|-|Dr.|-|N|-|9181|-|16 +Jean|-|James|-|Dr.|-|N|-|133261|-|16 +John|-|John|-|Dr.|-|Y|-|229104|-|16 +Johnson|-|Flora|-|Dr.|-|Y|-|103095|-|15 +Johnson|-|Julia|-|Dr.|-|N|-|27560|-|15 +Jones|-|Ella|-|Mrs.|-|Y|-|84685|-|15 +Jones|-|Irene|-|Mrs.|-|Y|-|60745|-|15 +Jones|-|Jeffrey|-|Sir|-|N|-|203136|-|15 +Jones|-|Melinda|-|Miss|-|Y|-|88831|-|16 +Jones|-|Theresa|-|Ms.|-|N|-|219765|-|16 +Jones|-|Timothy|-|Dr.|-|Y|-|146429|-|15 +Juarez|-|Gloria|-|Ms.|-|Y|-|11419|-|15 +Julian|-|Eva|-|Ms.|-|N|-|92314|-|15 +Kelly|-|Charles|-|Dr.|-|Y|-|197526|-|15 +Kenney|-|Richard|-|Dr.|-|Y|-|141753|-|15 +Kersey|-|Nellie|-|Mrs.|-|Y|-|197210|-|16 +Khan|-|Hank|-|Mr.|-|N|-|177803|-|15 +Kim|-|Charlotte|-|Dr.|-|Y|-|7208|-|16 +Kimmel|-|Tammy|-|Ms.|-|N|-|34503|-|15 +King|-|Samantha|-|Dr.|-|Y|-|176060|-|15 +Knudsen|-|David|-|Dr.|-|N|-|175836|-|15 +Kunz|-|Sarah|-|Dr.|-|N|-|74568|-|15 +Landry|-|Rudolph|-|Sir|-|N|-|117581|-|15 +Lane|-|Luis|-|Sir|-|N|-|232302|-|16 +Langford|-|Darlene|-|Mrs.|-|N|-|214891|-|15 +Larson|-|Barbara|-|Dr.|-|Y|-|39608|-|15 +Larson|-|Kevin|-|Mr.|-|Y|-|35053|-|15 +Lavigne|-|Barbara|-|Dr.|-|N|-|215682|-|15 +Lawson|-|Ronald|-|Dr.|-|N|-|130932|-|16 +Lee|-|Ingrid|-|Miss|-|Y|-|190873|-|15 +Lee|-|Malik|-|Dr.|-|N|-|20122|-|16 +Lemons|-|Latasha|-|Miss|-|N|-|109935|-|15 +Lester|-|Lewis|-|Mr.|-|N|-|215058|-|15 +Lewis|-|Peter|-|Dr.|-|Y|-|191829|-|15 +Lincoln|-|Anthony|-|Miss|-|Y|-|1407|-|16 +Little|-|Catherine|-|Ms.|-|Y|-|227989|-|15 +Little|-|Randall|-|Mr.|-|N|-|21323|-|15 +Logan|-|Cameron|-|Sir|-|N|-|18368|-|16 +Lopez|-|Karen|-|Dr.|-|Y|-|136008|-|15 +Luna|-|Joann|-|Dr.|-|Y|-|82208|-|15 +Lunsford|-|Kevin|-|Dr.|-|N|-|159120|-|16 +Lyle|-|Michael|-|Dr.|-|N|-|108405|-|15 +Lynch|-|Sylvia|-|Ms.|-|Y|-|115438|-|15 +Lyon|-|Michael|-|Mr.|-|N|-|140323|-|15 +Maas|-|null|-|null|-|null|-|210343|-|16 +Marr|-|Nelson|-|Dr.|-|Y|-|202134|-|16 +Marshall|-|Felipe|-|Sir|-|N|-|138890|-|15 +Martin|-|null|-|null|-|N|-|145206|-|16 +Martin|-|Linda|-|Mrs.|-|N|-|68011|-|16 +Martinez|-|Curtis|-|Mr.|-|Y|-|210116|-|15 +Martinez|-|Earl|-|Sir|-|N|-|108982|-|15 +Masterson|-|Barbara|-|Mrs.|-|N|-|231070|-|15 +Mata|-|Deborah|-|Miss|-|Y|-|4323|-|15 +Matthews|-|Ellen|-|Dr.|-|Y|-|232888|-|16 +Mayfield|-|Christal|-|Ms.|-|N|-|148917|-|15 +Mccann|-|Thomas|-|Dr.|-|Y|-|88874|-|16 +Mccoy|-|Debbie|-|Dr.|-|N|-|91552|-|15 +Mcdonald|-|Lazaro|-|Mr.|-|Y|-|196148|-|15 +Mcgill|-|Tony|-|Sir|-|N|-|110030|-|15 +Mcginnis|-|Geraldine|-|Ms.|-|N|-|123137|-|15 +Mckee|-|Edward|-|Dr.|-|N|-|229313|-|15 +Mckenzie|-|Alice|-|Dr.|-|Y|-|127018|-|16 +Mckenzie|-|Alice|-|Dr.|-|Y|-|192414|-|15 +Mckeon|-|Christina|-|Dr.|-|N|-|26190|-|15 +Mcknight|-|Linda|-|Miss|-|N|-|21070|-|15 +Mcnamara|-|Linda|-|Dr.|-|Y|-|7957|-|15 +Means|-|Michael|-|Mr.|-|Y|-|226164|-|16 +Medina|-|Joseph|-|Sir|-|Y|-|110246|-|15 +Meeks|-|Anthony|-|Dr.|-|Y|-|40881|-|16 +Meeks|-|Ted|-|Dr.|-|N|-|52611|-|16 +Meyer|-|null|-|null|-|N|-|83275|-|15 +Meyers|-|Zachary|-|Mr.|-|Y|-|59549|-|15 +Michael|-|Christopher|-|Sir|-|Y|-|10751|-|15 +Michaud|-|Mildred|-|Ms.|-|N|-|86472|-|16 +Mitchell|-|Jon|-|Dr.|-|N|-|146205|-|15 +Mohr|-|Alice|-|Dr.|-|N|-|71540|-|15 +Moody|-|Miranda|-|Ms.|-|Y|-|171671|-|15 +Moore|-|Carlos|-|Mr.|-|N|-|222173|-|15 +Moore|-|Nicole|-|Mrs.|-|N|-|150840|-|15 +Morales|-|Barbara|-|Dr.|-|Y|-|195587|-|16 +Morales|-|June|-|Miss|-|Y|-|193986|-|15 +Moran|-|Celia|-|Ms.|-|Y|-|200691|-|15 +Morris|-|Joanne|-|Ms.|-|N|-|138172|-|15 +Muir|-|Susan|-|Dr.|-|N|-|74823|-|15 +Musser|-|Victoria|-|Ms.|-|Y|-|110948|-|15 +Myers|-|Heather|-|Mrs.|-|Y|-|208047|-|15 +Myers|-|James|-|Mr.|-|N|-|74609|-|16 +Nadeau|-|Derek|-|Sir|-|N|-|104546|-|15 +Nagy|-|Enedina|-|Ms.|-|N|-|14683|-|15 +Nash|-|Luis|-|Mr.|-|Y|-|65873|-|15 +Neel|-|Audrey|-|Ms.|-|Y|-|193308|-|15 +Neff|-|Sheri|-|Mrs.|-|Y|-|52556|-|15 +Negron|-|Dean|-|Dr.|-|N|-|148058|-|15 +Nelson|-|Brenda|-|Mrs.|-|Y|-|162479|-|15 +Nelson|-|James|-|Mr.|-|N|-|20934|-|16 +Nelson|-|Katherine|-|Mrs.|-|N|-|110232|-|15 +New|-|Suzanne|-|Miss|-|N|-|5120|-|16 +Newsome|-|Scott|-|Sir|-|N|-|1113|-|16 +Nichols|-|Jessica|-|Ms.|-|Y|-|15369|-|15 +Nielsen|-|Veronica|-|Mrs.|-|N|-|23905|-|15 +Noble|-|Minerva|-|Dr.|-|N|-|55533|-|16 +Norman|-|Deborah|-|Dr.|-|N|-|86315|-|15 +Nowak|-|Martha|-|Mrs.|-|N|-|21859|-|15 +Oconnell|-|Claire|-|Dr.|-|N|-|88108|-|15 +Oconnor|-|Paul|-|Dr.|-|N|-|85955|-|15 +Ortiz|-|Barbara|-|Dr.|-|N|-|217482|-|15 +Osburn|-|Ronald|-|Mr.|-|N|-|221673|-|15 +Overstreet|-|Kathleen|-|Miss|-|Y|-|41977|-|15 +Parker|-|Jeff|-|Sir|-|N|-|213566|-|16 +Parker|-|Michelle|-|Dr.|-|N|-|101256|-|15 +Paulk|-|Simon|-|Dr.|-|Y|-|189595|-|15 +Paz|-|Lisa|-|Mrs.|-|Y|-|57939|-|15 +Pemberton|-|Jennifer|-|Mrs.|-|Y|-|49875|-|16 +Pena|-|James|-|Sir|-|Y|-|39488|-|16 +Perry|-|Robert|-|Mr.|-|Y|-|153147|-|16 +Phillips|-|David|-|Dr.|-|N|-|148883|-|15 +Phillips|-|Stanley|-|Sir|-|N|-|31989|-|15 +Porter|-|Alisa|-|Dr.|-|N|-|99782|-|16 +Posey|-|Rosemary|-|Mrs.|-|N|-|100871|-|15 +Price|-|null|-|Sir|-|N|-|159904|-|15 +Price|-|Anna|-|Miss|-|N|-|208497|-|15 +Quarles|-|Todd|-|Dr.|-|N|-|95359|-|16 +Quintero|-|Jose|-|Mr.|-|Y|-|145225|-|15 +Ramey|-|Delores|-|Mrs.|-|N|-|196062|-|15 +Raymond|-|Alfreda|-|Mrs.|-|Y|-|74381|-|16 +Reed|-|null|-|Miss|-|null|-|226073|-|15 +Reed|-|Sherry|-|Dr.|-|Y|-|48521|-|15 +Reed|-|William|-|Dr.|-|N|-|145002|-|15 +Reynolds|-|Amelia|-|Ms.|-|Y|-|68440|-|15 +Richard|-|Michael|-|Mr.|-|N|-|24381|-|15 +Richardson|-|Quincy|-|Dr.|-|Y|-|160433|-|15 +Roark|-|Fairy|-|null|-|null|-|86803|-|16 +Roberson|-|Jeremiah|-|Mr.|-|Y|-|65600|-|15 +Rodriguez|-|James|-|Dr.|-|Y|-|73600|-|15 +Rodriguez|-|Myrtis|-|Dr.|-|N|-|82132|-|15 +Rogers|-|Evelyn|-|Mrs.|-|N|-|219584|-|15 +Rogers|-|Janice|-|Miss|-|Y|-|216154|-|15 +Rosenberg|-|Elliott|-|Dr.|-|Y|-|109306|-|15 +Ross|-|James|-|Mr.|-|Y|-|230200|-|15 +Russell|-|Siobhan|-|Ms.|-|N|-|386|-|15 +Russo|-|Cheryl|-|Miss|-|N|-|81123|-|15 +Saenz|-|Bert|-|Mr.|-|Y|-|157622|-|16 +Sanchez|-|Bruce|-|Sir|-|Y|-|124479|-|15 +Schmidt|-|George|-|Dr.|-|N|-|189318|-|15 +Schmitz|-|Kaitlyn|-|Miss|-|N|-|105162|-|15 +Schroeder|-|Martha|-|Ms.|-|N|-|122147|-|15 +Schultz|-|Cassie|-|Ms.|-|N|-|46284|-|16 +Selby|-|Janice|-|Mrs.|-|Y|-|105678|-|16 +Sena|-|Kevin|-|Mr.|-|Y|-|210345|-|15 +Sexton|-|Jerry|-|Sir|-|N|-|91446|-|15 +Shah|-|Allison|-|Ms.|-|N|-|135623|-|16 +Sharpe|-|Robert|-|Mr.|-|N|-|118801|-|15 +Sheridan|-|Ben|-|Sir|-|N|-|184902|-|16 +Short|-|Thomas|-|Sir|-|N|-|33217|-|15 +Sierra|-|Christopher|-|Sir|-|Y|-|203083|-|15 +Sierra|-|David|-|Sir|-|Y|-|61810|-|15 +Simmons|-|Brice|-|Dr.|-|N|-|210991|-|15 +Simmons|-|Timothy|-|Mr.|-|Y|-|218092|-|16 +Simpson|-|Michael|-|Sir|-|Y|-|186613|-|16 +Simpson|-|Shalanda|-|Dr.|-|Y|-|181123|-|15 +Singleton|-|Andrew|-|Ms.|-|N|-|45464|-|15 +Smith|-|null|-|Mr.|-|Y|-|5126|-|16 +Smith|-|Carolyn|-|Miss|-|N|-|108082|-|15 +Smith|-|Edward|-|Sir|-|Y|-|81178|-|16 +Smith|-|Eugene|-|Sir|-|Y|-|83267|-|15 +Smith|-|Hung|-|Sir|-|N|-|44710|-|15 +Smith|-|Joyce|-|Dr.|-|Y|-|62866|-|16 +Smith|-|Kathe|-|Mrs.|-|null|-|151522|-|15 +Smith|-|Kimberly|-|Mrs.|-|Y|-|174638|-|15 +Snyder|-|Sandra|-|Dr.|-|N|-|183443|-|16 +Sosa|-|Leah|-|Ms.|-|Y|-|77106|-|16 +Sparks|-|Erick|-|Dr.|-|N|-|220337|-|15 +Spear|-|Christina|-|Mrs.|-|Y|-|201577|-|16 +Spencer|-|Sandra|-|Ms.|-|Y|-|188113|-|15 +Stevens|-|Donna|-|Mrs.|-|Y|-|118806|-|15 +Stevens|-|Megan|-|Ms.|-|Y|-|118593|-|15 +Stiltner|-|Josette|-|Miss|-|Y|-|206818|-|16 +Stitt|-|Derek|-|Mr.|-|Y|-|226642|-|16 +Stoker|-|James|-|Mr.|-|Y|-|157193|-|15 +Stone|-|Amber|-|Ms.|-|N|-|9217|-|15 +Story|-|Richard|-|Dr.|-|Y|-|2679|-|15 +Summers|-|Guy|-|Mr.|-|N|-|25289|-|15 +Taylor|-|Eric|-|Dr.|-|Y|-|233679|-|16 +Thomas|-|Ila|-|Mrs.|-|N|-|24039|-|16 +Thomas|-|Patrick|-|Mr.|-|Y|-|106865|-|15 +Thomas|-|Robert|-|Mr.|-|Y|-|161849|-|15 +Thompson|-|Peter|-|Dr.|-|Y|-|34341|-|15 +Tillman|-|James|-|Dr.|-|N|-|211402|-|15 +Todd|-|Linda|-|Ms.|-|Y|-|235816|-|15 +Trahan|-|null|-|Dr.|-|null|-|134137|-|15 +Turner|-|Candice|-|Miss|-|N|-|40079|-|16 +Turner|-|Caroline|-|Ms.|-|Y|-|88530|-|15 +Tuttle|-|Irma|-|Mrs.|-|Y|-|50413|-|16 +Vail|-|Joseph|-|Mr.|-|N|-|221064|-|15 +Vance|-|Richard|-|Mr.|-|N|-|217256|-|15 +Varner|-|Elsie|-|Ms.|-|N|-|199602|-|16 +Vasquez|-|Mike|-|Sir|-|N|-|8445|-|15 +Vazquez|-|Bill|-|Dr.|-|Y|-|62049|-|15 +Wagner|-|Barbara|-|Ms.|-|Y|-|233595|-|15 +Walker|-|Gloria|-|Miss|-|N|-|2017|-|15 +Wallis|-|Serena|-|Dr.|-|N|-|204116|-|16 +Ward|-|Anna|-|Miss|-|N|-|52941|-|16 +Washington|-|Jose|-|Dr.|-|N|-|99248|-|15 +Watkins|-|Rosa|-|Miss|-|Y|-|152190|-|16 +Weller|-|Lilian|-|Ms.|-|N|-|14085|-|15 +Wells|-|Louise|-|null|-|N|-|198380|-|16 +Wheatley|-|Amy|-|Ms.|-|Y|-|194766|-|15 +Whitcomb|-|Felicia|-|Miss|-|Y|-|219840|-|15 +White|-|Maurice|-|Mr.|-|N|-|10107|-|15 +White|-|Thomas|-|Sir|-|Y|-|214617|-|15 +Whitney|-|Alberto|-|Sir|-|Y|-|177711|-|16 +Williams|-|null|-|null|-|null|-|14156|-|16 +Williams|-|Ernestine|-|Dr.|-|Y|-|161001|-|16 +Williams|-|James|-|Sir|-|Y|-|99720|-|15 +Williams|-|Robert|-|Mr.|-|Y|-|41233|-|15 +Williamson|-|Ruth|-|Mrs.|-|Y|-|86369|-|15 +Wills|-|John|-|Sir|-|Y|-|14245|-|15 +Wilson|-|Edward|-|Dr.|-|Y|-|45609|-|15 +Wilson|-|Evelyn|-|Miss|-|N|-|89587|-|15 +Wilson|-|Joel|-|Sir|-|Y|-|91826|-|16 +Wilson|-|John|-|Sir|-|Y|-|26543|-|15 +Winkler|-|Jose|-|Dr.|-|Y|-|78400|-|15 +Winter|-|Cora|-|Mrs.|-|N|-|8978|-|16 +Wong|-|null|-|null|-|null|-|58143|-|15 +Wood|-|Marcia|-|Ms.|-|Y|-|219276|-|16 +Wood|-|Michelle|-|Mrs.|-|N|-|39560|-|15 +Wright|-|Kenneth|-|Dr.|-|N|-|82948|-|15 +Wright|-|Richie|-|Sir|-|Y|-|106818|-|15 +Wright|-|Tracy|-|Sir|-|Y|-|156757|-|16 +Young|-|George|-|Dr.|-|Y|-|7750|-|16 +Young|-|William|-|Mr.|-|Y|-|51127|-|15 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q35.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q35.out new file mode 100644 index 0000000000000..6de46e79402f2 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q35.out @@ -0,0 +1,100 @@ +WY|-|F|-|D|-|0|-|1|-|0.0|-|0|-|0|-|4|-|1|-|4.0|-|4|-|4|-|2|-|1|-|2.0|-|2|-|2 +WY|-|F|-|D|-|2|-|1|-|2.0|-|2|-|2|-|2|-|1|-|2.0|-|2|-|2|-|5|-|1|-|5.0|-|5|-|5 +WY|-|F|-|D|-|6|-|1|-|6.0|-|6|-|6|-|2|-|1|-|2.0|-|2|-|2|-|1|-|1|-|1.0|-|1|-|1 +WY|-|F|-|D|-|6|-|1|-|6.0|-|6|-|6|-|3|-|1|-|3.0|-|3|-|3|-|5|-|1|-|5.0|-|5|-|5 +WY|-|F|-|D|-|6|-|1|-|6.0|-|6|-|6|-|3|-|1|-|3.0|-|3|-|3|-|6|-|1|-|6.0|-|6|-|6 +WY|-|F|-|M|-|1|-|1|-|1.0|-|1|-|1|-|1|-|1|-|1.0|-|1|-|1|-|2|-|1|-|2.0|-|2|-|2 +WY|-|F|-|M|-|3|-|1|-|3.0|-|3|-|3|-|1|-|1|-|1.0|-|1|-|1|-|1|-|1|-|1.0|-|1|-|1 +WY|-|F|-|M|-|4|-|1|-|4.0|-|4|-|4|-|6|-|1|-|6.0|-|6|-|6|-|4|-|1|-|4.0|-|4|-|4 +WY|-|F|-|S|-|0|-|1|-|0.0|-|0|-|0|-|6|-|1|-|6.0|-|6|-|6|-|1|-|1|-|1.0|-|1|-|1 +WY|-|F|-|S|-|1|-|1|-|1.0|-|1|-|1|-|3|-|1|-|3.0|-|3|-|3|-|3|-|1|-|3.0|-|3|-|3 +WY|-|F|-|S|-|2|-|1|-|2.0|-|2|-|2|-|6|-|1|-|6.0|-|6|-|6|-|4|-|1|-|4.0|-|4|-|4 +WY|-|F|-|S|-|3|-|1|-|3.0|-|3|-|3|-|3|-|1|-|3.0|-|3|-|3|-|4|-|1|-|4.0|-|4|-|4 +WY|-|F|-|S|-|5|-|1|-|5.0|-|5|-|5|-|1|-|1|-|1.0|-|1|-|1|-|1|-|1|-|1.0|-|1|-|1 +WY|-|F|-|U|-|1|-|1|-|1.0|-|1|-|1|-|1|-|1|-|1.0|-|1|-|1|-|1|-|1|-|1.0|-|1|-|1 +WY|-|F|-|U|-|5|-|1|-|5.0|-|5|-|5|-|1|-|1|-|1.0|-|1|-|1|-|2|-|1|-|2.0|-|2|-|2 +WY|-|F|-|W|-|2|-|1|-|2.0|-|2|-|2|-|6|-|1|-|6.0|-|6|-|6|-|2|-|1|-|2.0|-|2|-|2 +WY|-|F|-|W|-|3|-|1|-|3.0|-|3|-|3|-|0|-|1|-|0.0|-|0|-|0|-|5|-|1|-|5.0|-|5|-|5 +WY|-|M|-|D|-|0|-|1|-|0.0|-|0|-|0|-|1|-|1|-|1.0|-|1|-|1|-|0|-|1|-|0.0|-|0|-|0 +WY|-|M|-|D|-|0|-|1|-|0.0|-|0|-|0|-|1|-|1|-|1.0|-|1|-|1|-|5|-|1|-|5.0|-|5|-|5 +WY|-|M|-|D|-|2|-|1|-|2.0|-|2|-|2|-|0|-|1|-|0.0|-|0|-|0|-|4|-|1|-|4.0|-|4|-|4 +WY|-|M|-|D|-|2|-|1|-|2.0|-|2|-|2|-|2|-|1|-|2.0|-|2|-|2|-|0|-|1|-|0.0|-|0|-|0 +WY|-|M|-|D|-|4|-|1|-|4.0|-|4|-|4|-|5|-|1|-|5.0|-|5|-|5|-|1|-|1|-|1.0|-|1|-|1 +WY|-|M|-|D|-|5|-|1|-|5.0|-|5|-|5|-|5|-|1|-|5.0|-|5|-|5|-|0|-|1|-|0.0|-|0|-|0 +WY|-|M|-|D|-|6|-|1|-|6.0|-|6|-|6|-|5|-|1|-|5.0|-|5|-|5|-|1|-|1|-|1.0|-|1|-|1 +WY|-|M|-|M|-|4|-|1|-|4.0|-|4|-|4|-|4|-|1|-|4.0|-|4|-|4|-|6|-|1|-|6.0|-|6|-|6 +WY|-|M|-|S|-|2|-|1|-|2.0|-|2|-|2|-|2|-|1|-|2.0|-|2|-|2|-|1|-|1|-|1.0|-|1|-|1 +WY|-|M|-|S|-|3|-|1|-|3.0|-|3|-|3|-|4|-|1|-|4.0|-|4|-|4|-|2|-|1|-|2.0|-|2|-|2 +WY|-|M|-|S|-|4|-|1|-|4.0|-|4|-|4|-|0|-|1|-|0.0|-|0|-|0|-|5|-|1|-|5.0|-|5|-|5 +WY|-|M|-|U|-|4|-|1|-|4.0|-|4|-|4|-|1|-|1|-|1.0|-|1|-|1|-|3|-|1|-|3.0|-|3|-|3 +WY|-|M|-|U|-|4|-|1|-|4.0|-|4|-|4|-|4|-|1|-|4.0|-|4|-|4|-|6|-|1|-|6.0|-|6|-|6 +WY|-|M|-|U|-|5|-|1|-|5.0|-|5|-|5|-|6|-|1|-|6.0|-|6|-|6|-|6|-|1|-|6.0|-|6|-|6 +WY|-|M|-|U|-|6|-|1|-|6.0|-|6|-|6|-|4|-|1|-|4.0|-|4|-|4|-|6|-|1|-|6.0|-|6|-|6 +WY|-|M|-|W|-|1|-|1|-|1.0|-|1|-|1|-|0|-|1|-|0.0|-|0|-|0|-|0|-|1|-|0.0|-|0|-|0 +WY|-|M|-|W|-|1|-|1|-|1.0|-|1|-|1|-|1|-|1|-|1.0|-|1|-|1|-|0|-|1|-|0.0|-|0|-|0 +WY|-|M|-|W|-|1|-|1|-|1.0|-|1|-|1|-|2|-|1|-|2.0|-|2|-|2|-|2|-|1|-|2.0|-|2|-|2 +WY|-|M|-|W|-|3|-|1|-|3.0|-|3|-|3|-|6|-|1|-|6.0|-|6|-|6|-|5|-|1|-|5.0|-|5|-|5 +WV|-|F|-|D|-|0|-|1|-|0.0|-|0|-|0|-|0|-|1|-|0.0|-|0|-|0|-|6|-|1|-|6.0|-|6|-|6 +WV|-|F|-|D|-|0|-|1|-|0.0|-|0|-|0|-|5|-|1|-|5.0|-|5|-|5|-|1|-|1|-|1.0|-|1|-|1 +WV|-|F|-|D|-|0|-|1|-|0.0|-|0|-|0|-|5|-|1|-|5.0|-|5|-|5|-|3|-|1|-|3.0|-|3|-|3 +WV|-|F|-|D|-|0|-|1|-|0.0|-|0|-|0|-|6|-|1|-|6.0|-|6|-|6|-|6|-|1|-|6.0|-|6|-|6 +WV|-|F|-|D|-|2|-|1|-|2.0|-|2|-|2|-|3|-|1|-|3.0|-|3|-|3|-|2|-|1|-|2.0|-|2|-|2 +WV|-|F|-|D|-|2|-|1|-|2.0|-|2|-|2|-|4|-|1|-|4.0|-|4|-|4|-|3|-|1|-|3.0|-|3|-|3 +WV|-|F|-|D|-|3|-|1|-|3.0|-|3|-|3|-|1|-|1|-|1.0|-|1|-|1|-|6|-|1|-|6.0|-|6|-|6 +WV|-|F|-|D|-|5|-|1|-|5.0|-|5|-|5|-|0|-|1|-|0.0|-|0|-|0|-|1|-|1|-|1.0|-|1|-|1 +WV|-|F|-|D|-|6|-|1|-|6.0|-|6|-|6|-|1|-|1|-|1.0|-|1|-|1|-|6|-|1|-|6.0|-|6|-|6 +WV|-|F|-|M|-|0|-|1|-|0.0|-|0|-|0|-|0|-|1|-|0.0|-|0|-|0|-|1|-|1|-|1.0|-|1|-|1 +WV|-|F|-|M|-|0|-|1|-|0.0|-|0|-|0|-|4|-|1|-|4.0|-|4|-|4|-|3|-|1|-|3.0|-|3|-|3 +WV|-|F|-|M|-|1|-|1|-|1.0|-|1|-|1|-|1|-|1|-|1.0|-|1|-|1|-|0|-|1|-|0.0|-|0|-|0 +WV|-|F|-|M|-|1|-|1|-|1.0|-|1|-|1|-|2|-|1|-|2.0|-|2|-|2|-|1|-|1|-|1.0|-|1|-|1 +WV|-|F|-|M|-|2|-|1|-|2.0|-|2|-|2|-|3|-|1|-|3.0|-|3|-|3|-|2|-|1|-|2.0|-|2|-|2 +WV|-|F|-|M|-|3|-|1|-|3.0|-|3|-|3|-|0|-|1|-|0.0|-|0|-|0|-|1|-|1|-|1.0|-|1|-|1 +WV|-|F|-|M|-|5|-|1|-|5.0|-|5|-|5|-|1|-|1|-|1.0|-|1|-|1|-|1|-|1|-|1.0|-|1|-|1 +WV|-|F|-|M|-|5|-|1|-|5.0|-|5|-|5|-|3|-|1|-|3.0|-|3|-|3|-|4|-|1|-|4.0|-|4|-|4 +WV|-|F|-|S|-|1|-|1|-|1.0|-|1|-|1|-|2|-|1|-|2.0|-|2|-|2|-|3|-|1|-|3.0|-|3|-|3 +WV|-|F|-|S|-|1|-|1|-|1.0|-|1|-|1|-|3|-|1|-|3.0|-|3|-|3|-|4|-|1|-|4.0|-|4|-|4 +WV|-|F|-|S|-|3|-|1|-|3.0|-|3|-|3|-|0|-|1|-|0.0|-|0|-|0|-|6|-|1|-|6.0|-|6|-|6 +WV|-|F|-|S|-|3|-|1|-|3.0|-|3|-|3|-|2|-|1|-|2.0|-|2|-|2|-|6|-|1|-|6.0|-|6|-|6 +WV|-|F|-|S|-|4|-|1|-|4.0|-|4|-|4|-|0|-|1|-|0.0|-|0|-|0|-|2|-|1|-|2.0|-|2|-|2 +WV|-|F|-|S|-|4|-|1|-|4.0|-|4|-|4|-|2|-|1|-|2.0|-|2|-|2|-|1|-|1|-|1.0|-|1|-|1 +WV|-|F|-|S|-|5|-|1|-|5.0|-|5|-|5|-|1|-|1|-|1.0|-|1|-|1|-|2|-|1|-|2.0|-|2|-|2 +WV|-|F|-|S|-|5|-|1|-|5.0|-|5|-|5|-|5|-|1|-|5.0|-|5|-|5|-|5|-|1|-|5.0|-|5|-|5 +WV|-|F|-|S|-|6|-|1|-|6.0|-|6|-|6|-|0|-|1|-|0.0|-|0|-|0|-|1|-|1|-|1.0|-|1|-|1 +WV|-|F|-|S|-|6|-|1|-|6.0|-|6|-|6|-|3|-|1|-|3.0|-|3|-|3|-|4|-|1|-|4.0|-|4|-|4 +WV|-|F|-|S|-|6|-|1|-|6.0|-|6|-|6|-|5|-|1|-|5.0|-|5|-|5|-|2|-|1|-|2.0|-|2|-|2 +WV|-|F|-|S|-|6|-|1|-|6.0|-|6|-|6|-|6|-|1|-|6.0|-|6|-|6|-|6|-|1|-|6.0|-|6|-|6 +WV|-|F|-|U|-|1|-|1|-|1.0|-|1|-|1|-|1|-|1|-|1.0|-|1|-|1|-|0|-|1|-|0.0|-|0|-|0 +WV|-|F|-|U|-|1|-|1|-|1.0|-|1|-|1|-|5|-|1|-|5.0|-|5|-|5|-|0|-|1|-|0.0|-|0|-|0 +WV|-|F|-|U|-|2|-|1|-|2.0|-|2|-|2|-|4|-|1|-|4.0|-|4|-|4|-|3|-|1|-|3.0|-|3|-|3 +WV|-|F|-|U|-|3|-|1|-|3.0|-|3|-|3|-|4|-|1|-|4.0|-|4|-|4|-|0|-|1|-|0.0|-|0|-|0 +WV|-|F|-|U|-|3|-|1|-|3.0|-|3|-|3|-|6|-|1|-|6.0|-|6|-|6|-|4|-|1|-|4.0|-|4|-|4 +WV|-|F|-|U|-|4|-|1|-|4.0|-|4|-|4|-|0|-|1|-|0.0|-|0|-|0|-|1|-|1|-|1.0|-|1|-|1 +WV|-|F|-|U|-|4|-|1|-|4.0|-|4|-|4|-|1|-|1|-|1.0|-|1|-|1|-|4|-|1|-|4.0|-|4|-|4 +WV|-|F|-|U|-|4|-|1|-|4.0|-|4|-|4|-|2|-|1|-|2.0|-|2|-|2|-|3|-|1|-|3.0|-|3|-|3 +WV|-|F|-|U|-|5|-|1|-|5.0|-|5|-|5|-|2|-|1|-|2.0|-|2|-|2|-|0|-|1|-|0.0|-|0|-|0 +WV|-|F|-|U|-|5|-|1|-|5.0|-|5|-|5|-|4|-|1|-|4.0|-|4|-|4|-|1|-|1|-|1.0|-|1|-|1 +WV|-|F|-|U|-|5|-|1|-|5.0|-|5|-|5|-|6|-|1|-|6.0|-|6|-|6|-|3|-|1|-|3.0|-|3|-|3 +WV|-|F|-|U|-|6|-|1|-|6.0|-|6|-|6|-|0|-|1|-|0.0|-|0|-|0|-|1|-|1|-|1.0|-|1|-|1 +WV|-|F|-|W|-|1|-|1|-|1.0|-|1|-|1|-|0|-|1|-|0.0|-|0|-|0|-|1|-|1|-|1.0|-|1|-|1 +WV|-|F|-|W|-|1|-|1|-|1.0|-|1|-|1|-|1|-|1|-|1.0|-|1|-|1|-|0|-|1|-|0.0|-|0|-|0 +WV|-|F|-|W|-|1|-|1|-|1.0|-|1|-|1|-|1|-|1|-|1.0|-|1|-|1|-|3|-|1|-|3.0|-|3|-|3 +WV|-|F|-|W|-|2|-|1|-|2.0|-|2|-|2|-|0|-|1|-|0.0|-|0|-|0|-|1|-|1|-|1.0|-|1|-|1 +WV|-|F|-|W|-|2|-|1|-|2.0|-|2|-|2|-|2|-|1|-|2.0|-|2|-|2|-|1|-|1|-|1.0|-|1|-|1 +WV|-|F|-|W|-|2|-|1|-|2.0|-|2|-|2|-|6|-|1|-|6.0|-|6|-|6|-|1|-|1|-|1.0|-|1|-|1 +WV|-|F|-|W|-|3|-|1|-|3.0|-|3|-|3|-|0|-|1|-|0.0|-|0|-|0|-|4|-|1|-|4.0|-|4|-|4 +WV|-|F|-|W|-|4|-|1|-|4.0|-|4|-|4|-|4|-|1|-|4.0|-|4|-|4|-|2|-|1|-|2.0|-|2|-|2 +WV|-|F|-|W|-|4|-|1|-|4.0|-|4|-|4|-|6|-|1|-|6.0|-|6|-|6|-|6|-|1|-|6.0|-|6|-|6 +WV|-|M|-|D|-|0|-|1|-|0.0|-|0|-|0|-|0|-|1|-|0.0|-|0|-|0|-|4|-|1|-|4.0|-|4|-|4 +WV|-|M|-|D|-|1|-|1|-|1.0|-|1|-|1|-|0|-|1|-|0.0|-|0|-|0|-|0|-|1|-|0.0|-|0|-|0 +WV|-|M|-|D|-|1|-|1|-|1.0|-|1|-|1|-|1|-|1|-|1.0|-|1|-|1|-|0|-|1|-|0.0|-|0|-|0 +WV|-|M|-|D|-|1|-|1|-|1.0|-|1|-|1|-|1|-|1|-|1.0|-|1|-|1|-|3|-|1|-|3.0|-|3|-|3 +WV|-|M|-|D|-|1|-|1|-|1.0|-|1|-|1|-|3|-|1|-|3.0|-|3|-|3|-|5|-|1|-|5.0|-|5|-|5 +WV|-|M|-|D|-|3|-|1|-|3.0|-|3|-|3|-|2|-|1|-|2.0|-|2|-|2|-|2|-|1|-|2.0|-|2|-|2 +WV|-|M|-|D|-|3|-|1|-|3.0|-|3|-|3|-|5|-|1|-|5.0|-|5|-|5|-|3|-|1|-|3.0|-|3|-|3 +WV|-|M|-|D|-|4|-|1|-|4.0|-|4|-|4|-|3|-|1|-|3.0|-|3|-|3|-|5|-|1|-|5.0|-|5|-|5 +WV|-|M|-|D|-|4|-|1|-|4.0|-|4|-|4|-|6|-|1|-|6.0|-|6|-|6|-|1|-|1|-|1.0|-|1|-|1 +WV|-|M|-|D|-|5|-|1|-|5.0|-|5|-|5|-|1|-|1|-|1.0|-|1|-|1|-|0|-|1|-|0.0|-|0|-|0 +WV|-|M|-|M|-|0|-|1|-|0.0|-|0|-|0|-|2|-|1|-|2.0|-|2|-|2|-|0|-|1|-|0.0|-|0|-|0 +WV|-|M|-|M|-|0|-|1|-|0.0|-|0|-|0|-|5|-|1|-|5.0|-|5|-|5|-|6|-|1|-|6.0|-|6|-|6 +WV|-|M|-|M|-|1|-|1|-|1.0|-|1|-|1|-|6|-|1|-|6.0|-|6|-|6|-|6|-|1|-|6.0|-|6|-|6 +WV|-|M|-|M|-|4|-|1|-|4.0|-|4|-|4|-|6|-|1|-|6.0|-|6|-|6|-|4|-|1|-|4.0|-|4|-|4 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q36.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q36.out new file mode 100644 index 0000000000000..cc613ec6ee8ce --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q36.out @@ -0,0 +1,100 @@ +-0.43184163154008683057|-|null|-|null|-|2|-|1 +-0.47103352856176125718|-|null|-|null|-|1|-|1 +-0.44117750023673110439|-|Shoes|-|null|-|1|-|2 +-0.43759213430308272090|-|Children|-|null|-|1|-|3 +-0.43483736571454339017|-|Jewelry|-|null|-|1|-|4 +-0.43319582764816486735|-|Music|-|null|-|1|-|5 +-0.43142820707093347958|-|Sports|-|null|-|1|-|6 +-0.42968322499805223615|-|Women|-|null|-|1|-|7 +-0.42951294270134788730|-|Home|-|null|-|1|-|8 +-0.42898150567569718111|-|Men|-|null|-|1|-|9 +-0.42615601101411678493|-|Books|-|null|-|1|-|10 +-0.42551694257128021350|-|Electronics|-|null|-|1|-|11 +-2.00552121263443136591|-|null|-|reference|-|0|-|1 +-1.71343380243750770139|-|null|-|semi-precious|-|0|-|2 +-0.67570978021869452912|-|null|-|shirts|-|0|-|3 +-0.67216427904543708864|-|null|-|baseball|-|0|-|4 +-0.65473358978044036224|-|null|-|guns|-|0|-|5 +-0.61193725206621292856|-|null|-|accessories|-|0|-|6 +-0.60969449477475865644|-|null|-|dresses|-|0|-|7 +-0.59814684878394580606|-|null|-|lighting|-|0|-|8 +-0.49570128410079029330|-|null|-|mens|-|0|-|9 +-0.43422190152499730095|-|null|-|athletic|-|0|-|10 +-0.42294450932642992711|-|null|-|null|-|0|-|11 +-0.42054688734969251937|-|null|-|country|-|0|-|12 +-0.34306789101309649255|-|null|-|swimwear|-|0|-|13 +-0.32757743506571447112|-|null|-|infants|-|0|-|14 +-0.44863328575386064880|-|Books|-|reference|-|0|-|1 +-0.44596572765607985930|-|Books|-|home repair|-|0|-|2 +-0.44440646828469768552|-|Books|-|travel|-|0|-|3 +-0.43906724951240909297|-|Books|-|entertainments|-|0|-|4 +-0.43603325805666913706|-|Books|-|sports|-|0|-|5 +-0.43478212640323128952|-|Books|-|business|-|0|-|6 +-0.42478060569965535854|-|Books|-|science|-|0|-|7 +-0.42343643650510035207|-|Books|-|self-help|-|0|-|8 +-0.42322126929255307582|-|Books|-|arts|-|0|-|9 +-0.42236331844125473501|-|Books|-|parenting|-|0|-|10 +-0.42217172895797957991|-|Books|-|fiction|-|0|-|11 +-0.41812153235077704137|-|Books|-|computers|-|0|-|12 +-0.41537815608639043837|-|Books|-|mystery|-|0|-|13 +-0.41230594383805118258|-|Books|-|history|-|0|-|14 +-0.41029298532510093584|-|Books|-|romance|-|0|-|15 +-0.40166340055048749179|-|Books|-|cooking|-|0|-|16 +-0.31153132327561818595|-|Books|-|null|-|0|-|17 +-0.56714367729379727708|-|Children|-|null|-|0|-|1 +-0.44210784593153975036|-|Children|-|infants|-|0|-|2 +-0.43861082538909507289|-|Children|-|newborn|-|0|-|3 +-0.43730156455093342556|-|Children|-|toddlers|-|0|-|4 +-0.43148695819315055965|-|Children|-|school-uniforms|-|0|-|5 +-0.45368939312771290249|-|Electronics|-|musical|-|0|-|1 +-0.44992680118292843011|-|Electronics|-|personal|-|0|-|2 +-0.44456471177209684893|-|Electronics|-|monitors|-|0|-|3 +-0.44232170570914248584|-|Electronics|-|wireless|-|0|-|4 +-0.44070555932608974968|-|Electronics|-|automotive|-|0|-|5 +-0.43762986575784110033|-|Electronics|-|cameras|-|0|-|6 +-0.42898727300818068489|-|Electronics|-|portable|-|0|-|7 +-0.42481628916857440003|-|Electronics|-|disk drives|-|0|-|8 +-0.42439758221039145934|-|Electronics|-|televisions|-|0|-|9 +-0.41998608635734802245|-|Electronics|-|camcorders|-|0|-|10 +-0.41913854722225189178|-|Electronics|-|dvd/vcr players|-|0|-|11 +-0.41585098566110834914|-|Electronics|-|scanners|-|0|-|12 +-0.41260312731991518674|-|Electronics|-|karoke|-|0|-|13 +-0.41075153682870252815|-|Electronics|-|memory|-|0|-|14 +-0.40642677031175330587|-|Electronics|-|stereo|-|0|-|15 +-0.38420169270572966892|-|Electronics|-|audio|-|0|-|16 +-0.63139836319447521532|-|Home|-|null|-|0|-|1 +-0.45385843217739587850|-|Home|-|tables|-|0|-|2 +-0.45295569846387636106|-|Home|-|decor|-|0|-|3 +-0.44478526851187643949|-|Home|-|furniture|-|0|-|4 +-0.44152551073203085449|-|Home|-|kids|-|0|-|5 +-0.44057956611313977894|-|Home|-|accent|-|0|-|6 +-0.43649289429066269927|-|Home|-|flatware|-|0|-|7 +-0.43636640315770895639|-|Home|-|paint|-|0|-|8 +-0.43430242362629827373|-|Home|-|mattresses|-|0|-|9 +-0.43022264513814703110|-|Home|-|curtains/drapes|-|0|-|10 +-0.42813089917742425846|-|Home|-|blinds/shades|-|0|-|11 +-0.42694302240555237873|-|Home|-|wallpaper|-|0|-|12 +-0.42457422043224309947|-|Home|-|rugs|-|0|-|13 +-0.41298534522563252177|-|Home|-|bedding|-|0|-|14 +-0.40811212420843872592|-|Home|-|bathroom|-|0|-|15 +-0.40600963812770583646|-|Home|-|glassware|-|0|-|16 +-0.40460109984102706168|-|Home|-|lighting|-|0|-|17 +-0.49670757919983931493|-|Jewelry|-|jewelry boxes|-|0|-|1 +-0.46682483340338596363|-|Jewelry|-|semi-precious|-|0|-|2 +-0.46622354753756979721|-|Jewelry|-|gold|-|0|-|3 +-0.46097445072273707161|-|Jewelry|-|mens watch|-|0|-|4 +-0.45682691510276431767|-|Jewelry|-|custom|-|0|-|5 +-0.44630012035747476099|-|Jewelry|-|earings|-|0|-|6 +-0.43089614508982814603|-|Jewelry|-|costume|-|0|-|7 +-0.42784247305720425740|-|Jewelry|-|consignment|-|0|-|8 +-0.42563864193321814621|-|Jewelry|-|loose stones|-|0|-|9 +-0.42165515432109646143|-|Jewelry|-|rings|-|0|-|10 +-0.41841135251354804658|-|Jewelry|-|diamonds|-|0|-|11 +-0.41714886098551226792|-|Jewelry|-|womens watch|-|0|-|12 +-0.41466263457869438854|-|Jewelry|-|estate|-|0|-|13 +-0.41433140043673982529|-|Jewelry|-|bracelets|-|0|-|14 +-0.40795635615185030360|-|Jewelry|-|pendants|-|0|-|15 +-0.40520808544420069430|-|Jewelry|-|birdal|-|0|-|16 +-0.44452621203344914268|-|Men|-|accessories|-|0|-|1 +-0.42808703734658288619|-|Men|-|sports-apparel|-|0|-|2 +-0.42479440095500913707|-|Men|-|pants|-|0|-|3 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q37.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q37.out new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q38.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q38.out new file mode 100644 index 0000000000000..3ad5abd03aea8 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q38.out @@ -0,0 +1 @@ +99 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q39a.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q39a.out new file mode 100644 index 0000000000000..1d4fbf72600dc --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q39a.out @@ -0,0 +1,123 @@ +1|-|730|-|4|-|354.5|-|1.2380725609465184|-|1|-|730|-|5|-|285.6666666666667|-|1.384932444566584 +1|-|1354|-|4|-|247.25|-|1.2488519409348215|-|1|-|1354|-|5|-|211.0|-|1.0643090864618219 +1|-|4166|-|4|-|112.75|-|1.4898703861026326|-|1|-|4166|-|5|-|367.25|-|1.0079844109525486 +1|-|5395|-|4|-|372.8|-|1.0215633343546233|-|1|-|5395|-|5|-|339.25|-|1.0907775413096428 +1|-|5767|-|4|-|262.4|-|1.1018683211373157|-|1|-|5767|-|5|-|382.3333333333333|-|1.109036492447344 +1|-|6379|-|4|-|315.2|-|1.0740358924104854|-|1|-|6379|-|5|-|400.3333333333333|-|1.063926562806694 +1|-|6439|-|4|-|321.0|-|1.1816322984882648|-|1|-|6439|-|5|-|210.0|-|1.3219840102497493 +1|-|6550|-|4|-|300.2|-|1.0726348064815485|-|1|-|6550|-|5|-|265.0|-|1.0869693252299 +1|-|7112|-|4|-|320.0|-|1.0866585585714892|-|1|-|7112|-|5|-|357.5|-|1.026870633984059 +1|-|7318|-|4|-|404.4|-|1.2047248328574673|-|1|-|7318|-|5|-|370.3333333333333|-|1.3433167169046119 +1|-|7964|-|4|-|78.33333333333333|-|1.3350245800149156|-|1|-|7964|-|5|-|329.25|-|1.0219294791362754 +1|-|8072|-|4|-|393.0|-|1.00244765163991|-|1|-|8072|-|5|-|393.5|-|1.0062794371818344 +1|-|8533|-|4|-|212.2|-|1.2884988594542972|-|1|-|8533|-|5|-|313.0|-|1.0709167956126537 +1|-|9692|-|4|-|290.6|-|1.2679028732527668|-|1|-|9692|-|5|-|420.0|-|1.009542527529376 +1|-|9802|-|4|-|344.6|-|1.1617171814640606|-|1|-|9802|-|5|-|394.25|-|1.1005191823074953 +1|-|10309|-|4|-|283.8|-|1.1154387822593925|-|1|-|10309|-|5|-|221.66666666666666|-|1.4670905120806688 +1|-|12022|-|4|-|345.4|-|1.1143988618304466|-|1|-|12022|-|5|-|378.75|-|1.0265328765371446 +1|-|12028|-|4|-|233.25|-|1.6679216953558442|-|1|-|12028|-|5|-|291.25|-|1.0601878864076697 +1|-|12133|-|4|-|400.0|-|1.0571482866655935|-|1|-|12133|-|5|-|434.5|-|1.02871206172949 +1|-|13360|-|4|-|343.2|-|1.107861199897941|-|1|-|13360|-|5|-|189.5|-|1.710514292313589 +1|-|16112|-|4|-|304.6|-|1.002444384351255|-|1|-|16112|-|5|-|399.75|-|1.018840616715856 +1|-|17011|-|4|-|159.0|-|1.4010436851025128|-|1|-|17011|-|5|-|236.5|-|1.4758486355291818 +1|-|17095|-|4|-|363.25|-|1.071684560931253|-|1|-|17095|-|5|-|304.25|-|1.1048680024194006 +2|-|1118|-|4|-|309.6|-|1.0882055702083147|-|2|-|1118|-|5|-|401.25|-|1.0068995907771678 +2|-|2272|-|4|-|315.25|-|1.1465012723653947|-|2|-|2272|-|5|-|295.25|-|1.504233322918836 +2|-|3019|-|4|-|315.8|-|1.0592026229230203|-|2|-|3019|-|5|-|192.5|-|1.4959385430509407 +2|-|3091|-|4|-|233.0|-|1.4853537197543978|-|2|-|3091|-|5|-|352.0|-|1.0526555361018866 +2|-|3674|-|4|-|171.6|-|1.3119565222064284|-|2|-|3674|-|5|-|387.25|-|1.0699193294542413 +2|-|4783|-|4|-|249.0|-|1.0635217585886223|-|2|-|4783|-|5|-|309.5|-|1.039934411255663 +2|-|5866|-|4|-|360.4|-|1.0390752216460712|-|2|-|5866|-|5|-|261.5|-|1.1053742180492476 +2|-|5947|-|4|-|202.0|-|1.0229632344523778|-|2|-|5947|-|5|-|385.3333333333333|-|1.0437248238325296 +2|-|5966|-|4|-|386.6|-|1.0653769742360941|-|2|-|5966|-|5|-|394.0|-|1.0423883926423723 +2|-|7264|-|4|-|342.5|-|1.2225839408214123|-|2|-|7264|-|5|-|281.25|-|1.0668696103236321 +2|-|8599|-|4|-|225.6|-|1.1693628710408095|-|2|-|8599|-|5|-|367.75|-|1.1327173864132776 +2|-|8641|-|4|-|346.8|-|1.1444894222039803|-|2|-|8641|-|5|-|77.75|-|1.5818846414629213 +2|-|10075|-|4|-|247.8|-|1.1329747189242967|-|2|-|10075|-|5|-|243.75|-|1.0023327601581955 +2|-|11204|-|4|-|186.8|-|1.2681514565972465|-|2|-|11204|-|5|-|315.5|-|1.0733093469610433 +2|-|11230|-|4|-|324.75|-|1.1075819812381653|-|2|-|11230|-|5|-|193.5|-|1.2625376940381312 +2|-|12811|-|4|-|451.0|-|1.0539803498189306|-|2|-|12811|-|5|-|230.25|-|1.108461534290912 +2|-|12914|-|4|-|359.4|-|1.0566138593622898|-|2|-|12914|-|5|-|385.5|-|1.0438044876694534 +2|-|13525|-|4|-|357.0|-|1.0225336633980373|-|2|-|13525|-|5|-|342.0|-|1.1325594776615695 +2|-|13843|-|4|-|293.6|-|1.1378790106807612|-|2|-|13843|-|5|-|425.75|-|1.1059353518076338 +2|-|15608|-|4|-|382.8|-|1.0565792239344465|-|2|-|15608|-|5|-|113.25|-|1.3273919934448561 +2|-|15706|-|4|-|329.8|-|1.1175472717682653|-|2|-|15706|-|5|-|426.0|-|1.0177457381986443 +2|-|15776|-|4|-|278.8|-|1.0719746247926438|-|2|-|15776|-|5|-|454.0|-|1.0132717216292895 +2|-|15854|-|4|-|361.0|-|1.010288841343881|-|2|-|15854|-|5|-|348.0|-|1.2594536161696723 +2|-|16012|-|4|-|364.0|-|1.0293714455911578|-|2|-|16012|-|5|-|464.6666666666667|-|1.032622630063299 +2|-|16438|-|4|-|359.4|-|1.0580471519757142|-|2|-|16438|-|5|-|267.0|-|1.088979891484102 +2|-|17606|-|4|-|191.2|-|1.0214115120948892|-|2|-|17606|-|5|-|305.75|-|1.3803840577383362 +3|-|560|-|4|-|305.0|-|1.1346852100227212|-|3|-|560|-|5|-|307.5|-|1.0908408139827899 +3|-|1582|-|4|-|255.4|-|1.0327549555656692|-|3|-|1582|-|5|-|326.0|-|1.1086598560661007 +3|-|1664|-|4|-|161.8|-|1.408729580547717|-|3|-|1664|-|5|-|323.3333333333333|-|1.0076701275623423 +3|-|2740|-|4|-|330.25|-|1.1255138006074492|-|3|-|2740|-|5|-|275.5|-|1.4169553207873773 +3|-|3559|-|4|-|226.25|-|1.120186239659205|-|3|-|3559|-|5|-|304.0|-|1.0408953746552836 +3|-|5644|-|4|-|299.0|-|1.2186524884539391|-|3|-|5644|-|5|-|409.0|-|1.0158534353277446 +3|-|5863|-|4|-|328.8|-|1.2116106590960665|-|3|-|5863|-|5|-|400.0|-|1.0040978537971288 +3|-|7546|-|4|-|319.4|-|1.1696422215266047|-|3|-|7546|-|5|-|446.6666666666667|-|1.0090592655886275 +3|-|7630|-|4|-|278.0|-|1.1127993043702185|-|3|-|7630|-|5|-|327.25|-|1.0315932075979775 +3|-|7735|-|4|-|265.4|-|1.3199655416710214|-|3|-|7735|-|5|-|369.25|-|1.0376662345863155 +3|-|7846|-|4|-|317.6|-|1.1496251223810001|-|3|-|7846|-|5|-|270.6666666666667|-|1.1606004373743641 +3|-|8204|-|4|-|304.6|-|1.3352478201557396|-|3|-|8204|-|5|-|255.75|-|1.7455039899519522 +3|-|10159|-|4|-|307.8|-|1.2055369725329348|-|3|-|10159|-|5|-|380.75|-|1.0236168498823144 +3|-|10576|-|4|-|368.8|-|1.0154553504455526|-|3|-|10576|-|5|-|217.75|-|1.4310555191437535 +3|-|10600|-|4|-|169.4|-|1.047949673010994|-|3|-|10600|-|5|-|372.75|-|1.1112197837981088 +3|-|11764|-|4|-|393.75|-|1.006339125014181|-|3|-|11764|-|5|-|269.3333333333333|-|1.0715113244751922 +3|-|11938|-|4|-|383.75|-|1.1322575525985386|-|3|-|11938|-|5|-|408.0|-|1.0192130174466563 +3|-|12040|-|4|-|271.2|-|1.061807338829735|-|3|-|12040|-|5|-|376.25|-|1.028836660026579 +3|-|12104|-|4|-|276.75|-|1.2619142138205235|-|3|-|12104|-|5|-|267.75|-|1.0949240286059523 +3|-|13462|-|4|-|276.4|-|1.2822147171897895|-|3|-|13462|-|5|-|144.0|-|1.8568393485315697 +3|-|13594|-|4|-|221.6|-|1.0412636011140086|-|3|-|13594|-|5|-|358.75|-|1.0624765438983101 +3|-|15494|-|4|-|266.0|-|1.2484599592186265|-|3|-|15494|-|5|-|342.25|-|1.0072439491001695 +3|-|15619|-|4|-|296.6|-|1.0301753065037642|-|3|-|15619|-|5|-|405.0|-|1.067463693994909 +3|-|16003|-|4|-|302.6|-|1.104218931570771|-|3|-|16003|-|5|-|320.75|-|1.2438028592264843 +3|-|16258|-|4|-|298.8|-|1.1767503262531802|-|3|-|16258|-|5|-|504.0|-|1.0183875233565205 +3|-|16298|-|4|-|142.8|-|1.4627927973066583|-|3|-|16298|-|5|-|321.5|-|1.1326499171388387 +3|-|16804|-|4|-|305.2|-|1.037239433355366|-|3|-|16804|-|5|-|142.5|-|1.3405100790300393 +3|-|17990|-|4|-|210.6|-|1.0540433559509008|-|3|-|17990|-|5|-|427.6666666666667|-|1.1156862924831872 +4|-|1844|-|4|-|306.0|-|1.0716936483128379|-|4|-|1844|-|5|-|327.5|-|1.1688994703052833 +4|-|2516|-|4|-|349.0|-|1.1376212199601703|-|4|-|2516|-|5|-|383.3333333333333|-|1.197815592157923 +4|-|2632|-|4|-|268.75|-|1.0209208030501655|-|4|-|2632|-|5|-|447.6666666666667|-|1.038501486385409 +4|-|3218|-|4|-|249.33333333333334|-|1.3797277226866307|-|4|-|3218|-|5|-|351.75|-|1.0193351396111368 +4|-|3308|-|4|-|278.8|-|1.4221413242441339|-|4|-|3308|-|5|-|212.75|-|1.5311387833490395 +4|-|3556|-|4|-|204.0|-|1.1043183123651399|-|4|-|3556|-|5|-|372.3333333333333|-|1.0188731244851315 +4|-|4348|-|4|-|354.6|-|1.158094191104169|-|4|-|4348|-|5|-|409.75|-|1.0044922879581082 +4|-|4556|-|4|-|286.8|-|1.3162734256416713|-|4|-|4556|-|5|-|238.75|-|1.1238010635930138 +4|-|4724|-|4|-|297.75|-|1.296886528526529|-|4|-|4724|-|5|-|452.5|-|1.073552173867753 +4|-|5488|-|4|-|347.6|-|1.0126778426806269|-|4|-|5488|-|5|-|275.0|-|1.4760799846932824 +4|-|6056|-|4|-|415.25|-|1.0250272209040852|-|4|-|6056|-|5|-|238.25|-|1.584221759561612 +4|-|6760|-|4|-|371.6|-|1.0321957619084776|-|4|-|6760|-|5|-|259.0|-|1.292392825220242 +4|-|6904|-|4|-|392.75|-|1.0345856250500594|-|4|-|6904|-|5|-|272.6666666666667|-|1.1187943202864172 +4|-|8146|-|4|-|274.2|-|1.2057794008756426|-|4|-|8146|-|5|-|323.25|-|1.078317063828754 +4|-|10990|-|4|-|178.25|-|1.0178412217699135|-|4|-|10990|-|5|-|440.75|-|1.0406235431419544 +4|-|12094|-|4|-|413.0|-|1.0314215788406775|-|4|-|12094|-|5|-|292.0|-|1.1590227116357323 +4|-|13634|-|4|-|369.3333333333333|-|1.1110335582316337|-|4|-|13634|-|5|-|404.0|-|1.053812227314186 +4|-|14042|-|4|-|317.25|-|1.0004338665467003|-|4|-|14042|-|5|-|344.25|-|1.11978049523154 +4|-|14665|-|4|-|314.4|-|1.0738198008241655|-|4|-|14665|-|5|-|431.3333333333333|-|1.0753976716186733 +4|-|15230|-|4|-|356.0|-|1.0486053253693115|-|4|-|15230|-|5|-|362.6666666666667|-|1.3401255360883961 +4|-|16801|-|4|-|278.0|-|1.2463159312329724|-|4|-|16801|-|5|-|292.5|-|1.2731313628284056 +4|-|17221|-|4|-|350.6|-|1.0511213166064473|-|4|-|17221|-|5|-|430.75|-|1.0942807075317895 +4|-|17605|-|4|-|222.25|-|1.044246825517581|-|4|-|17605|-|5|-|369.3333333333333|-|1.3200016187421877 +5|-|787|-|4|-|320.2|-|1.097186845888031|-|5|-|787|-|5|-|317.75|-|1.1777336445490392 +5|-|2899|-|4|-|369.0|-|1.030637237516715|-|5|-|2899|-|5|-|350.75|-|1.1600247110996078 +5|-|3580|-|4|-|371.6|-|1.1060027785162927|-|5|-|3580|-|5|-|300.25|-|1.1076675571157357 +5|-|4118|-|4|-|277.4|-|1.0570777006985244|-|5|-|4118|-|5|-|274.5|-|1.1180845598672036 +5|-|4351|-|4|-|304.0|-|1.1737038476348745|-|5|-|4351|-|5|-|307.75|-|1.1167236989740066 +5|-|4399|-|4|-|252.5|-|1.6715358080673026|-|5|-|4399|-|5|-|371.5|-|1.0422025666798196 +5|-|5413|-|4|-|300.4|-|1.3686992982041983|-|5|-|5413|-|5|-|247.5|-|1.1209457626406503 +5|-|6428|-|4|-|357.4|-|1.0359701243441122|-|5|-|6428|-|5|-|343.0|-|1.017307520160901 +5|-|6614|-|4|-|303.75|-|1.3250401709637307|-|5|-|6614|-|5|-|322.0|-|1.154356640682077 +5|-|7498|-|4|-|305.25|-|1.0447741491618914|-|5|-|7498|-|5|-|350.0|-|1.2595690873129133 +5|-|7708|-|4|-|175.6|-|1.2217392330596448|-|5|-|7708|-|5|-|171.0|-|1.0162995685844245 +5|-|7916|-|4|-|414.4|-|1.008656372492713|-|5|-|7916|-|5|-|352.0|-|1.1160362302596032 +5|-|9361|-|4|-|310.0|-|1.123018546403895|-|5|-|9361|-|5|-|359.0|-|1.190451819276931 +5|-|9673|-|4|-|218.6|-|1.5743804026540222|-|5|-|9673|-|5|-|355.0|-|1.1187816083778792 +5|-|10808|-|4|-|329.4|-|1.0026596740200513|-|5|-|10808|-|5|-|409.25|-|1.0044878917382374 +5|-|11533|-|4|-|396.2|-|1.099594901737946|-|5|-|11533|-|5|-|229.5|-|1.1657463278230873 +5|-|11641|-|4|-|216.0|-|1.0021784827306388|-|5|-|11641|-|5|-|199.66666666666666|-|1.4393430004105698 +5|-|12232|-|4|-|302.0|-|1.1062080858086207|-|5|-|12232|-|5|-|344.25|-|1.1544721491034604 +5|-|12572|-|4|-|332.5|-|1.007396094724043|-|5|-|12572|-|5|-|390.75|-|1.1240572227045411 +5|-|15550|-|4|-|296.4|-|1.1458241909547224|-|5|-|15550|-|5|-|431.75|-|1.1464357903820503 +5|-|16898|-|4|-|160.2|-|1.196105008081073|-|5|-|16898|-|5|-|394.6666666666667|-|1.0463801018595333 +5|-|17278|-|4|-|417.0|-|1.021224272195895|-|5|-|17278|-|5|-|301.3333333333333|-|1.3224644268599919 +5|-|17977|-|4|-|301.4|-|1.2348545752101892|-|5|-|17977|-|5|-|321.0|-|1.229581505760754 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q39b.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q39b.out new file mode 100644 index 0000000000000..06b5e03f9ec14 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q39b.out @@ -0,0 +1,3 @@ +1|-|12028|-|4|-|233.25|-|1.6679216953558442|-|1|-|12028|-|5|-|291.25|-|1.0601878864076697 +5|-|4399|-|4|-|252.5|-|1.6715358080673026|-|5|-|4399|-|5|-|371.5|-|1.0422025666798196 +5|-|9673|-|4|-|218.6|-|1.5743804026540222|-|5|-|9673|-|5|-|355.0|-|1.1187816083778792 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q4.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q4.out new file mode 100644 index 0000000000000..018f3ff3eb18c --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q4.out @@ -0,0 +1,2 @@ +AAAAAAAAMHOLAAAA|-|Terri|-|Cook|-|Terri.Cook@Vz02fJPUlPO.edu +AAAAAAAANBECBAAA|-|Michael|-|Lombardi|-|Michael.Lombardi@J.com diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q40.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q40.out new file mode 100644 index 0000000000000..dd2951227ea45 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q40.out @@ -0,0 +1,100 @@ +TN|-|AAAAAAAAAAEAAAAA|-|3.34|-|124.84 +TN|-|AAAAAAAAABHCAAAA|-|0.00|-|55.75 +TN|-|AAAAAAAAABLBAAAA|-|0.00|-|242.84 +TN|-|AAAAAAAAABPAAAAA|-|74.39|-|3.57 +TN|-|AAAAAAAAABPDAAAA|-|47.94|-|122.88 +TN|-|AAAAAAAAACBEAAAA|-|8.00|-|59.13 +TN|-|AAAAAAAAACKCAAAA|-|28.27|-|1.06 +TN|-|AAAAAAAAADACAAAA|-|0.00|-|18.19 +TN|-|AAAAAAAAADBBAAAA|-|64.01|-|45.13 +TN|-|AAAAAAAAAEFCAAAA|-|91.76|-|203.77 +TN|-|AAAAAAAAAEGEAAAA|-|0.00|-|247.16 +TN|-|AAAAAAAAAEIBAAAA|-|3.69|-|181.76 +TN|-|AAAAAAAAAELBAAAA|-|27.75|-|104.41 +TN|-|AAAAAAAAAEPDAAAA|-|-16.55|-|119.11 +TN|-|AAAAAAAAAFBBAAAA|-|137.62|-|6.34 +TN|-|AAAAAAAAAFCDAAAA|-|0.00|-|153.36 +TN|-|AAAAAAAAAFEBAAAA|-|46.09|-|7.04 +TN|-|AAAAAAAAAFJDAAAA|-|99.86|-|23.68 +TN|-|AAAAAAAAAGEBAAAA|-|75.84|-|44.05 +TN|-|AAAAAAAAAGIDAAAA|-|-101.66|-|-236.43 +TN|-|AAAAAAAAAGLDAAAA|-|150.03|-|5.46 +TN|-|AAAAAAAAAGPCAAAA|-|-4.04|-|34.07 +TN|-|AAAAAAAAAHBAAAAA|-|0.00|-|142.84 +TN|-|AAAAAAAAAHDDAAAA|-|40.93|-|303.23 +TN|-|AAAAAAAAAHKCAAAA|-|-177.02|-|41.91 +TN|-|AAAAAAAAAHPBAAAA|-|90.78|-|22.95 +TN|-|AAAAAAAAAIADAAAA|-|0.00|-|140.11 +TN|-|AAAAAAAAAIGDAAAA|-|0.00|-|246.90 +TN|-|AAAAAAAAAINCAAAA|-|0.00|-|21.15 +TN|-|AAAAAAAAAJDEAAAA|-|161.49|-|0.00 +TN|-|AAAAAAAAAJIDAAAA|-|12.23|-|20.95 +TN|-|AAAAAAAAAJOAAAAA|-|162.08|-|104.42 +TN|-|AAAAAAAAAKABAAAA|-|38.80|-|-1024.27 +TN|-|AAAAAAAAAKDDAAAA|-|179.39|-|46.95 +TN|-|AAAAAAAAALAAAAAA|-|-1877.48|-|17.98 +TN|-|AAAAAAAAALFEAAAA|-|75.75|-|-286.71 +TN|-|AAAAAAAAALLAAAAA|-|313.00|-|150.78 +TN|-|AAAAAAAAALOBAAAA|-|64.21|-|131.17 +TN|-|AAAAAAAAALPAAAAA|-|-1486.59|-|0.00 +TN|-|AAAAAAAAAMBAAAAA|-|-1798.94|-|186.31 +TN|-|AAAAAAAAAMDBAAAA|-|-60.02|-|131.15 +TN|-|AAAAAAAAAMEAAAAA|-|0.00|-|-527.20 +TN|-|AAAAAAAAANLCAAAA|-|20.94|-|251.26 +TN|-|AAAAAAAAANMDAAAA|-|0.00|-|3.04 +TN|-|AAAAAAAAAOIAAAAA|-|22.94|-|71.37 +TN|-|AAAAAAAAAOKBAAAA|-|100.93|-|7.17 +TN|-|AAAAAAAAAOMDAAAA|-|32.09|-|69.14 +TN|-|AAAAAAAAAOODAAAA|-|56.76|-|166.10 +TN|-|AAAAAAAAAPPBAAAA|-|0.00|-|367.41 +TN|-|AAAAAAAABABCAAAA|-|25.09|-|0.00 +TN|-|AAAAAAAABADAAAAA|-|-1236.14|-|56.04 +TN|-|AAAAAAAABAGAAAAA|-|247.57|-|0.00 +TN|-|AAAAAAAABCCCAAAA|-|53.74|-|86.84 +TN|-|AAAAAAAABDCBAAAA|-|19.21|-|8.00 +TN|-|AAAAAAAABECDAAAA|-|143.13|-|136.07 +TN|-|AAAAAAAABEJCAAAA|-|82.37|-|0.00 +TN|-|AAAAAAAABEMCAAAA|-|129.64|-|110.81 +TN|-|AAAAAAAABGECAAAA|-|142.64|-|0.00 +TN|-|AAAAAAAABGIBAAAA|-|7.09|-|0.00 +TN|-|AAAAAAAABGNCAAAA|-|67.20|-|123.86 +TN|-|AAAAAAAABHACAAAA|-|0.00|-|88.72 +TN|-|AAAAAAAABHPCAAAA|-|17.26|-|-1455.06 +TN|-|AAAAAAAABJFEAAAA|-|-410.82|-|0.62 +TN|-|AAAAAAAABJMAAAAA|-|54.11|-|0.00 +TN|-|AAAAAAAABKEBAAAA|-|21.11|-|0.00 +TN|-|AAAAAAAABLBDAAAA|-|0.00|-|118.01 +TN|-|AAAAAAAABLEDAAAA|-|25.96|-|49.07 +TN|-|AAAAAAAABLOCAAAA|-|32.13|-|-168.03 +TN|-|AAAAAAAABMCBAAAA|-|119.14|-|222.25 +TN|-|AAAAAAAABMOBAAAA|-|31.92|-|0.00 +TN|-|AAAAAAAABNEBAAAA|-|77.74|-|72.02 +TN|-|AAAAAAAABONAAAAA|-|0.00|-|58.59 +TN|-|AAAAAAAABPPAAAAA|-|9.91|-|10.34 +TN|-|AAAAAAAACACEAAAA|-|55.61|-|60.27 +TN|-|AAAAAAAACAEEAAAA|-|0.00|-|2.09 +TN|-|AAAAAAAACAHCAAAA|-|-101.47|-|37.82 +TN|-|AAAAAAAACALBAAAA|-|137.38|-|95.10 +TN|-|AAAAAAAACBBAAAAA|-|157.03|-|140.43 +TN|-|AAAAAAAACBGEAAAA|-|115.39|-|18.93 +TN|-|AAAAAAAACBHBAAAA|-|0.00|-|77.27 +TN|-|AAAAAAAACBICAAAA|-|23.04|-|65.40 +TN|-|AAAAAAAACBJCAAAA|-|39.04|-|0.00 +TN|-|AAAAAAAACBMCAAAA|-|203.78|-|105.42 +TN|-|AAAAAAAACBNAAAAA|-|67.83|-|120.29 +TN|-|AAAAAAAACCABAAAA|-|112.70|-|37.58 +TN|-|AAAAAAAACCFBAAAA|-|-103.17|-|39.45 +TN|-|AAAAAAAACDCDAAAA|-|105.60|-|11.43 +TN|-|AAAAAAAACDECAAAA|-|23.56|-|43.84 +TN|-|AAAAAAAACDIBAAAA|-|0.00|-|34.35 +TN|-|AAAAAAAACEACAAAA|-|0.00|-|135.24 +TN|-|AAAAAAAACECCAAAA|-|175.54|-|22.39 +TN|-|AAAAAAAACEODAAAA|-|81.13|-|116.32 +TN|-|AAAAAAAACFGAAAAA|-|23.77|-|196.81 +TN|-|AAAAAAAACFKDAAAA|-|0.00|-|-119.79 +TN|-|AAAAAAAACFLCAAAA|-|49.40|-|69.81 +TN|-|AAAAAAAACFPAAAAA|-|38.35|-|0.00 +TN|-|AAAAAAAACGCBAAAA|-|14.07|-|-685.72 +TN|-|AAAAAAAACGEBAAAA|-|-74.85|-|98.19 +TN|-|AAAAAAAACGFAAAAA|-|214.30|-|36.26 +TN|-|AAAAAAAACGJDAAAA|-|115.88|-|71.43 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q41.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q41.out new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q42.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q42.out new file mode 100644 index 0000000000000..f5a0502b1174c --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q42.out @@ -0,0 +1,11 @@ +1998|-|9|-|Books|-|488579.25 +1998|-|7|-|Home|-|484334.96 +1998|-|4|-|Shoes|-|437304.21 +1998|-|2|-|Men|-|436460.33 +1998|-|10|-|Electronics|-|365465.16 +1998|-|8|-|Sports|-|332795.16 +1998|-|3|-|Children|-|315831.76 +1998|-|1|-|Women|-|298898.26 +1998|-|6|-|Jewelry|-|237834.62 +1998|-|5|-|Music|-|178420.91 +1998|-|null|-|null|-|41837.87 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q43.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q43.out new file mode 100644 index 0000000000000..522ea92c05e5f --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q43.out @@ -0,0 +1,6 @@ +able|-|AAAAAAAACAAAAAAA|-|489536.93|-|454630.72|-|466155.96|-|454470.38|-|502400.34|-|467246.71|-|461006.61 +ation|-|AAAAAAAAHAAAAAAA|-|476447.97|-|454570.70|-|469021.13|-|492594.91|-|455620.81|-|478508.07|-|477924.64 +bar|-|AAAAAAAAKAAAAAAA|-|474553.63|-|453564.44|-|480446.94|-|458008.84|-|491469.25|-|486405.20|-|485594.65 +eing|-|AAAAAAAAIAAAAAAA|-|459500.71|-|499010.48|-|474143.57|-|479094.46|-|501285.57|-|475173.46|-|495902.68 +ese|-|AAAAAAAAEAAAAAAA|-|451794.79|-|475249.11|-|506337.14|-|500949.28|-|487331.76|-|453412.19|-|473804.82 +ought|-|AAAAAAAABAAAAAAA|-|489972.19|-|462578.90|-|484940.60|-|496745.92|-|465297.13|-|460805.00|-|476896.86 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q44.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q44.out new file mode 100644 index 0000000000000..172b23fb7e7d4 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q44.out @@ -0,0 +1,10 @@ +1|-|eingbaroughtpri|-|esebaroughtation +2|-|n stableeseeseought|-|eseationese +3|-|prin stcallybarought|-|eingoughtationable +4|-|ationcallyn stcally|-|antibarbarantiought +5|-|barationn stought|-|callyoughtationbarought +6|-|antibarantically|-|eseoughtoughtcally +7|-|eingpriationable|-|callyesen stoughtought +8|-|ationbarableation|-|oughtpriation +9|-|eseeseeingought|-|esen stationation +10|-|antieingbarn st|-|eingn stableeseought diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q45.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q45.out new file mode 100644 index 0000000000000..0c803967fe2d4 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q45.out @@ -0,0 +1,22 @@ +15752|-|Snyder County|-|60.40 +25124|-|Greene County|-|47.55 +28371|-|Wayne County|-|56.77 +29231|-|Monongalia County|-|92.31 +35819|-|Putnam County|-|25.90 +36871|-|Coffee County|-|35.68 +37752|-|Monroe County|-|26.51 +43394|-|Kalamazoo County|-|34.25 +48579|-|Dearborn County|-|11.20 +50191|-|Copiah County|-|97.13 +55709|-|Marathon County|-|68.71 +57683|-|null|-|38.37 +58354|-|Dubuque County|-|17.20 +60534|-|Clay County|-|27.14 +69310|-|Greene County|-|25.19 +72477|-|Ouachita County|-|25.44 +73003|-|Columbia County|-|80.27 +78767|-|Greene County|-|125.51 +85709|-|Montezuma County|-|150.81 +88370|-|Fremont County|-|171.99 +94536|-|Bethel Census Area|-|2.94 +99003|-|Clackamas County|-|149.10 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q46.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q46.out new file mode 100644 index 0000000000000..5dc255de679bf --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q46.out @@ -0,0 +1,100 @@ +Zuniga|-|Nicole|-|Fairview|-|Lakeview|-|33382|-|2741.68|-|-9247.28 +Zink|-|Matthew|-|Oak Hill|-|Walnut Grove|-|35907|-|1817.16|-|-2833.21 +Zink|-|Cynthia|-|Shiloh|-|Salem|-|21362|-|8830.39|-|-12148.86 +Zimmerman|-|Yolanda|-|Spring Valley|-|Pine Grove|-|10922|-|5311.28|-|-11931.21 +Zimmerman|-|Sabrina|-|Martinsville|-|Wildwood|-|49428|-|73.01|-|-650.60 +Zimmerman|-|Polly|-|Wildwood|-|Clifton|-|161435|-|3129.85|-|-6388.96 +Zimmerman|-|Karen|-|Lincoln|-|Plainview|-|74920|-|609.24|-|-2075.21 +Zimmerman|-|Karen|-|Lincoln|-|Pleasant Valley|-|232331|-|186.56|-|-1914.53 +Zimmerman|-|Barbara|-|Plainville|-|Spring Hill|-|173446|-|814.68|-|-18745.63 +Zimmer|-|Joyce|-|Oakland|-|Valley View|-|203367|-|6054.73|-|-579.50 +Ziegler|-|Samuel|-|Brownsville|-|Riverdale|-|22756|-|138.82|-|-1229.06 +Zeller|-|Sonia|-|Spring Valley|-|Ashland|-|134275|-|665.56|-|-2100.06 +Zeller|-|Marissa|-|Arlington|-|Union Hill|-|182520|-|547.12|-|-7229.04 +Zeigler|-|Morgan|-|Fairfield|-|Jackson|-|181615|-|368.60|-|-11999.28 +Zeigler|-|Eileen|-|Friendship|-|Sulphur Springs|-|190897|-|54.31|-|611.46 +Zavala|-|Susie|-|Hillcrest|-|Wildwood|-|236733|-|2380.93|-|-4620.99 +Zavala|-|Ernesto|-|Pleasant Hill|-|Bethel|-|125764|-|56.14|-|-6586.55 +Zavala|-|Diane|-|Unionville|-|Pleasant Valley|-|237303|-|3488.08|-|-5339.40 +Zarate|-|Linda|-|Salem|-|Shiloh|-|121259|-|1991.33|-|-20907.82 +Zaragoza|-|Bryce|-|Highland Park|-|Pleasant Valley|-|129150|-|8526.54|-|-5347.93 +Younger|-|Michelle|-|Mount Zion|-|Shady Grove|-|211280|-|925.98|-|-4583.82 +Youngblood|-|Peter|-|Spring Hill|-|Friendship|-|96599|-|7201.61|-|-12245.17 +Youngblood|-|Allen|-|Farmington|-|Woodlawn|-|16204|-|1095.32|-|-7925.98 +Young|-|William|-|Bethel|-|Franklin|-|51127|-|0.00|-|-5708.98 +Young|-|Vernon|-|Saint George|-|Forest Hills|-|203375|-|5419.45|-|-14103.08 +Young|-|Tonya|-|Oakland|-|Jackson|-|223857|-|1485.17|-|-6623.55 +Young|-|Richard|-|Mount Olive|-|Mountain View|-|94954|-|3521.99|-|-6285.55 +Young|-|Rhonda|-|Hopewell|-|Jamestown|-|212873|-|941.33|-|-1050.53 +Young|-|Paula|-|Cedar Grove|-|Greenwood|-|71575|-|4256.57|-|-19256.13 +Young|-|Olga|-|Greenwood|-|Omega|-|76219|-|2589.04|-|-16757.93 +Young|-|Michele|-|Summit|-|Leland|-|190386|-|212.72|-|-5055.07 +Young|-|Kathy|-|Greenwood|-|Lakeview|-|114419|-|274.85|-|-3900.63 +Young|-|Judith|-|Lakeview|-|Arlington|-|193510|-|3207.35|-|-6305.75 +Young|-|Joe|-|Highland Park|-|Union|-|19126|-|2915.78|-|-7750.97 +Young|-|Jessica|-|Unionville|-|Oak Grove|-|236623|-|0.00|-|-8414.08 +Young|-|James|-|Belmont|-|Farmersville|-|93785|-|494.22|-|-450.72 +Young|-|Jacqueline|-|Waterloo|-|Spring Valley|-|31026|-|3526.14|-|-16948.31 +Young|-|Henrietta|-|Jamestown|-|Vance|-|26566|-|2808.97|-|-6825.09 +Young|-|Elsie|-|Wildwood|-|Oakdale|-|182298|-|0.00|-|-3431.97 +Young|-|Donna|-|Fairfield|-|Wilson|-|192401|-|2178.31|-|1357.24 +Young|-|Debra|-|Plainview|-|Lakeside|-|74434|-|103.23|-|-2362.82 +Young|-|Darius|-|Lakeview|-|Summit|-|165811|-|306.25|-|-7145.32 +Young|-|Clayton|-|Sumner|-|New Hope|-|200234|-|8178.83|-|-13884.93 +Young|-|Christine|-|Oak Ridge|-|Sulphur Springs|-|201494|-|2140.84|-|-1427.46 +Young|-|Charles|-|Hamilton|-|Woodland|-|176689|-|7139.35|-|-16071.15 +Young|-|Angela|-|Farmington|-|Hopewell|-|74283|-|278.00|-|2021.55 +Young|-|Alan|-|Wildwood|-|Pleasant Valley|-|3989|-|81.10|-|-8532.71 +York|-|Cheryl|-|Edgewood|-|Georgetown|-|7784|-|5187.91|-|-14263.14 +Yoon|-|June|-|Oak Grove|-|Cedar Grove|-|17325|-|136.77|-|-2154.59 +Yoder|-|Pauline|-|Whitney|-|Valley View|-|27502|-|110.88|-|-10659.44 +Yoder|-|Gary|-|Belmont|-|Franklin|-|145551|-|1738.04|-|-21166.44 +Yi|-|Karen|-|Hillcrest|-|Five Forks|-|121139|-|1951.63|-|-8898.01 +Yeager|-|Kizzie|-|Shady Grove|-|Philadelphia|-|189478|-|2309.47|-|-17152.79 +Yeager|-|Barbara|-|Shiloh|-|Wilson|-|11281|-|7800.89|-|-5963.99 +Yazzie|-|Paula|-|Greenville|-|Crossroads|-|216954|-|1950.33|-|-2967.58 +Yates|-|William|-|Lakewood|-|Concord|-|206531|-|0.00|-|-6324.83 +Yates|-|Stephanie|-|Woodlawn|-|Concord|-|36310|-|4885.05|-|-10193.15 +Yates|-|Paula|-|Mount Vernon|-|Spring Valley|-|61784|-|1357.30|-|-6195.87 +Yates|-|Judith|-|Cedar Grove|-|Union|-|85342|-|280.84|-|-11929.51 +Yates|-|Beverly|-|Marion|-|Oakdale|-|224018|-|0.00|-|1317.89 +Yarbrough|-|Sherman|-|Fairfield|-|Newtown|-|42930|-|4488.00|-|-12810.94 +Yang|-|Rosa|-|Midway|-|Pine Grove|-|77156|-|2587.10|-|-5238.26 +Yang|-|Charles|-|Maple Grove|-|Belmont|-|88522|-|3792.23|-|-11438.21 +Yang|-|Amelia|-|Valley View|-|Concord|-|3626|-|1860.34|-|-16288.62 +Yanez|-|Katrina|-|Mount Zion|-|Shady Grove|-|162024|-|1553.67|-|358.28 +Yancey|-|Sarah|-|Shady Grove|-|Greenfield|-|155723|-|3569.33|-|-12115.73 +Yancey|-|Charles|-|Greenwood|-|Crossroads|-|232039|-|4327.51|-|-18364.15 +Yamamoto|-|Kristina|-|Riverview|-|Riceville|-|35922|-|666.39|-|-5816.35 +Xiong|-|Paul|-|Highland|-|Providence|-|143919|-|1444.54|-|-15269.91 +Wynne|-|Stephanie|-|Shiloh|-|Oakdale|-|139979|-|4799.22|-|-13025.09 +Wynne|-|Stephanie|-|Shiloh|-|Spring Valley|-|166693|-|953.69|-|1442.46 +Wynn|-|Nancy|-|Lakewood|-|Greenfield|-|61578|-|6064.46|-|-3382.41 +Wynn|-|Joann|-|Brownsville|-|Mount Zion|-|28912|-|0.00|-|-12.77 +Wynn|-|Catherine|-|Woodville|-|Five Points|-|148635|-|10633.84|-|-14992.54 +Wyman|-|Jeffery|-|Mountain View|-|Sunnyside|-|235818|-|385.32|-|1017.43 +Wyatt|-|Paula|-|Hopewell|-|Lakeview|-|65013|-|1334.69|-|-3423.22 +Wyatt|-|Earnest|-|Brownsville|-|Florence|-|220209|-|6485.21|-|1793.86 +Wright|-|Richie|-|Hopewell|-|Pleasant Valley|-|106818|-|4763.49|-|-15079.41 +Wright|-|Richard|-|Enterprise|-|Riverview|-|3308|-|1817.20|-|-4083.50 +Wright|-|Ramona|-|Unionville|-|Concord|-|126643|-|0.00|-|-6866.53 +Wright|-|Nathan|-|Maple Grove|-|Woodlawn|-|198742|-|101.23|-|-308.95 +Wright|-|Nathan|-|Mount Zion|-|Shore Acres|-|28605|-|109.26|-|-7616.05 +Wright|-|Marilyn|-|Greenville|-|Lebanon|-|77092|-|6114.46|-|-23013.76 +Wright|-|Lillie|-|Mount Zion|-|Valley View|-|153557|-|679.86|-|-12125.67 +Wright|-|Joanne|-|Springfield|-|Newtown|-|123907|-|2236.51|-|-11803.55 +Wright|-|Jason|-|Deerfield|-|Glendale|-|52939|-|3517.44|-|-14140.40 +Wright|-|Jacob|-|Brookwood|-|Highland Park|-|212093|-|0.00|-|-16170.78 +Wright|-|Gladys|-|Bethel|-|Lakeside|-|63713|-|826.66|-|-7473.23 +Wright|-|Edwin|-|Glenwood|-|Oakdale|-|231277|-|705.63|-|-939.64 +Wright|-|Edwin|-|Glenwood|-|Plainview|-|133436|-|249.74|-|-6245.81 +Wright|-|David|-|Walnut Grove|-|Lawrenceville|-|200353|-|46.00|-|-868.29 +Wright|-|Daniel|-|Bridgeport|-|Spring Valley|-|192398|-|16.25|-|-8596.46 +Wright|-|Carrie|-|New Hope|-|Highland|-|12770|-|5430.76|-|-19364.73 +Wright|-|Caroline|-|Riverdale|-|Friendship|-|129631|-|3792.41|-|-16835.51 +Wright|-|Carl|-|Leon|-|Pleasant Valley|-|175551|-|2694.83|-|-2149.82 +Wright|-|Andrew|-|Valley View|-|Jamestown|-|37953|-|2552.05|-|-14759.91 +Wright|-|Alfonso|-|Springdale|-|Five Forks|-|42687|-|481.66|-|-13693.95 +Wright|-|null|-|Forest Hills|-|Salem|-|210412|-|5983.29|-|-6827.17 +Wright|-|null|-|Greenwood|-|Crossroads|-|33511|-|0.00|-|-1267.98 +Wright|-|null|-|Greenwood|-|Farmington|-|168513|-|2384.23|-|-1237.26 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q47.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q47.out new file mode 100644 index 0000000000000..2f77e82b0c4e7 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q47.out @@ -0,0 +1,100 @@ +Children|-|exportiexporti #2|-|2000|-|4|-|5385.200833|-|1829.57|-|3729.62|-|3002.89 +Children|-|edu packexporti #2|-|2000|-|4|-|5037.062500|-|1552.08|-|3181.00|-|2518.25 +Shoes|-|edu packedu pack #2|-|2000|-|2|-|5050.020833|-|1771.80|-|3843.78|-|3412.15 +Children|-|edu packexporti #2|-|2000|-|2|-|5037.062500|-|1879.46|-|3309.59|-|3181.00 +Men|-|importoimporto #2|-|2000|-|6|-|4610.358333|-|1557.11|-|2651.86|-|2481.18 +Children|-|edu packexporti #2|-|2000|-|6|-|5268.402500|-|2223.70|-|2657.85|-|3595.57 +Men|-|exportiimporto #2|-|2000|-|2|-|5058.423333|-|2014.24|-|3503.21|-|3207.34 +Men|-|edu packimporto #2|-|2000|-|2|-|4957.545000|-|1940.30|-|2976.42|-|2845.74 +Men|-|edu packimporto #2|-|2000|-|4|-|5020.536667|-|2009.39|-|2897.45|-|2427.54 +Children|-|edu packexporti #2|-|2000|-|2|-|5268.402500|-|2263.20|-|4200.77|-|2295.36 +Men|-|exportiimporto #2|-|2000|-|2|-|5284.808333|-|2303.51|-|3457.35|-|2915.99 +Music|-|amalgscholar #2|-|2000|-|2|-|5294.566667|-|2316.41|-|3657.80|-|2928.57 +Children|-|edu packexporti #2|-|2000|-|3|-|5268.402500|-|2295.36|-|2263.20|-|3840.58 +Children|-|exportiexporti #2|-|2000|-|2|-|4554.047500|-|1597.60|-|3005.29|-|2878.97 +Men|-|edu packimporto #2|-|2000|-|4|-|5241.396667|-|2317.36|-|3353.43|-|3044.21 +Children|-|importoexporti #2|-|2000|-|3|-|5001.767500|-|2103.50|-|2704.37|-|2882.40 +Men|-|edu packimporto #2|-|2000|-|7|-|5241.396667|-|2345.87|-|3294.61|-|7864.81 +Children|-|amalgexporti #2|-|2000|-|7|-|4352.626667|-|1465.56|-|2129.68|-|5691.65 +Women|-|exportiamalg #2|-|2000|-|2|-|4931.680000|-|2049.07|-|3785.35|-|2976.31 +Music|-|importoscholar #2|-|2000|-|2|-|4766.157500|-|1897.06|-|2987.24|-|3188.69 +Children|-|exportiexporti #2|-|2000|-|4|-|4554.047500|-|1692.66|-|2878.97|-|2594.09 +Children|-|edu packexporti #2|-|2000|-|2|-|5170.060833|-|2327.28|-|3253.61|-|2500.60 +Shoes|-|edu packedu pack #2|-|2000|-|7|-|4630.165833|-|1809.33|-|2543.11|-|5407.67 +Music|-|amalgscholar #2|-|2000|-|4|-|5294.566667|-|2475.96|-|2928.57|-|3205.10 +Men|-|exportiimporto #2|-|2000|-|7|-|4977.830833|-|2189.31|-|2979.03|-|7318.48 +Women|-|exportiamalg #2|-|2000|-|5|-|4805.559167|-|2037.09|-|2194.86|-|2672.00 +Men|-|edu packimporto #2|-|2000|-|5|-|5223.180833|-|2461.33|-|2735.97|-|3811.15 +Women|-|exportiamalg #2|-|2000|-|7|-|4805.559167|-|2044.12|-|2672.00|-|6119.18 +Men|-|exportiimporto #2|-|2000|-|5|-|5284.808333|-|2525.69|-|3406.18|-|2982.36 +Music|-|edu packscholar #2|-|2000|-|4|-|4005.177500|-|1269.63|-|3123.47|-|2385.14 +Men|-|exportiimporto #2|-|2000|-|2|-|4985.788333|-|2262.18|-|2985.13|-|3395.22 +Music|-|amalgscholar #2|-|2000|-|5|-|5494.891667|-|2776.07|-|3179.63|-|3004.24 +Men|-|importoimporto #2|-|2000|-|3|-|4717.660000|-|2005.90|-|2170.61|-|2631.19 +Music|-|importoscholar #2|-|2000|-|6|-|4849.863333|-|2142.62|-|2561.60|-|2817.42 +Children|-|exportiexporti #2|-|2000|-|1|-|4558.680000|-|1855.12|-|4582.05|-|2291.82 +Women|-|exportiamalg #2|-|2000|-|4|-|4931.680000|-|2230.18|-|2976.31|-|2515.45 +Children|-|edu packexporti #2|-|2000|-|5|-|5170.060833|-|2469.38|-|2862.75|-|2852.75 +Children|-|amalgexporti #2|-|2000|-|2|-|4778.475000|-|2078.26|-|3533.88|-|3818.41 +Men|-|edu packimporto #2|-|2000|-|5|-|5253.173333|-|2555.24|-|2665.16|-|3707.24 +Men|-|importoimporto #2|-|2000|-|6|-|4779.026667|-|2081.29|-|2637.16|-|3027.68 +Men|-|importoimporto #2|-|2000|-|6|-|4934.307500|-|2236.87|-|3584.15|-|2417.23 +Men|-|amalgimporto #2|-|2000|-|2|-|4359.156667|-|1673.90|-|2927.11|-|2474.73 +Children|-|importoexporti #2|-|2000|-|4|-|5067.460000|-|2390.05|-|2742.62|-|2683.47 +Music|-|amalgscholar #2|-|2000|-|7|-|5294.566667|-|2619.71|-|3038.01|-|8143.87 +Music|-|amalgscholar #2|-|2000|-|1|-|5010.654167|-|2336.66|-|5603.94|-|2902.01 +Men|-|amalgimporto #2|-|2000|-|5|-|4833.332500|-|2160.07|-|2712.05|-|2765.22 +Children|-|edu packexporti #2|-|2000|-|3|-|5170.060833|-|2500.60|-|2327.28|-|2862.75 +Women|-|exportiamalg #2|-|2000|-|2|-|4864.404167|-|2204.64|-|2731.57|-|3143.38 +Children|-|exportiexporti #2|-|2000|-|7|-|4561.383333|-|1902.43|-|2050.13|-|6322.66 +Men|-|exportiimporto #2|-|2000|-|2|-|4977.830833|-|2325.63|-|3730.25|-|3051.59 +Men|-|amalgimporto #2|-|2000|-|2|-|4632.438333|-|1992.14|-|2230.23|-|3534.00 +Music|-|amalgscholar #2|-|2000|-|2|-|5494.891667|-|2864.07|-|4142.29|-|3404.54 +Men|-|importoimporto #2|-|2000|-|6|-|4740.876667|-|2110.37|-|3668.79|-|2636.82 +Children|-|exportiexporti #2|-|2000|-|7|-|5385.200833|-|2761.18|-|3975.64|-|8247.25 +Women|-|exportiamalg #2|-|2000|-|5|-|4671.545000|-|2050.45|-|2760.84|-|2487.40 +Women|-|exportiamalg #2|-|2000|-|4|-|4805.559167|-|2194.86|-|2592.89|-|2037.09 +Children|-|edu packexporti #2|-|2000|-|5|-|5268.402500|-|2657.85|-|3840.58|-|2223.70 +Shoes|-|importoedu pack #2|-|2000|-|7|-|4309.455833|-|1709.33|-|2180.39|-|4932.25 +Shoes|-|importoedu pack #2|-|2000|-|2|-|4599.602500|-|1999.86|-|2450.57|-|3209.68 +Men|-|exportiimporto #2|-|2000|-|2|-|5175.055000|-|2578.33|-|3218.37|-|3118.84 +Men|-|edu packimporto #2|-|2000|-|5|-|5020.536667|-|2427.54|-|2009.39|-|2928.16 +Children|-|importoexporti #2|-|2000|-|2|-|5065.880833|-|2474.80|-|3289.08|-|3604.92 +Shoes|-|edu packedu pack #2|-|2000|-|2|-|4859.568333|-|2269.06|-|2823.61|-|3118.93 +Shoes|-|exportiedu pack #2|-|2000|-|2|-|4573.767500|-|1984.45|-|4016.29|-|2555.16 +Music|-|importoscholar #2|-|2000|-|4|-|4766.157500|-|2177.78|-|3188.69|-|3174.30 +Men|-|edu packimporto #2|-|2000|-|4|-|5253.173333|-|2665.16|-|3241.69|-|2555.24 +Women|-|importoamalg #2|-|2000|-|1|-|4227.461667|-|1642.50|-|4248.83|-|2287.59 +Men|-|edu packimporto #2|-|2000|-|6|-|5096.645833|-|2517.64|-|3553.82|-|3583.01 +Children|-|edu packexporti #2|-|2000|-|6|-|4886.695000|-|2307.93|-|3069.07|-|2731.52 +Shoes|-|edu packedu pack #2|-|2000|-|4|-|4859.568333|-|2283.30|-|3118.93|-|2768.09 +Men|-|edu packimporto #2|-|2000|-|7|-|5223.180833|-|2650.59|-|3811.15|-|6457.45 +Children|-|edu packexporti #2|-|2000|-|4|-|5070.655833|-|2504.32|-|2618.70|-|2538.69 +Men|-|amalgimporto #2|-|2000|-|6|-|4632.438333|-|2071.87|-|2363.37|-|2338.48 +Men|-|amalgimporto #2|-|2000|-|6|-|4359.156667|-|1803.12|-|2652.16|-|2311.82 +Shoes|-|edu packedu pack #2|-|2000|-|2|-|4845.504167|-|2289.86|-|2706.02|-|3235.15 +Shoes|-|exportiedu pack #2|-|2000|-|4|-|4473.542500|-|1919.45|-|2709.82|-|2960.62 +Children|-|importoexporti #2|-|2000|-|2|-|5067.460000|-|2513.73|-|4167.13|-|2742.62 +Men|-|importoimporto #2|-|2000|-|2|-|4717.660000|-|2170.61|-|2684.63|-|2005.90 +Music|-|amalgscholar #2|-|2000|-|4|-|5163.038333|-|2622.05|-|2724.78|-|3267.36 +Children|-|amalgexporti #2|-|2000|-|6|-|4700.653333|-|2160.95|-|3056.99|-|2924.55 +Children|-|importoexporti #2|-|2000|-|2|-|4667.810000|-|2128.18|-|3326.22|-|2475.28 +Music|-|edu packscholar #2|-|2000|-|5|-|4451.345833|-|1913.57|-|2360.53|-|2072.25 +Men|-|amalgimporto #2|-|2000|-|3|-|4697.217500|-|2161.27|-|2254.25|-|2561.98 +Children|-|edu packexporti #2|-|2000|-|1|-|4886.695000|-|2350.87|-|5174.38|-|3011.38 +Men|-|edu packimporto #2|-|2000|-|2|-|5241.396667|-|2708.12|-|3273.94|-|3353.43 +Children|-|edu packexporti #2|-|2000|-|5|-|5070.655833|-|2538.69|-|2504.32|-|3259.03 +Men|-|edu packimporto #2|-|2000|-|3|-|5223.180833|-|2692.15|-|3140.45|-|2735.97 +Men|-|importoimporto #2|-|2000|-|7|-|4717.660000|-|2189.66|-|2378.65|-|7311.71 +Shoes|-|importoedu pack #2|-|2000|-|2|-|4280.876667|-|1753.90|-|3702.26|-|2911.09 +Women|-|edu packamalg #2|-|2000|-|2|-|4057.621667|-|1534.38|-|2318.41|-|2499.25 +Children|-|edu packexporti #2|-|2000|-|5|-|5037.062500|-|2518.25|-|1552.08|-|3100.42 +Men|-|importoimporto #2|-|2000|-|7|-|4934.307500|-|2417.23|-|2236.87|-|6398.06 +Music|-|amalgscholar #2|-|2000|-|2|-|4782.996667|-|2269.87|-|2919.32|-|2773.68 +Music|-|amalgscholar #2|-|2000|-|7|-|4782.996667|-|2270.13|-|2756.32|-|7227.75 +Children|-|exportiexporti #2|-|2000|-|6|-|4561.383333|-|2050.13|-|2230.19|-|1902.43 +Children|-|exportiexporti #2|-|2000|-|3|-|4833.734167|-|2323.38|-|2644.38|-|2416.77 +Men|-|amalgimporto #2|-|2000|-|2|-|4833.332500|-|2330.53|-|2456.27|-|2967.28 +Children|-|importoexporti #2|-|2000|-|7|-|4765.245000|-|2263.78|-|2608.71|-|5318.73 +Children|-|exportiexporti #2|-|2000|-|7|-|4558.680000|-|2057.92|-|2179.94|-|6637.37 +Shoes|-|edu packedu pack #2|-|2000|-|2|-|4804.994167|-|2306.37|-|2895.80|-|3113.34 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q48.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q48.out new file mode 100644 index 0000000000000..f5bc8f6686a2f --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q48.out @@ -0,0 +1 @@ +23748 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q49.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q49.out new file mode 100644 index 0000000000000..60fc414bdff69 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q49.out @@ -0,0 +1,33 @@ +catalog|-|1934|-|0.45918367346938775510|-|1|-|1 +catalog|-|15035|-|0.49494949494949494949|-|2|-|2 +catalog|-|5611|-|0.58426966292134831461|-|3|-|3 +catalog|-|14291|-|0.65168539325842696629|-|4|-|4 +catalog|-|2605|-|0.65882352941176470588|-|5|-|5 +catalog|-|1202|-|0.68686868686868686869|-|6|-|36 +catalog|-|15659|-|0.72289156626506024096|-|7|-|6 +catalog|-|1130|-|0.73493975903614457831|-|8|-|7 +catalog|-|11917|-|0.75280898876404494382|-|9|-|8 +catalog|-|16904|-|0.76388888888888888889|-|10|-|9 +catalog|-|10007|-|0.77419354838709677419|-|11|-|10 +store|-|15599|-|0.73255813953488372093|-|1|-|8 +store|-|6859|-|0.83132530120481927711|-|2|-|1 +store|-|8522|-|0.84210526315789473684|-|3|-|2 +store|-|14510|-|0.84337349397590361446|-|4|-|3 +store|-|2821|-|0.84693877551020408163|-|5|-|4 +store|-|17905|-|0.86315789473684210526|-|6|-|5 +store|-|337|-|0.87209302325581395349|-|7|-|6 +store|-|4703|-|0.89743589743589743590|-|8|-|7 +store|-|1669|-|0.92000000000000000000|-|9|-|9 +store|-|12533|-|0.92857142857142857143|-|10|-|10 +web|-|15755|-|0E-20|-|1|-|5 +web|-|3925|-|0.63414634146341463415|-|2|-|1 +web|-|13859|-|0.67010309278350515464|-|3|-|2 +web|-|1165|-|0.68131868131868131868|-|4|-|12 +web|-|15959|-|0.68421052631578947368|-|5|-|3 +web|-|3158|-|0.70930232558139534884|-|6|-|4 +web|-|12671|-|0.72631578947368421053|-|7|-|6 +web|-|14477|-|0.72916666666666666667|-|8|-|7 +web|-|6035|-|0.76344086021505376344|-|9|-|8 +web|-|4976|-|0.79069767441860465116|-|10|-|22 +web|-|1424|-|0.79120879120879120879|-|11|-|9 +web|-|16813|-|0.82000000000000000000|-|12|-|10 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q5.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q5.out new file mode 100644 index 0000000000000..a220e859408c8 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q5.out @@ -0,0 +1,100 @@ +null|-|null|-|115594110.84|-|2284876.41|-|-30784735.42 +catalog channel|-|null|-|39386111.98|-|835889.43|-|-4413707.25 +catalog channel|-|catalog_pageAAAAAAAAAABAAAAA|-|142709.95|-|0.00|-|-33829.11 +catalog channel|-|catalog_pageAAAAAAAAAADAAAAA|-|78358.50|-|0.00|-|-9578.35 +catalog channel|-|catalog_pageAAAAAAAAABAAAAAA|-|0.00|-|4176.90|-|-492.29 +catalog channel|-|catalog_pageAAAAAAAAABBAAAAA|-|71027.83|-|0.00|-|-27264.22 +catalog channel|-|catalog_pageAAAAAAAAABDAAAAA|-|93670.35|-|0.00|-|-3768.98 +catalog channel|-|catalog_pageAAAAAAAAACAAAAAA|-|0.00|-|1776.17|-|-1252.65 +catalog channel|-|catalog_pageAAAAAAAAACBAAAAA|-|112153.16|-|0.00|-|-19004.12 +catalog channel|-|catalog_pageAAAAAAAAACDAAAAA|-|102298.11|-|0.00|-|-14768.21 +catalog channel|-|catalog_pageAAAAAAAAADAAAAAA|-|0.00|-|8773.82|-|-4372.46 +catalog channel|-|catalog_pageAAAAAAAAADBAAAAA|-|23722.97|-|0.00|-|-22193.13 +catalog channel|-|catalog_pageAAAAAAAAADDAAAAA|-|47126.10|-|0.00|-|-6735.40 +catalog channel|-|catalog_pageAAAAAAAAAEAAAAAA|-|0.00|-|6234.69|-|-2690.18 +catalog channel|-|catalog_pageAAAAAAAAAEBAAAAA|-|45880.56|-|679.36|-|-16578.99 +catalog channel|-|catalog_pageAAAAAAAAAEDAAAAA|-|66004.24|-|0.00|-|6074.29 +catalog channel|-|catalog_pageAAAAAAAAAFAAAAAA|-|0.00|-|463.68|-|-1521.36 +catalog channel|-|catalog_pageAAAAAAAAAFDAAAAA|-|88022.65|-|0.00|-|-769.81 +catalog channel|-|catalog_pageAAAAAAAAAGAAAAAA|-|0.00|-|8947.80|-|-2922.65 +catalog channel|-|catalog_pageAAAAAAAAAGDAAAAA|-|124552.05|-|0.00|-|24880.33 +catalog channel|-|catalog_pageAAAAAAAAAHAAAAAA|-|188643.97|-|0.00|-|-33045.93 +catalog channel|-|catalog_pageAAAAAAAAAIAAAAAA|-|219950.84|-|518.83|-|-1089.03 +catalog channel|-|catalog_pageAAAAAAAAAJAAAAAA|-|196607.25|-|7494.81|-|-41407.88 +catalog channel|-|catalog_pageAAAAAAAAAJCAAAAA|-|23556.72|-|0.00|-|-5599.24 +catalog channel|-|catalog_pageAAAAAAAAAKAAAAAA|-|155095.31|-|0.00|-|-24248.39 +catalog channel|-|catalog_pageAAAAAAAAAKCAAAAA|-|13054.83|-|0.00|-|-528.84 +catalog channel|-|catalog_pageAAAAAAAAALAAAAAA|-|114177.20|-|1866.02|-|-48127.76 +catalog channel|-|catalog_pageAAAAAAAAALCAAAAA|-|10602.13|-|0.00|-|-3956.02 +catalog channel|-|catalog_pageAAAAAAAAAMAAAAAA|-|180993.77|-|144.00|-|-26262.58 +catalog channel|-|catalog_pageAAAAAAAAAMCAAAAA|-|29191.46|-|0.00|-|-8019.34 +catalog channel|-|catalog_pageAAAAAAAAANAAAAAA|-|202640.83|-|0.00|-|14603.23 +catalog channel|-|catalog_pageAAAAAAAAANBAAAAA|-|0.00|-|3103.80|-|-1162.99 +catalog channel|-|catalog_pageAAAAAAAAANCAAAAA|-|14627.25|-|61.80|-|1219.16 +catalog channel|-|catalog_pageAAAAAAAAAOAAAAAA|-|49178.54|-|0.00|-|-27661.86 +catalog channel|-|catalog_pageAAAAAAAAAOCAAAAA|-|9621.16|-|0.00|-|-4213.22 +catalog channel|-|catalog_pageAAAAAAAAAPAAAAAA|-|142216.57|-|0.00|-|21113.94 +catalog channel|-|catalog_pageAAAAAAAAAPBAAAAA|-|0.00|-|4876.83|-|-2903.30 +catalog channel|-|catalog_pageAAAAAAAAAPCAAAAA|-|17230.02|-|689.60|-|-1816.99 +catalog channel|-|catalog_pageAAAAAAAABAAAAAAA|-|0.00|-|1902.91|-|-1516.52 +catalog channel|-|catalog_pageAAAAAAAABABAAAAA|-|100018.02|-|0.00|-|-9370.45 +catalog channel|-|catalog_pageAAAAAAAABADAAAAA|-|115622.82|-|0.00|-|12126.64 +catalog channel|-|catalog_pageAAAAAAAABBAAAAAA|-|0.00|-|1786.21|-|-891.28 +catalog channel|-|catalog_pageAAAAAAAABBBAAAAA|-|76388.45|-|1153.20|-|2393.80 +catalog channel|-|catalog_pageAAAAAAAABBCAAAAA|-|0.00|-|831.90|-|-1077.03 +catalog channel|-|catalog_pageAAAAAAAABBDAAAAA|-|47684.96|-|0.00|-|-8371.50 +catalog channel|-|catalog_pageAAAAAAAABCAAAAAA|-|0.00|-|4371.58|-|-4222.90 +catalog channel|-|catalog_pageAAAAAAAABCBAAAAA|-|93859.97|-|1753.50|-|-1196.59 +catalog channel|-|catalog_pageAAAAAAAABCDAAAAA|-|73347.51|-|0.00|-|-11342.92 +catalog channel|-|catalog_pageAAAAAAAABDAAAAAA|-|0.00|-|3474.90|-|-1008.22 +catalog channel|-|catalog_pageAAAAAAAABDBAAAAA|-|42173.47|-|0.00|-|-26341.79 +catalog channel|-|catalog_pageAAAAAAAABDCAAAAA|-|0.00|-|305.46|-|-585.35 +catalog channel|-|catalog_pageAAAAAAAABDDAAAAA|-|83810.14|-|0.00|-|-1482.89 +catalog channel|-|catalog_pageAAAAAAAABEAAAAAA|-|0.00|-|347.39|-|-197.16 +catalog channel|-|catalog_pageAAAAAAAABEBAAAAA|-|97527.42|-|0.00|-|2333.17 +catalog channel|-|catalog_pageAAAAAAAABEDAAAAA|-|60506.22|-|0.00|-|-1212.87 +catalog channel|-|catalog_pageAAAAAAAABFAAAAAA|-|0.00|-|6528.33|-|-2187.98 +catalog channel|-|catalog_pageAAAAAAAABFDAAAAA|-|68737.67|-|0.00|-|-11721.44 +catalog channel|-|catalog_pageAAAAAAAABHAAAAAA|-|199767.35|-|1044.68|-|-6811.92 +catalog channel|-|catalog_pageAAAAAAAABIAAAAAA|-|205306.84|-|411.12|-|2555.23 +catalog channel|-|catalog_pageAAAAAAAABICAAAAA|-|0.00|-|68.02|-|-99.54 +catalog channel|-|catalog_pageAAAAAAAABJAAAAAA|-|187825.12|-|230.88|-|-21543.64 +catalog channel|-|catalog_pageAAAAAAAABJBAAAAA|-|0.00|-|727.89|-|-209.17 +catalog channel|-|catalog_pageAAAAAAAABJCAAAAA|-|14241.32|-|0.00|-|4283.83 +catalog channel|-|catalog_pageAAAAAAAABKAAAAAA|-|215820.15|-|1121.48|-|-7030.88 +catalog channel|-|catalog_pageAAAAAAAABKBAAAAA|-|0.00|-|3063.15|-|-3543.44 +catalog channel|-|catalog_pageAAAAAAAABKCAAAAA|-|1871.32|-|0.00|-|-2063.64 +catalog channel|-|catalog_pageAAAAAAAABLAAAAAA|-|171643.10|-|779.60|-|-15082.45 +catalog channel|-|catalog_pageAAAAAAAABLCAAAAA|-|8855.03|-|0.00|-|3013.67 +catalog channel|-|catalog_pageAAAAAAAABMAAAAAA|-|202476.57|-|1954.44|-|10034.15 +catalog channel|-|catalog_pageAAAAAAAABMCAAAAA|-|13837.48|-|0.00|-|6008.90 +catalog channel|-|catalog_pageAAAAAAAABNAAAAAA|-|197464.73|-|1397.02|-|-34977.14 +catalog channel|-|catalog_pageAAAAAAAABNCAAAAA|-|14801.05|-|0.00|-|-6910.60 +catalog channel|-|catalog_pageAAAAAAAABOAAAAAA|-|98871.66|-|0.00|-|-6493.20 +catalog channel|-|catalog_pageAAAAAAAABOCAAAAA|-|15216.80|-|0.00|-|-5722.57 +catalog channel|-|catalog_pageAAAAAAAABPAAAAAA|-|99238.38|-|100.20|-|-6353.28 +catalog channel|-|catalog_pageAAAAAAAABPCAAAAA|-|26783.54|-|0.00|-|4129.36 +catalog channel|-|catalog_pageAAAAAAAACAAAAAAA|-|0.00|-|8072.86|-|-3459.85 +catalog channel|-|catalog_pageAAAAAAAACABAAAAA|-|139938.46|-|0.00|-|8612.80 +catalog channel|-|catalog_pageAAAAAAAACADAAAAA|-|36613.51|-|0.00|-|-9705.44 +catalog channel|-|catalog_pageAAAAAAAACBAAAAAA|-|0.00|-|9373.27|-|-7982.93 +catalog channel|-|catalog_pageAAAAAAAACBBAAAAA|-|111531.45|-|55.38|-|-15921.86 +catalog channel|-|catalog_pageAAAAAAAACBDAAAAA|-|103545.90|-|0.00|-|-168.10 +catalog channel|-|catalog_pageAAAAAAAACCAAAAAA|-|0.00|-|3879.26|-|-1783.40 +catalog channel|-|catalog_pageAAAAAAAACCBAAAAA|-|78290.87|-|0.00|-|-12841.84 +catalog channel|-|catalog_pageAAAAAAAACCDAAAAA|-|37841.79|-|0.00|-|-26568.14 +catalog channel|-|catalog_pageAAAAAAAACDAAAAAA|-|0.00|-|923.32|-|-1166.75 +catalog channel|-|catalog_pageAAAAAAAACDBAAAAA|-|113988.86|-|212.31|-|-9856.53 +catalog channel|-|catalog_pageAAAAAAAACDDAAAAA|-|64516.71|-|0.00|-|-27577.04 +catalog channel|-|catalog_pageAAAAAAAACEAAAAAA|-|0.00|-|2955.12|-|-1700.94 +catalog channel|-|catalog_pageAAAAAAAACEBAAAAA|-|91555.04|-|0.00|-|-23392.02 +catalog channel|-|catalog_pageAAAAAAAACEDAAAAA|-|84993.13|-|0.00|-|-24259.30 +catalog channel|-|catalog_pageAAAAAAAACFAAAAAA|-|0.00|-|6507.25|-|-3250.26 +catalog channel|-|catalog_pageAAAAAAAACFDAAAAA|-|73749.97|-|0.00|-|1468.23 +catalog channel|-|catalog_pageAAAAAAAACGAAAAAA|-|0.00|-|8814.60|-|-3790.45 +catalog channel|-|catalog_pageAAAAAAAACHAAAAAA|-|157602.51|-|907.12|-|-50822.23 +catalog channel|-|catalog_pageAAAAAAAACHCAAAAA|-|0.00|-|59.58|-|-63.15 +catalog channel|-|catalog_pageAAAAAAAACIAAAAAA|-|132342.50|-|4686.24|-|-45195.01 +catalog channel|-|catalog_pageAAAAAAAACIBAAAAA|-|0.00|-|6029.56|-|-3462.80 +catalog channel|-|catalog_pageAAAAAAAACICAAAAA|-|0.00|-|530.41|-|-535.89 +catalog channel|-|catalog_pageAAAAAAAACJAAAAAA|-|193536.42|-|2487.88|-|-29573.52 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q50.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q50.out new file mode 100644 index 0000000000000..37321d0e56498 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q50.out @@ -0,0 +1,6 @@ +able|-|1|-|666|-|Cedar Spruce|-|Avenue|-|Suite 10|-|Midway|-|Williamson County|-|TN|-|31904|-|95|-|88|-|62|-|57|-|99 +ation|-|1|-|405|-|3rd |-|Wy|-|Suite 220|-|Fairview|-|Williamson County|-|TN|-|35709|-|115|-|95|-|52|-|59|-|116 +bar|-|1|-|71|-|Cedar |-|Blvd|-|Suite B|-|Midway|-|Williamson County|-|TN|-|31904|-|107|-|68|-|34|-|55|-|91 +eing|-|1|-|914|-|Lake 11th|-|Road|-|Suite T|-|Midway|-|Williamson County|-|TN|-|31904|-|124|-|89|-|47|-|49|-|105 +ese|-|1|-|120|-|6th |-|Lane|-|Suite B|-|Midway|-|Williamson County|-|TN|-|31904|-|111|-|83|-|64|-|51|-|95 +ought|-|1|-|32|-|3rd |-|Street|-|Suite 220|-|Midway|-|Williamson County|-|TN|-|31904|-|116|-|98|-|54|-|46|-|128 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q51.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q51.out new file mode 100644 index 0000000000000..86c50006c5252 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q51.out @@ -0,0 +1,100 @@ +9|-|2001-01-20|-|155.31|-|null|-|155.31|-|4.26 +9|-|2001-02-01|-|168.10|-|28.81|-|168.10|-|28.81 +9|-|2001-02-04|-|null|-|34.51|-|168.10|-|34.51 +9|-|2001-02-15|-|null|-|144.79|-|168.10|-|144.79 +9|-|2001-04-02|-|249.70|-|null|-|249.70|-|181.21 +9|-|2001-04-09|-|null|-|183.64|-|249.70|-|183.64 +9|-|2001-04-17|-|260.21|-|230.47|-|260.21|-|230.47 +29|-|2001-01-07|-|145.14|-|null|-|145.14|-|12.18 +29|-|2001-01-10|-|null|-|53.52|-|145.14|-|53.52 +29|-|2001-01-11|-|null|-|55.81|-|145.14|-|55.81 +29|-|2001-02-05|-|null|-|88.85|-|145.14|-|88.85 +29|-|2001-02-08|-|null|-|140.80|-|145.14|-|140.80 +29|-|2001-02-28|-|215.28|-|null|-|215.28|-|212.84 +29|-|2001-03-30|-|340.91|-|null|-|340.91|-|279.82 +29|-|2001-04-07|-|null|-|306.91|-|340.91|-|306.91 +29|-|2001-05-26|-|392.06|-|389.83|-|392.06|-|389.83 +29|-|2001-06-12|-|null|-|391.96|-|392.06|-|391.96 +29|-|2001-06-29|-|580.42|-|null|-|580.42|-|407.31 +29|-|2001-07-08|-|null|-|429.12|-|580.42|-|429.12 +29|-|2001-07-12|-|null|-|444.37|-|580.42|-|444.37 +29|-|2001-07-26|-|null|-|501.13|-|580.42|-|501.13 +29|-|2001-07-28|-|null|-|523.55|-|580.42|-|523.55 +29|-|2001-07-31|-|null|-|547.65|-|580.42|-|547.65 +29|-|2001-09-15|-|755.81|-|null|-|755.81|-|710.20 +29|-|2001-09-16|-|null|-|742.83|-|755.81|-|742.83 +31|-|2001-01-23|-|160.83|-|143.12|-|160.83|-|143.12 +31|-|2001-01-24|-|247.53|-|null|-|247.53|-|143.12 +31|-|2001-02-04|-|null|-|143.12|-|247.53|-|143.12 +31|-|2001-02-07|-|null|-|166.46|-|247.53|-|166.46 +31|-|2001-02-15|-|null|-|224.58|-|247.53|-|224.58 +31|-|2001-02-22|-|null|-|243.99|-|247.53|-|243.99 +31|-|2001-02-26|-|null|-|245.24|-|247.53|-|245.24 +33|-|2001-02-06|-|143.86|-|null|-|143.86|-|100.10 +33|-|2001-03-06|-|260.39|-|null|-|260.39|-|100.10 +33|-|2001-03-08|-|311.65|-|null|-|311.65|-|100.10 +33|-|2001-03-17|-|null|-|166.59|-|311.65|-|166.59 +33|-|2001-04-04|-|null|-|195.94|-|311.65|-|195.94 +33|-|2001-04-11|-|null|-|218.41|-|311.65|-|218.41 +33|-|2001-04-15|-|null|-|258.16|-|311.65|-|258.16 +33|-|2001-04-26|-|null|-|260.73|-|311.65|-|260.73 +35|-|2001-04-11|-|218.63|-|null|-|218.63|-|175.11 +35|-|2001-04-13|-|null|-|200.14|-|218.63|-|200.14 +35|-|2001-04-15|-|null|-|213.01|-|218.63|-|213.01 +35|-|2001-04-21|-|236.74|-|null|-|236.74|-|213.01 +35|-|2001-05-12|-|250.14|-|null|-|250.14|-|213.01 +35|-|2001-06-03|-|315.73|-|null|-|315.73|-|213.01 +35|-|2001-06-09|-|null|-|213.01|-|315.73|-|213.01 +35|-|2001-06-12|-|350.47|-|null|-|350.47|-|213.01 +35|-|2001-06-16|-|null|-|240.39|-|350.47|-|240.39 +35|-|2001-06-29|-|null|-|251.30|-|350.47|-|251.30 +35|-|2001-07-03|-|null|-|251.62|-|350.47|-|251.62 +35|-|2001-07-06|-|null|-|279.62|-|350.47|-|279.62 +35|-|2001-07-10|-|null|-|281.30|-|350.47|-|281.30 +35|-|2001-07-19|-|null|-|285.09|-|350.47|-|285.09 +35|-|2001-07-22|-|null|-|306.31|-|350.47|-|306.31 +35|-|2001-07-28|-|421.29|-|null|-|421.29|-|306.31 +35|-|2001-07-29|-|434.60|-|null|-|434.60|-|306.31 +37|-|2001-03-07|-|104.29|-|null|-|104.29|-|100.87 +47|-|2001-01-01|-|7.00|-|5.55|-|7.00|-|5.55 +47|-|2001-01-15|-|72.85|-|null|-|72.85|-|48.96 +47|-|2001-01-22|-|null|-|58.39|-|72.85|-|58.39 +47|-|2001-02-17|-|139.16|-|null|-|139.16|-|119.31 +49|-|2001-05-05|-|361.90|-|null|-|361.90|-|340.45 +49|-|2001-05-21|-|397.02|-|null|-|397.02|-|340.45 +49|-|2001-05-25|-|479.86|-|null|-|479.86|-|340.45 +49|-|2001-06-03|-|null|-|350.29|-|479.86|-|350.29 +49|-|2001-06-10|-|488.44|-|null|-|488.44|-|350.29 +49|-|2001-06-20|-|null|-|362.21|-|488.44|-|362.21 +49|-|2001-06-28|-|527.37|-|null|-|527.37|-|362.21 +49|-|2001-07-19|-|null|-|490.09|-|527.37|-|490.09 +49|-|2001-07-23|-|532.83|-|null|-|532.83|-|490.09 +49|-|2001-07-26|-|null|-|511.76|-|532.83|-|511.76 +49|-|2001-07-31|-|556.70|-|null|-|556.70|-|511.76 +51|-|2001-03-24|-|142.03|-|null|-|142.03|-|141.46 +51|-|2001-04-11|-|221.62|-|null|-|221.62|-|208.13 +53|-|2001-02-01|-|150.99|-|null|-|150.99|-|15.99 +53|-|2001-02-03|-|null|-|92.68|-|150.99|-|92.68 +53|-|2001-02-09|-|null|-|96.53|-|150.99|-|96.53 +53|-|2001-02-18|-|null|-|98.68|-|150.99|-|98.68 +53|-|2001-02-20|-|null|-|129.22|-|150.99|-|129.22 +57|-|2001-03-15|-|147.84|-|null|-|147.84|-|108.81 +65|-|2001-01-07|-|null|-|7.39|-|143.43|-|7.39 +65|-|2001-01-08|-|null|-|21.35|-|143.43|-|21.35 +65|-|2001-01-16|-|null|-|102.46|-|143.43|-|102.46 +67|-|2001-02-02|-|120.54|-|13.19|-|120.54|-|13.19 +67|-|2001-02-19|-|219.36|-|null|-|219.36|-|120.94 +67|-|2001-03-12|-|null|-|203.25|-|219.36|-|203.25 +67|-|2001-04-13|-|330.07|-|null|-|330.07|-|277.79 +67|-|2001-04-23|-|null|-|284.23|-|330.07|-|284.23 +67|-|2001-04-27|-|null|-|290.21|-|330.07|-|290.21 +67|-|2001-04-28|-|null|-|320.26|-|330.07|-|320.26 +69|-|2001-02-22|-|54.17|-|null|-|54.17|-|36.00 +69|-|2001-02-27|-|null|-|45.08|-|54.17|-|45.08 +73|-|2001-01-18|-|184.35|-|null|-|184.35|-|178.75 +73|-|2001-01-19|-|185.11|-|null|-|185.11|-|178.75 +73|-|2001-02-09|-|null|-|180.42|-|185.11|-|180.42 +75|-|2001-01-15|-|null|-|9.11|-|19.68|-|9.11 +75|-|2001-01-31|-|36.37|-|null|-|36.37|-|9.11 +75|-|2001-02-03|-|null|-|14.06|-|36.37|-|14.06 +83|-|2001-02-03|-|72.95|-|null|-|72.95|-|55.10 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q52.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q52.out new file mode 100644 index 0000000000000..6180ba77efada --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q52.out @@ -0,0 +1,100 @@ +1998|-|4001001|-|amalgedu pack #1|-|155686.21 +1998|-|2002002|-|importoimporto #2|-|129937.24 +1998|-|2001001|-|amalgimporto #1|-|94761.67 +1998|-|4003001|-|exportiedu pack #1|-|94373.50 +1998|-|4004002|-|edu packedu pack #2|-|83142.07 +1998|-|1004001|-|edu packamalg #1|-|81505.08 +1998|-|1003001|-|exportiamalg #1|-|78903.18 +1998|-|3004001|-|edu packexporti #1|-|76272.38 +1998|-|3001001|-|amalgexporti #1|-|69938.64 +1998|-|3003001|-|exportiexporti #1|-|69771.64 +1998|-|9013005|-|exportiunivamalg #5|-|62380.61 +1998|-|1002001|-|importoamalg #1|-|58070.15 +1998|-|3002001|-|importoexporti #1|-|54805.51 +1998|-|9016008|-|corpunivamalg #8|-|53549.53 +1998|-|9003003|-|exportimaxi #3|-|50534.38 +1998|-|2003001|-|exportiimporto #1|-|48482.00 +1998|-|2004002|-|edu packimporto #2|-|48454.39 +1998|-|4003002|-|exportiedu pack #2|-|47581.78 +1998|-|5003001|-|exportischolar #1|-|47172.95 +1998|-|1002002|-|importoamalg #2|-|44963.84 +1998|-|9004008|-|edu packmaxi #8|-|43104.50 +1998|-|7004005|-|edu packbrand #5|-|42362.40 +1998|-|6009008|-|maxicorp #8|-|40264.37 +1998|-|8012007|-|importomaxi #7|-|39431.90 +1998|-|5004001|-|edu packscholar #1|-|37322.66 +1998|-|5001002|-|amalgscholar #2|-|37170.51 +1998|-|7013007|-|exportinameless #7|-|36958.50 +1998|-|1001001|-|amalgamalg #1|-|35575.66 +1998|-|9012009|-|importounivamalg #9|-|35250.39 +1998|-|10011008|-|amalgamalgamalg #8|-|34985.42 +1998|-|7016008|-|corpnameless #8|-|33586.57 +1998|-|10016002|-|corpamalgamalg #2|-|32829.21 +1998|-|10001007|-|amalgunivamalg #7|-|32464.04 +1998|-|9008003|-|namelessmaxi #3|-|32227.15 +1998|-|6007007|-|brandcorp #7|-|31909.23 +1998|-|2001002|-|amalgimporto #2|-|31819.95 +1998|-|7005006|-|scholarbrand #6|-|31598.09 +1998|-|7008005|-|namelessbrand #5|-|31553.88 +1998|-|2004001|-|edu packimporto #1|-|31267.67 +1998|-|7002009|-|importobrand #9|-|30986.84 +1998|-|6015001|-|scholarbrand #1|-|30758.49 +1998|-|5002001|-|importoscholar #1|-|30075.30 +1998|-|2002001|-|importoimporto #1|-|29770.33 +1998|-|9001003|-|amalgmaxi #3|-|29758.57 +1998|-|10003008|-|exportiunivamalg #8|-|29662.50 +1998|-|9014011|-|edu packunivamalg #11|-|28220.36 +1998|-|10005002|-|scholarunivamalg #2|-|28205.35 +1998|-|7010009|-|univnameless #9|-|28047.70 +1998|-|9015011|-|scholarunivamalg #11|-|27652.68 +1998|-|7002002|-|importobrand #2|-|27534.41 +1998|-|8001007|-|amalgnameless #7|-|26955.55 +1998|-|10009010|-|maxiunivamalg #10|-|26491.53 +1998|-|7009003|-|maxibrand #3|-|26300.31 +1998|-|10016008|-|corpamalgamalg #8|-|26290.85 +1998|-|9014008|-|edu packunivamalg #8|-|25467.48 +1998|-|7014003|-|edu packnameless #3|-|25430.79 +1998|-|6012005|-|importobrand #5|-|25358.74 +1998|-|8005009|-|scholarnameless #9|-|25333.39 +1998|-|7006007|-|corpbrand #7|-|24753.31 +1998|-|8010002|-|univmaxi #2|-|24519.08 +1998|-|8009005|-|maxinameless #5|-|24104.60 +1998|-|8002007|-|importonameless #7|-|23814.74 +1998|-|6015003|-|scholarbrand #3|-|23660.82 +1998|-|9016011|-|corpunivamalg #11|-|23266.60 +1998|-|10009016|-|maxiunivamalg #16|-|23200.15 +1998|-|1003002|-|exportiamalg #2|-|23151.94 +1998|-|8008006|-|namelessnameless #6|-|23139.08 +1998|-|8014006|-|edu packmaxi #6|-|22467.16 +1998|-|2003002|-|exportiimporto #2|-|21967.08 +1998|-|7014001|-|edu packnameless #1|-|19786.74 +1998|-|3004002|-|edu packexporti #2|-|19520.18 +1998|-|6003004|-|exporticorp #4|-|19172.39 +1998|-|4001002|-|amalgedu pack #2|-|19108.88 +1998|-|8006010|-|corpnameless #10|-|18894.78 +1998|-|8004002|-|edu packnameless #2|-|18825.13 +1998|-|null|-|brandmaxi #11|-|18566.28 +1998|-|10001003|-|amalgunivamalg #3|-|18509.00 +1998|-|3003002|-|exportiexporti #2|-|17977.67 +1998|-|10015013|-|scholaramalgamalg #13|-|17963.02 +1998|-|7011010|-|amalgnameless #10|-|17331.98 +1998|-|8002008|-|importonameless #8|-|17265.44 +1998|-|9007003|-|brandmaxi #3|-|16856.77 +1998|-|8013007|-|exportimaxi #7|-|16681.68 +1998|-|10008007|-|namelessunivamalg #7|-|16619.36 +1998|-|10008006|-|namelessunivamalg #6|-|15464.99 +1998|-|9010002|-|univunivamalg #2|-|15012.19 +1998|-|6002008|-|importocorp #8|-|14957.17 +1998|-|7015004|-|scholarnameless #4|-|14892.35 +1998|-|6005004|-|scholarcorp #4|-|14651.55 +1998|-|4002002|-|importoedu pack #2|-|14385.24 +1998|-|10014001|-|edu packamalgamalg #1|-|14169.02 +1998|-|7006005|-|corpbrand #5|-|14007.58 +1998|-|4002001|-|importoedu pack #1|-|13960.11 +1998|-|8001009|-|amalgnameless #9|-|13937.58 +1998|-|7006001|-|corpbrand #1|-|13609.70 +1998|-|5002002|-|importoscholar #2|-|13376.67 +1998|-|10013006|-|exportiamalgamalg #6|-|13084.91 +1998|-|7015007|-|scholarnameless #7|-|12755.60 +1998|-|7013002|-|exportinameless #2|-|12749.50 +1998|-|9009009|-|maximaxi #9|-|12269.83 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q53.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q53.out new file mode 100644 index 0000000000000..3e8b5128bad8b --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q53.out @@ -0,0 +1,28 @@ +343|-|185.90|-|386.040000 +343|-|468.04|-|386.040000 +343|-|502.98|-|386.040000 +329|-|131.95|-|437.095000 +329|-|370.54|-|437.095000 +329|-|371.53|-|437.095000 +329|-|874.36|-|437.095000 +146|-|114.71|-|506.495000 +146|-|336.40|-|506.495000 +146|-|701.73|-|506.495000 +146|-|873.14|-|506.495000 +158|-|268.65|-|509.482500 +158|-|300.17|-|509.482500 +158|-|961.47|-|509.482500 +897|-|189.60|-|517.932500 +897|-|329.55|-|517.932500 +897|-|983.87|-|517.932500 +403|-|322.06|-|553.342500 +403|-|427.04|-|553.342500 +403|-|616.15|-|553.342500 +403|-|848.12|-|553.342500 +325|-|148.23|-|558.417500 +325|-|413.61|-|558.417500 +325|-|1115.15|-|558.417500 +157|-|186.14|-|628.195000 +157|-|485.63|-|628.195000 +157|-|789.63|-|628.195000 +157|-|1051.38|-|628.195000 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q54.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q54.out new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q55.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q55.out new file mode 100644 index 0000000000000..3e24fb901fd0e --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q55.out @@ -0,0 +1,64 @@ +4002002|-|importoedu pack #2|-|70581.20 +5002002|-|importoscholar #2|-|48328.02 +5004002|-|edu packscholar #2|-|47992.88 +3004002|-|edu packexporti #2|-|46362.74 +7004006|-|edu packbrand #6|-|45894.97 +7011008|-|amalgnameless #8|-|38460.97 +5003002|-|exportischolar #2|-|34565.48 +1004001|-|importoimporto #2|-|33914.63 +3001002|-|amalgexporti #2|-|33824.80 +6007002|-|brandcorp #2|-|33524.83 +10008017|-|namelessunivamalg #17|-|33396.85 +5001002|-|amalgscholar #2|-|33029.62 +9003005|-|amalgscholar #2|-|32430.92 +7006008|-|corpbrand #8|-|32147.92 +7015005|-|corpnameless #6|-|31636.00 +4003001|-|edu packunivamalg #3|-|31450.86 +9010008|-|univunivamalg #8|-|31396.61 +1003002|-|exportiamalg #2|-|30446.34 +10005002|-|scholarunivamalg #2|-|27640.58 +6012004|-|importobrand #4|-|27280.66 +1002002|-|importoamalg #2|-|24920.28 +4001002|-|amalgedu pack #2|-|24500.09 +6007008|-|brandcorp #8|-|22887.48 +9001003|-|edu packunivamalg #17|-|22705.40 +3003002|-|exportiexporti #2|-|22416.81 +9003009|-|edu packexporti #2|-|22317.44 +10002009|-|importounivamalg #9|-|22253.84 +6008008|-|namelesscorp #8|-|22153.03 +4002001|-|edu packscholar #2|-|21917.85 +3004001|-|importoamalgamalg #6|-|21435.72 +8015004|-|scholarmaxi #4|-|21212.48 +7005002|-|scholarbrand #2|-|20510.90 +6011002|-|amalgbrand #2|-|20375.30 +4004002|-|edu packedu pack #2|-|19996.53 +6006008|-|corpcorp #8|-|19386.10 +2003002|-|exportiimporto #2|-|18428.83 +10016015|-|edu packscholar #2|-|18311.09 +8016001|-|exportiunivamalg #4|-|18289.18 +10008008|-|corpmaxi #8|-|18039.51 +4003001|-|exportiedu pack #2|-|17957.11 +5002001|-|amalgimporto #2|-|17336.39 +9002012|-|importomaxi #12|-|17241.83 +10009011|-|maxiunivamalg #11|-|17166.47 +2002001|-|exportimaxi #2|-|17007.26 +7011002|-|amalgnameless #2|-|16568.23 +7009003|-|exportibrand #4|-|15204.41 +9004005|-|importocorp #6|-|14944.83 +4002001|-|edu packexporti #2|-|14586.84 +2003001|-|importoexporti #2|-|14196.15 +6013004|-|exportibrand #4|-|14172.08 +7006006|-|corpbrand #6|-|13813.47 +2004002|-|edu packimporto #2|-|13813.35 +5001001|-|importounivamalg #12|-|13319.74 +5001001|-|importoimporto #2|-|11784.68 +7002006|-|importobrand #6|-|11455.66 +4004001|-|amalgamalg #2|-|10270.01 +2001002|-|amalgimporto #2|-|9918.21 +7006002|-|corpbrand #2|-|9802.07 +5004001|-|exportiexporti #2|-|8995.68 +9008011|-|scholarbrand #8|-|8760.27 +4002001|-|exportibrand #4|-|8050.13 +6011006|-|amalgbrand #6|-|7649.83 +5003001|-|edu packimporto #2|-|5187.82 +8011007|-|scholarnameless #8|-|4524.54 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q56.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q56.out new file mode 100644 index 0000000000000..4625979a558f3 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q56.out @@ -0,0 +1,65 @@ +AAAAAAAAOJIBAAAA|-|null +AAAAAAAAJABAAAAA|-|7.31 +AAAAAAAAMPBEAAAA|-|29.07 +AAAAAAAAGGLDAAAA|-|34.65 +AAAAAAAAAFGCAAAA|-|42.90 +AAAAAAAAKFEAAAAA|-|51.24 +AAAAAAAAGNGBAAAA|-|56.65 +AAAAAAAAKBOAAAAA|-|59.90 +AAAAAAAAKDPDAAAA|-|70.30 +AAAAAAAAACEEAAAA|-|74.52 +AAAAAAAAKJFCAAAA|-|121.72 +AAAAAAAAOHAEAAAA|-|161.10 +AAAAAAAAALIDAAAA|-|167.09 +AAAAAAAAIKOCAAAA|-|167.32 +AAAAAAAAACGDAAAA|-|188.24 +AAAAAAAAPBECAAAA|-|209.76 +AAAAAAAAENGCAAAA|-|256.05 +AAAAAAAAEMPDAAAA|-|332.12 +AAAAAAAAELFCAAAA|-|353.28 +AAAAAAAAMLHCAAAA|-|371.91 +AAAAAAAAIMKBAAAA|-|419.75 +AAAAAAAAOIKCAAAA|-|467.36 +AAAAAAAAGOPAAAAA|-|473.48 +AAAAAAAAIEHBAAAA|-|565.76 +AAAAAAAAEJICAAAA|-|576.63 +AAAAAAAAMJMBAAAA|-|578.55 +AAAAAAAAOHLAAAAA|-|627.64 +AAAAAAAABNLAAAAA|-|640.70 +AAAAAAAAFHNDAAAA|-|666.36 +AAAAAAAAAEAAAAAA|-|680.19 +AAAAAAAAGJEDAAAA|-|756.00 +AAAAAAAAAAAEAAAA|-|831.60 +AAAAAAAAKCBBAAAA|-|949.92 +AAAAAAAAEHGDAAAA|-|1092.03 +AAAAAAAACBNBAAAA|-|1220.10 +AAAAAAAAIHNDAAAA|-|1316.70 +AAAAAAAAEKACAAAA|-|1326.08 +AAAAAAAAEAGAAAAA|-|1489.66 +AAAAAAAAHHODAAAA|-|1586.88 +AAAAAAAALCKCAAAA|-|1613.52 +AAAAAAAACMHCAAAA|-|1747.85 +AAAAAAAACKCAAAAA|-|1823.54 +AAAAAAAACDOAAAAA|-|1885.14 +AAAAAAAAKINBAAAA|-|2243.58 +AAAAAAAAKGPDAAAA|-|2371.60 +AAAAAAAAAKICAAAA|-|2442.00 +AAAAAAAAMKFCAAAA|-|2521.60 +AAAAAAAAKAGDAAAA|-|2664.24 +AAAAAAAABECAAAAA|-|2758.50 +AAAAAAAAAHBDAAAA|-|3171.08 +AAAAAAAAKNLAAAAA|-|3618.74 +AAAAAAAAEHGCAAAA|-|3661.68 +AAAAAAAAKNHCAAAA|-|3685.92 +AAAAAAAAOJMDAAAA|-|3690.96 +AAAAAAAAJBMDAAAA|-|3712.80 +AAAAAAAACBFCAAAA|-|3893.10 +AAAAAAAAIPODAAAA|-|4599.52 +AAAAAAAAGAOAAAAA|-|5369.76 +AAAAAAAAAECCAAAA|-|5508.07 +AAAAAAAAEIKDAAAA|-|7007.00 +AAAAAAAAEFOCAAAA|-|8215.00 +AAAAAAAANOCCAAAA|-|8825.06 +AAAAAAAAEELDAAAA|-|9503.04 +AAAAAAAAOLADAAAA|-|10083.70 +AAAAAAAAAOCAAAAA|-|13104.00 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q57.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q57.out new file mode 100644 index 0000000000000..00ddfc40858b9 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q57.out @@ -0,0 +1,100 @@ +North Midwest|-|2000|-|6|-|7540.041667|-|2913.59|-|4112.86|-|4924.65 +Mid Atlantic|-|2000|-|2|-|7339.538333|-|2878.69|-|4995.35|-|5273.46 +North Midwest|-|2000|-|2|-|7004.711667|-|2699.08|-|4527.45|-|4592.05 +Mid Atlantic|-|2000|-|2|-|6343.135000|-|2095.41|-|4099.40|-|3566.84 +North Midwest|-|2000|-|2|-|7026.670833|-|2813.11|-|3650.23|-|5709.46 +North Midwest|-|2000|-|4|-|6696.070833|-|2513.78|-|5409.00|-|3867.45 +NY Metro|-|2000|-|5|-|7253.723333|-|3132.14|-|3931.72|-|3301.26 +NY Metro|-|2000|-|4|-|6744.325000|-|2673.58|-|4785.00|-|3556.93 +NY Metro|-|2000|-|2|-|6981.530833|-|2930.59|-|4243.76|-|4050.71 +NY Metro|-|2000|-|3|-|7224.300833|-|3249.40|-|3685.71|-|4578.61 +NY Metro|-|2000|-|7|-|6492.070000|-|2518.94|-|4592.66|-|8971.88 +NY Metro|-|2000|-|1|-|6881.483333|-|2927.83|-|5675.31|-|4539.31 +NY Metro|-|2000|-|6|-|7253.723333|-|3301.26|-|3132.14|-|4883.55 +Mid Atlantic|-|2000|-|6|-|6893.255833|-|2941.23|-|4784.45|-|3572.63 +NY Metro|-|2000|-|6|-|7358.410000|-|3414.44|-|3691.97|-|4162.30 +Mid Atlantic|-|2000|-|1|-|6893.255833|-|2950.58|-|6065.70|-|2996.98 +Mid Atlantic|-|2000|-|2|-|6893.255833|-|2996.98|-|2950.58|-|5350.13 +Mid Atlantic|-|2000|-|3|-|7720.312500|-|3828.44|-|4679.40|-|5630.00 +North Midwest|-|2000|-|2|-|6710.040833|-|2840.99|-|5009.92|-|3418.70 +Mid Atlantic|-|2000|-|2|-|6071.416667|-|2204.19|-|3495.48|-|3556.90 +North Midwest|-|2000|-|5|-|7004.711667|-|3142.35|-|3858.75|-|4311.71 +Mid Atlantic|-|2000|-|7|-|7002.492500|-|3160.74|-|4074.41|-|9724.91 +North Midwest|-|2000|-|3|-|5813.148333|-|1974.68|-|3207.95|-|4027.72 +Mid Atlantic|-|2000|-|1|-|7720.312500|-|3883.08|-|7620.37|-|4679.40 +NY Metro|-|2000|-|5|-|6720.810833|-|2903.61|-|3862.49|-|4774.07 +NY Metro|-|2000|-|2|-|6492.070000|-|2696.88|-|4225.98|-|3173.94 +Mid Atlantic|-|2000|-|6|-|7339.538333|-|3566.23|-|4234.44|-|3934.62 +NY Metro|-|2000|-|2|-|6051.293333|-|2281.72|-|4907.22|-|3640.57 +Mid Atlantic|-|2000|-|6|-|7030.703333|-|3285.05|-|3765.40|-|5818.98 +Mid Atlantic|-|2000|-|3|-|7030.703333|-|3293.32|-|3898.59|-|4009.86 +NY Metro|-|2000|-|1|-|7253.723333|-|3517.39|-|8487.32|-|3790.85 +Mid Atlantic|-|2000|-|6|-|7087.135833|-|3374.15|-|5121.75|-|3810.67 +NY Metro|-|2000|-|6|-|6881.483333|-|3171.81|-|4534.04|-|4339.34 +North Midwest|-|2000|-|7|-|6960.408333|-|3267.01|-|3377.83|-|10197.33 +NY Metro|-|2000|-|3|-|5750.611667|-|2082.21|-|3210.99|-|3085.30 +NY Metro|-|2000|-|5|-|7358.410000|-|3691.97|-|3723.37|-|3414.44 +NY Metro|-|2000|-|3|-|6615.182500|-|2953.27|-|3674.68|-|4483.84 +NY Metro|-|2000|-|5|-|6981.530833|-|3320.90|-|3569.01|-|3461.93 +Mid Atlantic|-|2000|-|1|-|6240.258333|-|2579.80|-|5868.06|-|2906.60 +Mid Atlantic|-|2000|-|1|-|7087.135833|-|3444.15|-|7916.96|-|4191.21 +NY Metro|-|2000|-|4|-|7358.410000|-|3723.37|-|4129.57|-|3691.97 +Mid Atlantic|-|2000|-|2|-|7002.492500|-|3394.95|-|3699.53|-|4018.95 +North Midwest|-|2000|-|6|-|6960.408333|-|3377.83|-|4794.43|-|3267.01 +North Midwest|-|2000|-|3|-|6960.408333|-|3390.54|-|5092.83|-|3895.71 +North Midwest|-|2000|-|6|-|6696.070833|-|3127.16|-|3867.45|-|5204.55 +North Midwest|-|2000|-|4|-|6994.239167|-|3453.18|-|3858.90|-|5492.95 +NY Metro|-|2000|-|2|-|7224.300833|-|3685.71|-|5035.81|-|3249.40 +Mid Atlantic|-|2000|-|2|-|7552.955000|-|4020.40|-|4347.21|-|5258.19 +NY Metro|-|2000|-|6|-|6981.530833|-|3461.93|-|3320.90|-|5717.78 +North Midwest|-|2000|-|2|-|6617.974167|-|3098.44|-|6327.37|-|3436.01 +Mid Atlantic|-|2000|-|4|-|7552.955000|-|4039.04|-|5258.19|-|4723.40 +Mid Atlantic|-|2000|-|2|-|6860.780833|-|3355.30|-|4303.95|-|4029.41 +North Midwest|-|2000|-|6|-|5903.985833|-|2413.34|-|3630.21|-|4308.57 +North Midwest|-|2000|-|2|-|6994.239167|-|3504.29|-|4338.50|-|3858.90 +North Midwest|-|2000|-|2|-|7283.571667|-|3799.83|-|4072.53|-|4797.84 +North Midwest|-|2000|-|6|-|7283.571667|-|3800.38|-|4038.37|-|4277.28 +North Midwest|-|2000|-|2|-|6696.070833|-|3213.10|-|4079.53|-|5409.00 +NY Metro|-|2000|-|7|-|6051.293333|-|2573.19|-|3657.13|-|7454.61 +NY Metro|-|2000|-|2|-|7253.723333|-|3790.85|-|3517.39|-|4956.15 +NY Metro|-|2000|-|7|-|6744.325000|-|3291.30|-|4411.33|-|8318.36 +Mid Atlantic|-|2000|-|4|-|6842.243333|-|3399.22|-|4565.17|-|3522.39 +Mid Atlantic|-|2000|-|6|-|6733.326667|-|3302.02|-|4727.42|-|3557.87 +North Midwest|-|2000|-|2|-|6569.235833|-|3138.41|-|4361.29|-|3369.95 +North Midwest|-|2000|-|6|-|6569.235833|-|3140.16|-|3673.68|-|4149.05 +Mid Atlantic|-|2000|-|7|-|6842.243333|-|3414.01|-|4384.70|-|9227.26 +NY Metro|-|2000|-|4|-|6492.070000|-|3064.85|-|3173.94|-|3806.65 +North Midwest|-|2000|-|5|-|7540.041667|-|4112.86|-|4743.01|-|2913.59 +Mid Atlantic|-|2000|-|5|-|5974.075000|-|2550.05|-|3413.51|-|4048.56 +North Midwest|-|2000|-|1|-|7540.041667|-|4117.09|-|7812.62|-|4248.30 +Mid Atlantic|-|2000|-|5|-|7002.492500|-|3579.96|-|3769.21|-|4074.41 +NY Metro|-|2000|-|4|-|6981.530833|-|3569.01|-|4050.71|-|3320.90 +Mid Atlantic|-|2000|-|7|-|7339.538333|-|3934.62|-|3566.23|-|9732.20 +North Midwest|-|2000|-|3|-|6140.421667|-|2736.27|-|3289.70|-|4023.37 +North Midwest|-|2000|-|1|-|6140.421667|-|2737.47|-|6825.41|-|3289.70 +NY Metro|-|2000|-|1|-|6517.910833|-|3130.06|-|7884.35|-|4021.67 +North Midwest|-|2000|-|1|-|7026.670833|-|3650.23|-|6591.72|-|2813.11 +North Midwest|-|2000|-|2|-|5974.261667|-|2608.94|-|3668.87|-|3189.67 +Mid Atlantic|-|2000|-|1|-|5942.458333|-|2590.20|-|5420.18|-|2947.52 +North Midwest|-|2000|-|5|-|6440.657500|-|3098.39|-|3677.41|-|4144.50 +Mid Atlantic|-|2000|-|6|-|7452.599167|-|4111.83|-|4972.98|-|4693.63 +NY Metro|-|2000|-|2|-|6720.810833|-|3383.65|-|3819.22|-|3698.50 +Mid Atlantic|-|2000|-|2|-|6240.258333|-|2906.60|-|2579.80|-|3087.37 +North Midwest|-|2000|-|7|-|7026.670833|-|3694.51|-|4052.95|-|9653.07 +NY Metro|-|2000|-|4|-|7253.723333|-|3931.72|-|4956.15|-|3132.14 +Mid Atlantic|-|2000|-|7|-|6893.255833|-|3572.63|-|2941.23|-|8669.10 +Mid Atlantic|-|2000|-|5|-|6842.243333|-|3522.39|-|3399.22|-|4384.70 +NY Metro|-|2000|-|1|-|6194.430000|-|2875.26|-|5715.85|-|3567.37 +NY Metro|-|2000|-|3|-|6492.070000|-|3173.94|-|2696.88|-|3064.85 +NY Metro|-|2000|-|4|-|6088.185000|-|2778.49|-|4538.13|-|2909.82 +Mid Atlantic|-|2000|-|1|-|7002.492500|-|3699.53|-|9039.34|-|3394.95 +North Midwest|-|2000|-|2|-|7540.041667|-|4248.30|-|4117.09|-|4469.26 +North Midwest|-|2000|-|3|-|6710.040833|-|3418.70|-|2840.99|-|4327.77 +NY Metro|-|2000|-|6|-|7224.300833|-|3943.85|-|4700.30|-|4100.21 +North Midwest|-|2000|-|4|-|7283.571667|-|4003.64|-|4797.84|-|4038.37 +Mid Atlantic|-|2000|-|7|-|7087.135833|-|3810.67|-|3374.15|-|10014.53 +Mid Atlantic|-|2000|-|5|-|7030.703333|-|3765.40|-|4009.86|-|3285.05 +North Midwest|-|2000|-|5|-|7283.571667|-|4038.37|-|4003.64|-|3800.38 +Mid Atlantic|-|2000|-|4|-|7002.492500|-|3769.21|-|4018.95|-|3579.96 +NY Metro|-|2000|-|3|-|7358.410000|-|4129.57|-|4432.72|-|3723.37 +NY Metro|-|2000|-|2|-|5829.242500|-|2601.99|-|3419.86|-|3466.67 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q58.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q58.out new file mode 100644 index 0000000000000..31759fa82a52e --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q58.out @@ -0,0 +1 @@ +AAAAAAAABACEAAAA|-|1052.98|-|95.6347464664227|-|1149.40|-|104.3918949918386|-|1100.75|-|99.9733586325616|-|1101.043333 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q59.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q59.out new file mode 100644 index 0000000000000..0e87837ad6d72 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q59.out @@ -0,0 +1,100 @@ +able|-|AAAAAAAACAAAAAAA|-|5153|-|0.85258009819791069911|-|0.70232253233628879673|-|0.60684644064287463090|-|0.92520689728650984870|-|1.40653609635118149438|-|0.94880088261344032509|-|1.18409607533865281128 +able|-|AAAAAAAACAAAAAAA|-|5153|-|0.85258009819791069911|-|0.70232253233628879673|-|0.60684644064287463090|-|0.92520689728650984870|-|1.40653609635118149438|-|0.94880088261344032509|-|1.18409607533865281128 +able|-|AAAAAAAACAAAAAAA|-|5153|-|0.85258009819791069911|-|0.70232253233628879673|-|0.60684644064287463090|-|0.92520689728650984870|-|1.40653609635118149438|-|0.94880088261344032509|-|1.18409607533865281128 +able|-|AAAAAAAACAAAAAAA|-|5153|-|0.85258009819791069911|-|0.70232253233628879673|-|0.60684644064287463090|-|0.92520689728650984870|-|1.40653609635118149438|-|0.94880088261344032509|-|1.18409607533865281128 +able|-|AAAAAAAACAAAAAAA|-|5153|-|0.85258009819791069911|-|0.70232253233628879673|-|0.60684644064287463090|-|0.92520689728650984870|-|1.40653609635118149438|-|0.94880088261344032509|-|1.18409607533865281128 +able|-|AAAAAAAACAAAAAAA|-|5153|-|0.85258009819791069911|-|0.70232253233628879673|-|0.60684644064287463090|-|0.92520689728650984870|-|1.40653609635118149438|-|0.94880088261344032509|-|1.18409607533865281128 +able|-|AAAAAAAACAAAAAAA|-|5153|-|0.85258009819791069911|-|0.70232253233628879673|-|0.60684644064287463090|-|0.92520689728650984870|-|1.40653609635118149438|-|0.94880088261344032509|-|1.18409607533865281128 +able|-|AAAAAAAACAAAAAAA|-|5153|-|0.85258009819791069911|-|0.70232253233628879673|-|0.60684644064287463090|-|0.92520689728650984870|-|1.40653609635118149438|-|0.94880088261344032509|-|1.18409607533865281128 +able|-|AAAAAAAACAAAAAAA|-|5153|-|0.85258009819791069911|-|0.70232253233628879673|-|0.60684644064287463090|-|0.92520689728650984870|-|1.40653609635118149438|-|0.94880088261344032509|-|1.18409607533865281128 +able|-|AAAAAAAACAAAAAAA|-|5153|-|0.85258009819791069911|-|0.70232253233628879673|-|0.60684644064287463090|-|0.92520689728650984870|-|1.40653609635118149438|-|0.94880088261344032509|-|1.18409607533865281128 +able|-|AAAAAAAACAAAAAAA|-|5153|-|0.85258009819791069911|-|0.70232253233628879673|-|0.60684644064287463090|-|0.92520689728650984870|-|1.40653609635118149438|-|0.94880088261344032509|-|1.18409607533865281128 +able|-|AAAAAAAACAAAAAAA|-|5153|-|0.85258009819791069911|-|0.70232253233628879673|-|0.60684644064287463090|-|0.92520689728650984870|-|1.40653609635118149438|-|0.94880088261344032509|-|1.18409607533865281128 +able|-|AAAAAAAACAAAAAAA|-|5153|-|0.85258009819791069911|-|0.70232253233628879673|-|0.60684644064287463090|-|0.92520689728650984870|-|1.40653609635118149438|-|0.94880088261344032509|-|1.18409607533865281128 +able|-|AAAAAAAACAAAAAAA|-|5153|-|0.85258009819791069911|-|0.70232253233628879673|-|0.60684644064287463090|-|0.92520689728650984870|-|1.40653609635118149438|-|0.94880088261344032509|-|1.18409607533865281128 +able|-|AAAAAAAACAAAAAAA|-|5153|-|0.85258009819791069911|-|0.70232253233628879673|-|0.60684644064287463090|-|0.92520689728650984870|-|1.40653609635118149438|-|0.94880088261344032509|-|1.18409607533865281128 +able|-|AAAAAAAACAAAAAAA|-|5153|-|0.85258009819791069911|-|0.70232253233628879673|-|0.60684644064287463090|-|0.92520689728650984870|-|1.40653609635118149438|-|0.94880088261344032509|-|1.18409607533865281128 +able|-|AAAAAAAACAAAAAAA|-|5153|-|0.85258009819791069911|-|0.70232253233628879673|-|0.60684644064287463090|-|0.92520689728650984870|-|1.40653609635118149438|-|0.94880088261344032509|-|1.18409607533865281128 +able|-|AAAAAAAACAAAAAAA|-|5153|-|0.85258009819791069911|-|0.70232253233628879673|-|0.60684644064287463090|-|0.92520689728650984870|-|1.40653609635118149438|-|0.94880088261344032509|-|1.18409607533865281128 +able|-|AAAAAAAACAAAAAAA|-|5153|-|0.85258009819791069911|-|0.70232253233628879673|-|0.60684644064287463090|-|0.92520689728650984870|-|1.40653609635118149438|-|0.94880088261344032509|-|1.18409607533865281128 +able|-|AAAAAAAACAAAAAAA|-|5153|-|0.85258009819791069911|-|0.70232253233628879673|-|0.60684644064287463090|-|0.92520689728650984870|-|1.40653609635118149438|-|0.94880088261344032509|-|1.18409607533865281128 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5154|-|0.95054032293376631849|-|0.99286174702132159655|-|1.10098009354850121358|-|1.19229479709088514265|-|1.00350007078692223029|-|0.85707390357360491846|-|0.79951622485642345885 +able|-|AAAAAAAACAAAAAAA|-|5155|-|0.64626281855132430156|-|0.67157650884997526995|-|1.14430993265047531662|-|0.81503656279021138151|-|1.17882752490371974247|-|0.77307439600301142974|-|1.03602456656643848762 +able|-|AAAAAAAACAAAAAAA|-|5155|-|0.64626281855132430156|-|0.67157650884997526995|-|1.14430993265047531662|-|0.81503656279021138151|-|1.17882752490371974247|-|0.77307439600301142974|-|1.03602456656643848762 +able|-|AAAAAAAACAAAAAAA|-|5155|-|0.64626281855132430156|-|0.67157650884997526995|-|1.14430993265047531662|-|0.81503656279021138151|-|1.17882752490371974247|-|0.77307439600301142974|-|1.03602456656643848762 +able|-|AAAAAAAACAAAAAAA|-|5155|-|0.64626281855132430156|-|0.67157650884997526995|-|1.14430993265047531662|-|0.81503656279021138151|-|1.17882752490371974247|-|0.77307439600301142974|-|1.03602456656643848762 +able|-|AAAAAAAACAAAAAAA|-|5155|-|0.64626281855132430156|-|0.67157650884997526995|-|1.14430993265047531662|-|0.81503656279021138151|-|1.17882752490371974247|-|0.77307439600301142974|-|1.03602456656643848762 +able|-|AAAAAAAACAAAAAAA|-|5155|-|0.64626281855132430156|-|0.67157650884997526995|-|1.14430993265047531662|-|0.81503656279021138151|-|1.17882752490371974247|-|0.77307439600301142974|-|1.03602456656643848762 +able|-|AAAAAAAACAAAAAAA|-|5155|-|0.64626281855132430156|-|0.67157650884997526995|-|1.14430993265047531662|-|0.81503656279021138151|-|1.17882752490371974247|-|0.77307439600301142974|-|1.03602456656643848762 +able|-|AAAAAAAACAAAAAAA|-|5155|-|0.64626281855132430156|-|0.67157650884997526995|-|1.14430993265047531662|-|0.81503656279021138151|-|1.17882752490371974247|-|0.77307439600301142974|-|1.03602456656643848762 +able|-|AAAAAAAACAAAAAAA|-|5155|-|0.64626281855132430156|-|0.67157650884997526995|-|1.14430993265047531662|-|0.81503656279021138151|-|1.17882752490371974247|-|0.77307439600301142974|-|1.03602456656643848762 +able|-|AAAAAAAACAAAAAAA|-|5155|-|0.64626281855132430156|-|0.67157650884997526995|-|1.14430993265047531662|-|0.81503656279021138151|-|1.17882752490371974247|-|0.77307439600301142974|-|1.03602456656643848762 +able|-|AAAAAAAACAAAAAAA|-|5155|-|0.64626281855132430156|-|0.67157650884997526995|-|1.14430993265047531662|-|0.81503656279021138151|-|1.17882752490371974247|-|0.77307439600301142974|-|1.03602456656643848762 +able|-|AAAAAAAACAAAAAAA|-|5155|-|0.64626281855132430156|-|0.67157650884997526995|-|1.14430993265047531662|-|0.81503656279021138151|-|1.17882752490371974247|-|0.77307439600301142974|-|1.03602456656643848762 +able|-|AAAAAAAACAAAAAAA|-|5155|-|0.64626281855132430156|-|0.67157650884997526995|-|1.14430993265047531662|-|0.81503656279021138151|-|1.17882752490371974247|-|0.77307439600301142974|-|1.03602456656643848762 +able|-|AAAAAAAACAAAAAAA|-|5155|-|0.64626281855132430156|-|0.67157650884997526995|-|1.14430993265047531662|-|0.81503656279021138151|-|1.17882752490371974247|-|0.77307439600301142974|-|1.03602456656643848762 +able|-|AAAAAAAACAAAAAAA|-|5155|-|0.64626281855132430156|-|0.67157650884997526995|-|1.14430993265047531662|-|0.81503656279021138151|-|1.17882752490371974247|-|0.77307439600301142974|-|1.03602456656643848762 +able|-|AAAAAAAACAAAAAAA|-|5155|-|0.64626281855132430156|-|0.67157650884997526995|-|1.14430993265047531662|-|0.81503656279021138151|-|1.17882752490371974247|-|0.77307439600301142974|-|1.03602456656643848762 +able|-|AAAAAAAACAAAAAAA|-|5155|-|0.64626281855132430156|-|0.67157650884997526995|-|1.14430993265047531662|-|0.81503656279021138151|-|1.17882752490371974247|-|0.77307439600301142974|-|1.03602456656643848762 +able|-|AAAAAAAACAAAAAAA|-|5155|-|0.64626281855132430156|-|0.67157650884997526995|-|1.14430993265047531662|-|0.81503656279021138151|-|1.17882752490371974247|-|0.77307439600301142974|-|1.03602456656643848762 +able|-|AAAAAAAACAAAAAAA|-|5155|-|0.64626281855132430156|-|0.67157650884997526995|-|1.14430993265047531662|-|0.81503656279021138151|-|1.17882752490371974247|-|0.77307439600301142974|-|1.03602456656643848762 +able|-|AAAAAAAACAAAAAAA|-|5155|-|0.64626281855132430156|-|0.67157650884997526995|-|1.14430993265047531662|-|0.81503656279021138151|-|1.17882752490371974247|-|0.77307439600301142974|-|1.03602456656643848762 +able|-|AAAAAAAACAAAAAAA|-|5155|-|0.64626281855132430156|-|0.67157650884997526995|-|1.14430993265047531662|-|0.81503656279021138151|-|1.17882752490371974247|-|0.77307439600301142974|-|1.03602456656643848762 +able|-|AAAAAAAACAAAAAAA|-|5155|-|0.64626281855132430156|-|0.67157650884997526995|-|1.14430993265047531662|-|0.81503656279021138151|-|1.17882752490371974247|-|0.77307439600301142974|-|1.03602456656643848762 +able|-|AAAAAAAACAAAAAAA|-|5155|-|0.64626281855132430156|-|0.67157650884997526995|-|1.14430993265047531662|-|0.81503656279021138151|-|1.17882752490371974247|-|0.77307439600301142974|-|1.03602456656643848762 +able|-|AAAAAAAACAAAAAAA|-|5155|-|0.64626281855132430156|-|0.67157650884997526995|-|1.14430993265047531662|-|0.81503656279021138151|-|1.17882752490371974247|-|0.77307439600301142974|-|1.03602456656643848762 +able|-|AAAAAAAACAAAAAAA|-|5155|-|0.64626281855132430156|-|0.67157650884997526995|-|1.14430993265047531662|-|0.81503656279021138151|-|1.17882752490371974247|-|0.77307439600301142974|-|1.03602456656643848762 +able|-|AAAAAAAACAAAAAAA|-|5155|-|0.64626281855132430156|-|0.67157650884997526995|-|1.14430993265047531662|-|0.81503656279021138151|-|1.17882752490371974247|-|0.77307439600301142974|-|1.03602456656643848762 +able|-|AAAAAAAACAAAAAAA|-|5155|-|0.64626281855132430156|-|0.67157650884997526995|-|1.14430993265047531662|-|0.81503656279021138151|-|1.17882752490371974247|-|0.77307439600301142974|-|1.03602456656643848762 +able|-|AAAAAAAACAAAAAAA|-|5155|-|0.64626281855132430156|-|0.67157650884997526995|-|1.14430993265047531662|-|0.81503656279021138151|-|1.17882752490371974247|-|0.77307439600301142974|-|1.03602456656643848762 +able|-|AAAAAAAACAAAAAAA|-|5155|-|0.64626281855132430156|-|0.67157650884997526995|-|1.14430993265047531662|-|0.81503656279021138151|-|1.17882752490371974247|-|0.77307439600301142974|-|1.03602456656643848762 +able|-|AAAAAAAACAAAAAAA|-|5155|-|0.64626281855132430156|-|0.67157650884997526995|-|1.14430993265047531662|-|0.81503656279021138151|-|1.17882752490371974247|-|0.77307439600301142974|-|1.03602456656643848762 +able|-|AAAAAAAACAAAAAAA|-|5155|-|0.64626281855132430156|-|0.67157650884997526995|-|1.14430993265047531662|-|0.81503656279021138151|-|1.17882752490371974247|-|0.77307439600301142974|-|1.03602456656643848762 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q6.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q6.out new file mode 100644 index 0000000000000..610fa3b366a7f --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q6.out @@ -0,0 +1,46 @@ +ME|-|12 +NJ|-|12 +NV|-|12 +WY|-|13 +AZ|-|14 +NH|-|14 +VT|-|18 +AK|-|21 +MD|-|21 +NM|-|21 +ID|-|22 +UT|-|22 +OR|-|25 +PA|-|29 +SC|-|29 +WA|-|32 +MT|-|35 +CO|-|38 +ND|-|39 +WV|-|39 +CA|-|42 +LA|-|43 +WI|-|47 +NY|-|48 +AL|-|49 +FL|-|49 +OK|-|52 +MN|-|57 +AR|-|59 +MS|-|59 +IN|-|60 +MI|-|62 +SD|-|64 +MO|-|67 +NC|-|67 +null|-|70 +IA|-|73 +NE|-|73 +IL|-|78 +KS|-|80 +TN|-|83 +VA|-|84 +GA|-|86 +OH|-|88 +KY|-|102 +TX|-|175 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q60.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q60.out new file mode 100644 index 0000000000000..aaa9bfee172b5 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q60.out @@ -0,0 +1,100 @@ +AAAAAAAAAABDAAAA|-|17046.09 +AAAAAAAAAABEAAAA|-|4270.80 +AAAAAAAAAACDAAAA|-|8280.97 +AAAAAAAAAADCAAAA|-|17355.96 +AAAAAAAAAADEAAAA|-|3754.88 +AAAAAAAAAAGEAAAA|-|8540.15 +AAAAAAAAAAKDAAAA|-|9640.88 +AAAAAAAAAALDAAAA|-|6029.84 +AAAAAAAAAAMBAAAA|-|8450.05 +AAAAAAAAAAPCAAAA|-|13866.12 +AAAAAAAAABBDAAAA|-|13120.11 +AAAAAAAAABDBAAAA|-|11402.88 +AAAAAAAAABDEAAAA|-|16043.36 +AAAAAAAAABEAAAAA|-|21973.36 +AAAAAAAAABFBAAAA|-|21548.90 +AAAAAAAAABGEAAAA|-|14492.92 +AAAAAAAAABHAAAAA|-|7317.06 +AAAAAAAAABICAAAA|-|6916.50 +AAAAAAAAABJDAAAA|-|6883.22 +AAAAAAAAABKCAAAA|-|3008.27 +AAAAAAAAABLBAAAA|-|8224.68 +AAAAAAAAABNAAAAA|-|19092.76 +AAAAAAAAABPBAAAA|-|8669.61 +AAAAAAAAACCBAAAA|-|6181.22 +AAAAAAAAACCDAAAA|-|13009.12 +AAAAAAAAACDAAAAA|-|15301.17 +AAAAAAAAACECAAAA|-|8744.48 +AAAAAAAAACFBAAAA|-|4400.78 +AAAAAAAAACGCAAAA|-|11551.64 +AAAAAAAAACMDAAAA|-|7613.89 +AAAAAAAAACODAAAA|-|3223.68 +AAAAAAAAADBBAAAA|-|3690.36 +AAAAAAAAADBDAAAA|-|7456.00 +AAAAAAAAADCAAAAA|-|7734.38 +AAAAAAAAADDBAAAA|-|7562.72 +AAAAAAAAADEAAAAA|-|14571.03 +AAAAAAAAADGBAAAA|-|4945.24 +AAAAAAAAADICAAAA|-|20305.14 +AAAAAAAAADKBAAAA|-|19732.15 +AAAAAAAAADOCAAAA|-|5439.94 +AAAAAAAAAEBAAAAA|-|319.06 +AAAAAAAAAECBAAAA|-|2255.22 +AAAAAAAAAEDEAAAA|-|7071.85 +AAAAAAAAAEGAAAAA|-|8379.17 +AAAAAAAAAEHAAAAA|-|2850.47 +AAAAAAAAAEHCAAAA|-|8871.65 +AAAAAAAAAEIBAAAA|-|20264.60 +AAAAAAAAAEICAAAA|-|11582.35 +AAAAAAAAAEJAAAAA|-|5762.67 +AAAAAAAAAEKAAAAA|-|6430.82 +AAAAAAAAAEKCAAAA|-|5003.88 +AAAAAAAAAELCAAAA|-|5541.40 +AAAAAAAAAEMAAAAA|-|2545.10 +AAAAAAAAAEPBAAAA|-|19231.08 +AAAAAAAAAFAAAAAA|-|13055.23 +AAAAAAAAAFACAAAA|-|4274.62 +AAAAAAAAAFDCAAAA|-|16849.67 +AAAAAAAAAFECAAAA|-|5116.55 +AAAAAAAAAFHBAAAA|-|7755.39 +AAAAAAAAAFJCAAAA|-|3459.37 +AAAAAAAAAFKCAAAA|-|7238.28 +AAAAAAAAAFLAAAAA|-|203.74 +AAAAAAAAAFLBAAAA|-|1842.68 +AAAAAAAAAFOAAAAA|-|2701.04 +AAAAAAAAAGACAAAA|-|4498.76 +AAAAAAAAAGBAAAAA|-|18387.08 +AAAAAAAAAGBDAAAA|-|14356.71 +AAAAAAAAAGBEAAAA|-|5442.51 +AAAAAAAAAGCAAAAA|-|13556.11 +AAAAAAAAAGDCAAAA|-|38181.51 +AAAAAAAAAGEDAAAA|-|5009.89 +AAAAAAAAAGFCAAAA|-|4012.15 +AAAAAAAAAGGBAAAA|-|13416.16 +AAAAAAAAAGIAAAAA|-|5058.59 +AAAAAAAAAGJBAAAA|-|12866.68 +AAAAAAAAAGLCAAAA|-|14755.55 +AAAAAAAAAGLDAAAA|-|2567.46 +AAAAAAAAAGMBAAAA|-|18715.12 +AAAAAAAAAGOCAAAA|-|4091.65 +AAAAAAAAAGPBAAAA|-|11145.96 +AAAAAAAAAGPCAAAA|-|14940.66 +AAAAAAAAAHCEAAAA|-|4529.42 +AAAAAAAAAHDAAAAA|-|3391.15 +AAAAAAAAAHDDAAAA|-|13291.17 +AAAAAAAAAHDEAAAA|-|24968.72 +AAAAAAAAAHFEAAAA|-|15523.64 +AAAAAAAAAHGDAAAA|-|3244.28 +AAAAAAAAAHHAAAAA|-|8493.33 +AAAAAAAAAHJBAAAA|-|2773.75 +AAAAAAAAAHLBAAAA|-|7551.80 +AAAAAAAAAHLCAAAA|-|7142.93 +AAAAAAAAAHMDAAAA|-|12601.89 +AAAAAAAAAIAAAAAA|-|878.31 +AAAAAAAAAIACAAAA|-|2353.59 +AAAAAAAAAICAAAAA|-|5875.99 +AAAAAAAAAICBAAAA|-|7441.99 +AAAAAAAAAIFBAAAA|-|9004.45 +AAAAAAAAAIFDAAAA|-|30059.60 +AAAAAAAAAIFEAAAA|-|39533.77 +AAAAAAAAAIHBAAAA|-|12730.44 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q61.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q61.out new file mode 100644 index 0000000000000..c96d70a322435 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q61.out @@ -0,0 +1 @@ +null|-|null|-|null diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q62.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q62.out new file mode 100644 index 0000000000000..b34312e954eb9 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q62.out @@ -0,0 +1,100 @@ +Just good amou|-|EXPRESS|-|site_0|-|291|-|258|-|260|-|278|-|0 +Just good amou|-|EXPRESS|-|site_1|-|325|-|287|-|295|-|300|-|0 +Just good amou|-|EXPRESS|-|site_2|-|302|-|313|-|273|-|304|-|0 +Just good amou|-|EXPRESS|-|site_3|-|283|-|301|-|319|-|284|-|0 +Just good amou|-|EXPRESS|-|site_4|-|275|-|247|-|270|-|271|-|0 +Just good amou|-|LIBRARY|-|site_0|-|209|-|220|-|196|-|197|-|0 +Just good amou|-|LIBRARY|-|site_1|-|162|-|185|-|170|-|172|-|0 +Just good amou|-|LIBRARY|-|site_2|-|221|-|212|-|204|-|196|-|0 +Just good amou|-|LIBRARY|-|site_3|-|226|-|232|-|221|-|233|-|0 +Just good amou|-|LIBRARY|-|site_4|-|211|-|250|-|252|-|235|-|0 +Just good amou|-|NEXT DAY|-|site_0|-|319|-|297|-|317|-|299|-|0 +Just good amou|-|NEXT DAY|-|site_1|-|302|-|291|-|288|-|300|-|0 +Just good amou|-|NEXT DAY|-|site_2|-|295|-|319|-|328|-|304|-|0 +Just good amou|-|NEXT DAY|-|site_3|-|285|-|262|-|274|-|266|-|0 +Just good amou|-|NEXT DAY|-|site_4|-|279|-|273|-|253|-|284|-|0 +Just good amou|-|OVERNIGHT|-|site_0|-|246|-|244|-|232|-|244|-|0 +Just good amou|-|OVERNIGHT|-|site_1|-|221|-|236|-|276|-|238|-|0 +Just good amou|-|OVERNIGHT|-|site_2|-|200|-|189|-|220|-|218|-|0 +Just good amou|-|OVERNIGHT|-|site_3|-|176|-|194|-|184|-|172|-|0 +Just good amou|-|OVERNIGHT|-|site_4|-|233|-|229|-|219|-|215|-|0 +Just good amou|-|REGULAR|-|site_0|-|190|-|163|-|198|-|214|-|0 +Just good amou|-|REGULAR|-|site_1|-|211|-|186|-|221|-|171|-|0 +Just good amou|-|REGULAR|-|site_2|-|269|-|236|-|235|-|215|-|0 +Just good amou|-|REGULAR|-|site_3|-|231|-|253|-|246|-|253|-|0 +Just good amou|-|REGULAR|-|site_4|-|225|-|200|-|196|-|218|-|0 +Just good amou|-|TWO DAY|-|site_0|-|214|-|238|-|247|-|234|-|0 +Just good amou|-|TWO DAY|-|site_1|-|222|-|190|-|218|-|195|-|0 +Just good amou|-|TWO DAY|-|site_2|-|184|-|192|-|189|-|175|-|0 +Just good amou|-|TWO DAY|-|site_3|-|220|-|223|-|214|-|181|-|0 +Just good amou|-|TWO DAY|-|site_4|-|260|-|250|-|249|-|242|-|0 +Matches produce|-|EXPRESS|-|site_0|-|278|-|316|-|281|-|294|-|0 +Matches produce|-|EXPRESS|-|site_1|-|329|-|315|-|285|-|279|-|0 +Matches produce|-|EXPRESS|-|site_2|-|269|-|310|-|279|-|309|-|0 +Matches produce|-|EXPRESS|-|site_3|-|293|-|241|-|282|-|271|-|0 +Matches produce|-|EXPRESS|-|site_4|-|291|-|280|-|270|-|291|-|0 +Matches produce|-|LIBRARY|-|site_0|-|190|-|190|-|188|-|209|-|0 +Matches produce|-|LIBRARY|-|site_1|-|217|-|199|-|212|-|217|-|0 +Matches produce|-|LIBRARY|-|site_2|-|238|-|233|-|243|-|242|-|0 +Matches produce|-|LIBRARY|-|site_3|-|245|-|251|-|236|-|240|-|0 +Matches produce|-|LIBRARY|-|site_4|-|215|-|199|-|220|-|231|-|0 +Matches produce|-|NEXT DAY|-|site_0|-|295|-|318|-|317|-|271|-|0 +Matches produce|-|NEXT DAY|-|site_1|-|271|-|313|-|258|-|308|-|0 +Matches produce|-|NEXT DAY|-|site_2|-|278|-|256|-|278|-|263|-|0 +Matches produce|-|NEXT DAY|-|site_3|-|240|-|272|-|279|-|275|-|0 +Matches produce|-|NEXT DAY|-|site_4|-|291|-|317|-|285|-|325|-|0 +Matches produce|-|OVERNIGHT|-|site_0|-|231|-|274|-|251|-|233|-|0 +Matches produce|-|OVERNIGHT|-|site_1|-|222|-|224|-|210|-|196|-|0 +Matches produce|-|OVERNIGHT|-|site_2|-|152|-|179|-|178|-|174|-|0 +Matches produce|-|OVERNIGHT|-|site_3|-|214|-|179|-|210|-|208|-|0 +Matches produce|-|OVERNIGHT|-|site_4|-|262|-|242|-|232|-|227|-|0 +Matches produce|-|REGULAR|-|site_0|-|221|-|232|-|183|-|185|-|0 +Matches produce|-|REGULAR|-|site_1|-|225|-|216|-|276|-|201|-|0 +Matches produce|-|REGULAR|-|site_2|-|232|-|222|-|250|-|237|-|0 +Matches produce|-|REGULAR|-|site_3|-|207|-|211|-|215|-|211|-|0 +Matches produce|-|REGULAR|-|site_4|-|175|-|177|-|209|-|173|-|0 +Matches produce|-|TWO DAY|-|site_0|-|206|-|194|-|212|-|215|-|0 +Matches produce|-|TWO DAY|-|site_1|-|196|-|191|-|176|-|149|-|0 +Matches produce|-|TWO DAY|-|site_2|-|202|-|218|-|184|-|216|-|0 +Matches produce|-|TWO DAY|-|site_3|-|252|-|243|-|245|-|219|-|0 +Matches produce|-|TWO DAY|-|site_4|-|240|-|253|-|262|-|253|-|0 +Operations|-|EXPRESS|-|site_0|-|273|-|256|-|245|-|299|-|0 +Operations|-|EXPRESS|-|site_1|-|277|-|253|-|256|-|286|-|0 +Operations|-|EXPRESS|-|site_2|-|292|-|281|-|288|-|276|-|0 +Operations|-|EXPRESS|-|site_3|-|315|-|267|-|308|-|313|-|0 +Operations|-|EXPRESS|-|site_4|-|301|-|290|-|277|-|285|-|0 +Operations|-|LIBRARY|-|site_0|-|264|-|279|-|232|-|240|-|0 +Operations|-|LIBRARY|-|site_1|-|193|-|207|-|202|-|195|-|0 +Operations|-|LIBRARY|-|site_2|-|200|-|160|-|185|-|165|-|0 +Operations|-|LIBRARY|-|site_3|-|224|-|229|-|191|-|207|-|0 +Operations|-|LIBRARY|-|site_4|-|214|-|246|-|250|-|239|-|0 +Operations|-|NEXT DAY|-|site_0|-|281|-|276|-|255|-|281|-|0 +Operations|-|NEXT DAY|-|site_1|-|286|-|274|-|305|-|337|-|0 +Operations|-|NEXT DAY|-|site_2|-|269|-|283|-|292|-|309|-|0 +Operations|-|NEXT DAY|-|site_3|-|289|-|298|-|258|-|275|-|0 +Operations|-|NEXT DAY|-|site_4|-|261|-|258|-|230|-|262|-|0 +Operations|-|OVERNIGHT|-|site_0|-|208|-|213|-|203|-|239|-|0 +Operations|-|OVERNIGHT|-|site_1|-|226|-|233|-|211|-|231|-|0 +Operations|-|OVERNIGHT|-|site_2|-|243|-|237|-|252|-|227|-|0 +Operations|-|OVERNIGHT|-|site_3|-|192|-|215|-|213|-|214|-|0 +Operations|-|OVERNIGHT|-|site_4|-|206|-|150|-|171|-|160|-|0 +Operations|-|REGULAR|-|site_0|-|220|-|233|-|226|-|203|-|0 +Operations|-|REGULAR|-|site_1|-|184|-|192|-|174|-|162|-|0 +Operations|-|REGULAR|-|site_2|-|216|-|215|-|215|-|227|-|0 +Operations|-|REGULAR|-|site_3|-|257|-|239|-|230|-|252|-|0 +Operations|-|REGULAR|-|site_4|-|269|-|232|-|223|-|227|-|0 +Operations|-|TWO DAY|-|site_0|-|234|-|268|-|239|-|218|-|0 +Operations|-|TWO DAY|-|site_1|-|263|-|243|-|217|-|230|-|0 +Operations|-|TWO DAY|-|site_2|-|217|-|232|-|210|-|223|-|0 +Operations|-|TWO DAY|-|site_3|-|179|-|165|-|164|-|187|-|0 +Operations|-|TWO DAY|-|site_4|-|234|-|214|-|222|-|203|-|0 +Selective,|-|EXPRESS|-|site_0|-|292|-|285|-|294|-|272|-|0 +Selective,|-|EXPRESS|-|site_1|-|290|-|266|-|319|-|327|-|0 +Selective,|-|EXPRESS|-|site_2|-|277|-|275|-|221|-|291|-|0 +Selective,|-|EXPRESS|-|site_3|-|265|-|231|-|280|-|284|-|0 +Selective,|-|EXPRESS|-|site_4|-|289|-|329|-|303|-|298|-|0 +Selective,|-|LIBRARY|-|site_0|-|203|-|202|-|216|-|203|-|0 +Selective,|-|LIBRARY|-|site_1|-|240|-|260|-|235|-|261|-|0 +Selective,|-|LIBRARY|-|site_2|-|240|-|220|-|231|-|218|-|0 +Selective,|-|LIBRARY|-|site_3|-|214|-|218|-|214|-|210|-|0 +Selective,|-|LIBRARY|-|site_4|-|196|-|169|-|165|-|179|-|0 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q63.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q63.out new file mode 100644 index 0000000000000..f08b972f78511 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q63.out @@ -0,0 +1,82 @@ +6|-|87.84|-|258.966250 +6|-|123.94|-|258.966250 +6|-|189.60|-|258.966250 +6|-|205.61|-|258.966250 +6|-|320.74|-|258.966250 +6|-|330.91|-|258.966250 +6|-|332.22|-|258.966250 +6|-|480.87|-|258.966250 +10|-|16.70|-|145.698333 +10|-|27.88|-|145.698333 +10|-|36.99|-|145.698333 +10|-|40.69|-|145.698333 +10|-|63.38|-|145.698333 +10|-|92.68|-|145.698333 +10|-|101.17|-|145.698333 +10|-|117.01|-|145.698333 +10|-|232.38|-|145.698333 +10|-|262.15|-|145.698333 +10|-|373.02|-|145.698333 +10|-|384.33|-|145.698333 +40|-|11.41|-|209.398333 +40|-|41.94|-|209.398333 +40|-|42.73|-|209.398333 +40|-|104.48|-|209.398333 +40|-|132.79|-|209.398333 +40|-|134.29|-|209.398333 +40|-|287.14|-|209.398333 +40|-|338.42|-|209.398333 +40|-|392.90|-|209.398333 +40|-|407.01|-|209.398333 +40|-|408.55|-|209.398333 +42|-|6.86|-|128.680000 +42|-|9.08|-|128.680000 +42|-|15.85|-|128.680000 +42|-|64.79|-|128.680000 +42|-|68.35|-|128.680000 +42|-|70.24|-|128.680000 +42|-|105.26|-|128.680000 +42|-|185.95|-|128.680000 +42|-|248.65|-|128.680000 +42|-|275.23|-|128.680000 +42|-|374.03|-|128.680000 +50|-|57.71|-|201.215455 +50|-|116.62|-|201.215455 +50|-|119.15|-|201.215455 +50|-|141.51|-|201.215455 +50|-|166.14|-|201.215455 +50|-|236.62|-|201.215455 +50|-|251.41|-|201.215455 +50|-|260.00|-|201.215455 +50|-|450.17|-|201.215455 +55|-|34.53|-|185.266364 +55|-|43.55|-|185.266364 +55|-|51.04|-|185.266364 +55|-|106.24|-|185.266364 +55|-|162.31|-|185.266364 +55|-|283.87|-|185.266364 +55|-|310.80|-|185.266364 +55|-|312.17|-|185.266364 +55|-|365.43|-|185.266364 +59|-|30.65|-|203.060909 +59|-|32.57|-|203.060909 +59|-|63.67|-|203.060909 +59|-|73.17|-|203.060909 +59|-|109.55|-|203.060909 +59|-|117.58|-|203.060909 +59|-|133.44|-|203.060909 +59|-|255.69|-|203.060909 +59|-|336.01|-|203.060909 +59|-|411.75|-|203.060909 +59|-|669.59|-|203.060909 +72|-|2.55|-|168.831667 +72|-|24.65|-|168.831667 +72|-|44.14|-|168.831667 +72|-|76.46|-|168.831667 +72|-|122.73|-|168.831667 +72|-|200.98|-|168.831667 +72|-|217.85|-|168.831667 +72|-|270.96|-|168.831667 +72|-|282.90|-|168.831667 +72|-|284.51|-|168.831667 +72|-|317.67|-|168.831667 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q64.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q64.out new file mode 100644 index 0000000000000..23ca13e5a838f --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q64.out @@ -0,0 +1,5 @@ +antibarprianti|-|able|-|31904|-|null|-|2nd |-|null|-|null|-|374|-|Spring |-|Shady Grove|-|52812|-|2000|-|1|-|50.41|-|78.63|-|664.22|-|9.16|-|10.07|-|0.00|-|2001|-|1 +antibarprianti|-|able|-|31904|-|319|-|11th |-|Fairfield|-|86192|-|931|-|Central |-|Farmington|-|49145|-|2000|-|1|-|91.81|-|112.92|-|0.00|-|9.16|-|10.07|-|0.00|-|2001|-|1 +antibarprianti|-|ese|-|31904|-|null|-|null|-|Valley View|-|55124|-|797|-|Third East|-|Lebanon|-|22898|-|2000|-|1|-|79.31|-|140.37|-|0.00|-|50.28|-|78.93|-|0.00|-|2001|-|1 +anticallybarpri|-|eing|-|31904|-|531|-|Railroad Sunset|-|Deerfield|-|69840|-|828|-|Walnut 10th|-|Center Hill|-|96144|-|2000|-|1|-|77.57|-|89.98|-|0.00|-|88.82|-|173.19|-|0.00|-|2001|-|1 +anticallybarpri|-|ought|-|31904|-|8|-|13th |-|Lakeside|-|59532|-|171|-|Elevnth |-|Greenwood|-|58828|-|2000|-|1|-|63.78|-|77.81|-|0.00|-|83.97|-|147.78|-|0.00|-|2001|-|1 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q65.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q65.out new file mode 100644 index 0000000000000..34f579c0177e1 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q65.out @@ -0,0 +1,100 @@ +able|-|Areas may prevent able, tempora|-|27.19|-|3.77|-|3.24|-|amalgbrand #6 +able|-|C|-|17.40|-|4.53|-|4.20|-|corpunivamalg #12 +able|-|Conditions should not help images. Now ancient points might argue even; rivers can establish perhaps subsequent children; rooms could make. Inc, red problems can shake at least. Points must not apprec|-|25.90|-|13.38|-|0.87|-|scholarunivamalg #4 +able|-|Confidential, full terms make incorrectly elderly, real methods; teeth slip much today unknown conditions. Years shall not undermine occasionally local, industrial lips; restrictions beat most things|-|9.94|-|0.35|-|0.97|-|maxibrand #8 +able|-|Convenient, regular men might come always along the units. So chronic pp. add otherwise sons; virtually dear sales put traditionally. Subsequent, tired associations will know much ec|-|27.74|-|4.00|-|2.08|-|amalgscholar #2 +able|-|Golden, royal counties work then jobs. Patterns would take efficiently compl|-|32.43|-|42.09|-|19.36|-|importomaxi #6 +able|-|Large, available days should result most into a stages. Still modern secrets will not read. Big, extra levels think local sounds. Difficult, various things bet for insta|-|33.74|-|8.53|-|4.43|-|exporticorp #6 +able|-|Main, powerful kilometres should like certainly political directors. Left families go tall, clear organizatio|-|35.03|-|0.18|-|0.13|-|amalgnameless #8 +able|-|Metres buy per a men; grey, large events might embark then participan|-|36.17|-|4.53|-|2.63|-|exportinameless #10 +able|-|Much american sites will reach elaborate, able consequences. Overall, limited reasons grasp so because of the cells. Much great defences can care small crit|-|33.76|-|5.97|-|2.04|-|importoscholar #2 +able|-|New councils shall make at a tanks. Creative expenses shall put suddenly low emiss|-|22.55|-|1.19|-|0.45|-|edu packscholar #2 +able|-|Old characteristics work as numbers; servants ought to visit in the numbers. Eyes wou|-|19.56|-|1.87|-|2.48|-|edu packnameless #4 +able|-|Ordinary managers will remember. Bad, central words coul|-|35.43|-|6.93|-|3.18|-|amalgmaxi #6 +able|-|Other affairs may not change then logical metals. Simply primary walls cannot constru|-|25.59|-|71.47|-|5.87|-|edu packimporto #2 +able|-|Results sound as great, good women. Enough popular users cannot go only thus other answers|-|21.41|-|30.43|-|22.82|-|importoimporto #2 +able|-|Terrible, beautiful results can apply more too darling schemes. Obvious versions can maintain too unknown, social homes; important, soviet material|-|26.04|-|1.32|-|0.51|-|maximaxi #10 +able|-|True, old matters must sleep most almost single councils. Hands would answer by a appearances. However great individuals mean premier days; similarly human r|-|34.81|-|6.22|-|2.13|-|exportiexporti #2 +ation|-|null|-|16.48|-|3.41|-|2.57|-|importoscholar #2 +ation|-|Also horrible goals shall prot|-|24.44|-|1.25|-|0.66|-|amalgimporto #2 +ation|-|Applications|-|31.56|-|3.83|-|2.33|-|exportiedu pack #2 +ation|-|Conditions explain tightly real, necessary feet. Narrowly good parents make. Current programmes see rules. Provincial hours used to get so words. New, import|-|28.35|-|3.53|-|2.22|-|amalgunivamalg #6 +ation|-|Countries ensure in a christians. Expected ends used to run high holes. Broad, unlike women specify therefore. Lit|-|26.53|-|1.63|-|0.84|-|corpbrand #2 +ation|-|Effects give too. More personal options must appreciate therefore single, effective studies. Se|-|8.95|-|0.97|-|0.83|-|importoscholar #2 +ation|-|Eyes will fix. Old months teach too discussions. Left areas ask down the possi|-|5.10|-|6.34|-|6.34|-|exportiexporti #2 +ation|-|Favourably present words can make small, economic cases. About eastern years give less views. Only possible workers may accept even requirements. Negative goods imp|-|34.45|-|4.00|-|3.32|-|scholarunivamalg #2 +ation|-|Funny rooms develop. Usually clear men form only formal services; due men implement. Extreme, particular goals get fresh projec|-|33.33|-|8.48|-|6.02|-|amalgamalg #2 +ation|-|Home available features need with a questions. Hard waters can operate still more content bands. Organic, large ideas contribute points. Difficult, right produc|-|20.46|-|2.47|-|1.92|-|scholarmaxi #8 +ation|-|Increases fit thus initiatives; personal, upper connections may not convey only; quite convincing mountains interfere currently. Resour|-|7.93|-|91.76|-|6.89|-|edu packexporti #2 +ation|-|Individuals assess medical, happy arms. Units could not see from a circumstances. Slightly mysterious benefits feature. Difficul|-|22.85|-|2.18|-|1.54|-|edu packunivamalg #4 +ation|-|International issues put incidentally less weak techniques. Re|-|14.43|-|4.25|-|3.57|-|importoedu pack #2 +ation|-|Lights migrate never local, traditional nights; occupations ought to emerge for example old, true powers. Neve|-|27.68|-|4.06|-|2.07|-|importoamalg #2 +ation|-|Minutes put vertical, southern police. Previously arab neighbours can show here legal goals. Perhaps magnificent failures share warm police. Other, international facilities mean never; modern|-|33.30|-|1.30|-|0.88|-|exportiedu pack #2 +ation|-|More reliable officers will not come definite, practical options. Complete examples will think already prime events. Formal defendants cling better white teeth. Min|-|3.66|-|0.56|-|0.91|-|amalgedu pack #2 +ation|-|Normal forces o|-|35.16|-|6.32|-|5.62|-|edu packedu pack #2 +ation|-|Often other ideas must not understand possible, static groups. Late|-|21.21|-|2.23|-|3.57|-|importounivamalg #6 +ation|-|Particular, tiny eyes ought to see right pains. Lights assess. Boards shall face. Controversial, urban days could provide further forward difficult|-|30.30|-|4.83|-|3.18|-|namelessbrand #2 +ation|-|Personal relations make pretty, new doubts. Dramatic criteria see between a services; minister|-|24.42|-|9.90|-|4.44|-|importoscholar #2 +ation|-|Poor thought|-|7.93|-|2.13|-|0.70|-|edu packedu pack #2 +ation|-|Random influences can force low for a subjects; young days will not travel historic hills. Unlikely, huge guards arrest now by th|-|18.53|-|6.24|-|2.42|-|exportiamalg #2 +ation|-|Relative risks could speak well numbers. Clean adva|-|34.11|-|3.97|-|2.42|-|edu packbrand #4 +ation|-|So natural rea|-|31.16|-|3.48|-|3.33|-|scholarunivamalg #8 +ation|-|Students try things. Colleagues may not announce sometimes indian changes. Necessary, national hours shall look psychologically very available authorities; jobs wou|-|24.79|-|2.67|-|0.80|-|exportiamalg #2 +ation|-|Therefore local years get then central, royal years. Decisive techniques find so environmental, sound trees; demands provide earlier just interested fem|-|33.40|-|4.74|-|1.94|-|brandcorp #6 +ation|-|Years will succeed officials. Together sig|-|18.44|-|6.56|-|1.18|-|importoedu pack #2 +bar|-|About other improvements comfort realistic|-|36.26|-|0.25|-|0.12|-|exporticorp #2 +bar|-|Employers perform times; military, other copies will like moving, splendid years. Monetary, tory knees sort against the issues. Well little services could affect event|-|35.59|-|1.76|-|1.54|-|edu packedu pack #2 +bar|-|Fine, following authorities transform quickly. Options would not sink better precisely substantial communications; weeks might stimulate now; then major ma|-|11.51|-|4.37|-|3.45|-|exportiexporti #2 +bar|-|Foreign eyes must lead earlier. British, dead weeks should not become carefully chemical efforts.|-|24.48|-|6.95|-|4.80|-|scholarbrand #2 +bar|-|Formal, waiting students lead so crazy customers. Hostile levels believe underway hot, moving times. Minutes would not feel so main players; a|-|8.27|-|0.59|-|0.40|-|maximaxi #4 +bar|-|Hum|-|28.18|-|8.18|-|4.74|-|exportiedu pack #2 +bar|-|Important, good cases beat variable, boring tools. Normally particular weeks see high, british things. Women encourage positively. Standards would understand instan|-|36.18|-|4.34|-|2.56|-|exportiimporto #2 +bar|-|Individuals shall make whole sites. Short-term eyes receive more broad, secondary parents; men like once happy, regular applications. Distant guests used to describe. Different, single|-|10.72|-|5.34|-|4.05|-|edu packexporti #2 +bar|-|Old, only birds might not plead slightly. As foreign effects want firmly other politicians; now real politicia|-|23.07|-|0.33|-|0.22|-|exportiedu pack #2 +bar|-|Only long brothers detect in a years; commitments can imagine near little great fields. Civil, soviet patients profit already just long arrangements. Often indi|-|30.98|-|8.94|-|7.95|-|scholarnameless #6 +bar|-|Operational images come countries. Good regions must please very pr|-|26.43|-|0.56|-|0.64|-|corpunivamalg #6 +bar|-|Proposals should involve more soviet, young islands. Little resources try even books. Fundamental systems end recent, total provisions. Working-class matte|-|32.68|-|5.15|-|3.60|-|exportischolar #2 +bar|-|Remote, gentle prizes dress so departments. Previous, superb goods take little in a proposals; important, imperial|-|34.87|-|4.42|-|3.44|-|exportinameless #2 +bar|-|So specified walls attach common commitments. Pale, secondary implications store easily in a |-|27.50|-|2.25|-|1.87|-|corpbrand #4 +bar|-|Together main chains care |-|16.35|-|2.78|-|1.52|-|exportiamalg #2 +bar|-|Very, hard principles agree once differences. Long, economic services submit yet. Fundamental interests cover legal voters; hours as|-|0.00|-|4.10|-|3.56|-|scholarunivamalg #12 +eing|-|As parli|-|23.98|-|1.55|-|1.08|-|exportiamalg #2 +eing|-|At present dominant forces say also capitalist, bottom miles. Away historical departments ought to leave industrial measures. Immediate concentrations ought to go. Buildings sha|-|21.35|-|3.17|-|2.47|-|importoedu pack #2 +eing|-|Companies would make t|-|22.18|-|1.37|-|2.45|-|amalgimporto #2 +eing|-|Dead, obvious terms would serve more through a forces; worthy, possible arms decide for the falls. Rules |-|33.75|-|2.34|-|2.01|-|edu packbrand #6 +eing|-|Deep, practical services may not see particular occasions. Effective, new hotels coincide possibly to a years. Small|-|20.36|-|98.89|-|46.47|-|importoamalg #2 +eing|-|Degrees know as after a heads; new, complex ma|-|24.68|-|1.41|-|1.02|-|amalgnameless #8 +eing|-|Enterprises shall not influence perhaps delighted, big police. Novels keep early temporary bacteria; rates will not cope men|-|35.58|-|0.95|-|1.96|-|exportiunivamalg #6 +eing|-|Exclusive, different friends find for the features. Procedures comprehend totally ey|-|36.97|-|3.90|-|3.00|-|univmaxi #2 +eing|-|Flames confirm however wonderful effects. However white gaps could not find literally other modes. Problems should want very enough main legs. Pers|-|26.54|-|5.95|-|0.85|-|amalgamalg #2 +eing|-|German, american families learn to a |-|34.40|-|0.29|-|0.13|-|univmaxi #10 +eing|-|Goods keep points. Again sensitive windows must not cause closely female, individual powers; gaps derive suddenly sincerely other hands; other houses may not imagine under for a data|-|13.44|-|8.29|-|5.80|-|importoedu pack #2 +eing|-|Late, chief standards guarantee publicly police. Also political years might come curious years. Systems may not follow so with a times. Central, silent towns must apologis|-|17.63|-|5.13|-|18.99|-|amalgnameless #6 +eing|-|Likely restrictions buy even particularly prime lips. Severe sales c|-|17.06|-|3.40|-|1.59|-|amalgnameless #8 +eing|-|Live men find without a cases. Colonial, islamic incidents will convene before available databases. As clear fo|-|26.01|-|1.39|-|0.63|-|amalgimporto #2 +eing|-|Miles shall not predict from a |-|19.14|-|5.14|-|2.41|-|maxinameless #10 +eing|-|More public tools may lie simply large, bright offices|-|28.18|-|10.32|-|3.61|-|amalgexporti #2 +eing|-|Open employees wear. Pr|-|25.76|-|4.70|-|3.10|-|exportiamalg #2 +eing|-|Other, inner sheets must not contemplate well bones. Files go technically admittedly easy names. Lives should show pretty, southern leaders. Events would describe|-|26.12|-|3.62|-|1.23|-|importoscholar #2 +eing|-|Precise, very numbers sha|-|1.47|-|2.73|-|6.49|-|importoscholar #2 +eing|-|Professional, local chemicals can feel eyes. Familiar shops bear early in a accounts. Western arrangements ride reserves. Sorry, scottish ministers might not keep constantly w|-|9.78|-|6.13|-|5.21|-|edu packnameless #10 +eing|-|Really new pressures try dry affairs. White players complete. Points will not promote about a services. Large, english views may not recall forwards then very parents. Legal views |-|11.93|-|8.33|-|2.10|-|amalgamalg #2 +eing|-|Residents will l|-|24.16|-|7.50|-|2.55|-|edu packnameless #4 +eing|-|Social, great legs will not plan particularly at a charges. Important sorts shall buy significantly bones. Little historical wome|-|28.84|-|9.90|-|6.13|-|amalgedu pack #2 +eing|-|True, future holes honou|-|22.12|-|91.57|-|63.18|-|corpmaxi #6 +eing|-|Useful, due computers result thereby r|-|14.10|-|77.44|-|4.20|-|edu packexporti #2 +ese|-|About flexible expenses used to submit greatly equal signals. Women ought to manufacture by a steps. Broadly special companies shake more. Luckily|-|27.62|-|8.49|-|1.36|-|exportiexporti #2 +ese|-|Acute communications see by a shapes. Applications would|-|28.79|-|3.68|-|3.31|-|importounivamalg #16 +ese|-|Artists make times. Rather ready functions must pre|-|24.00|-|7.82|-|3.71|-|exporticorp #6 +ese|-|Available, good memories must not draw extremely. English, additional fa|-|14.01|-|0.40|-|0.15|-|exportimaxi #4 +ese|-|Banks shall know in a hab|-|23.43|-|8.64|-|5.96|-|scholarcorp #4 +ese|-|English children argue with a clothes. Current aspects stand common, warm concentrations. Previ|-|36.75|-|7.39|-|3.47|-|importoimporto #2 +ese|-|General organisations|-|4.49|-|3.83|-|1.57|-|edu packedu pack #2 +ese|-|Here extensive yea|-|27.89|-|9.11|-|6.46|-|edu packamalg #2 +ese|-|Just externa|-|24.24|-|6.77|-|3.18|-|importoexporti #2 +ese|-|Li|-|36.16|-|2.31|-|0.90|-|importoexporti #2 +ese|-|Savings might study today over a vegetables. Possibly effective agencies bec|-|14.83|-|7.55|-|5.13|-|importonameless #2 +ese|-|Secondary, normal |-|2.50|-|2.60|-|5.01|-|importoexporti #2 +ese|-|Subsidies may not like never nearly dangerous hands. New, other months take medical powers. Stars ought to meet except a events; then general gro|-|29.71|-|9.29|-|2.87|-|edu packimporto #2 +ese|-|Things used to lock high for a trains; military contracts may act firmly common, impossib|-|5.89|-|0.99|-|2.54|-|scholarmaxi #6 +ese|-|Visible, individual producers undertake further in a conditions; marked, other surroundings argue in a criticisms; over previous legs pay in a tr|-|32.90|-|2.19|-|1.55|-|scholarnameless #8 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q66.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q66.out new file mode 100644 index 0000000000000..46689c742fccf --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q66.out @@ -0,0 +1,5 @@ +Just good amou|-|933435|-|Midway|-|Williamson County|-|TN|-|United States|-|DIAMOND,AIRBORNE|-|2002|-|25428944.06|-|18300441.48|-|20765863.06|-|21911886.31|-|26464165.14|-|19877878.62|-|27470364.20|-|43542188.67|-|51686084.57|-|53616394.54|-|86404470.94|-|71857822.50|-|27.242329739082|-|19.605480274470|-|22.246715689898|-|23.474464006600|-|28.351374375292|-|21.295407414549|-|29.429327376840|-|46.647263783766|-|55.371916169846|-|57.439880163053|-|92.566135767354|-|76.982138552765|-|44837100.42|-|32247854.96|-|40223867.72|-|39320394.49|-|51691239.69|-|40783976.37|-|46721451.28|-|87729022.93|-|98020812.22|-|93950226.79|-|151118801.68|-|133910291.99 +Matches produce|-|198821|-|Midway|-|Williamson County|-|TN|-|United States|-|DIAMOND,AIRBORNE|-|2002|-|18501120.40|-|22489970.09|-|19523044.23|-|17390518.54|-|25553360.54|-|21514166.71|-|24177479.20|-|50628652.35|-|47917574.59|-|49695732.02|-|71454708.52|-|76522030.59|-|93.054156251100|-|113.116673238742|-|98.194075223442|-|87.468217844192|-|128.524454358443|-|108.208723977850|-|121.604253071858|-|254.644390431594|-|241.008618757576|-|249.952127893934|-|359.392159379542|-|384.879014741904|-|40355252.94|-|43141502.33|-|43837721.50|-|30590998.32|-|46802284.57|-|41116242.12|-|44266753.86|-|93034391.01|-|86346213.16|-|100934072.74|-|135521244.38|-|147088533.99 +Operations|-|500020|-|Fairview|-|Williamson County|-|TN|-|United States|-|DIAMOND,AIRBORNE|-|2002|-|23396568.08|-|21595101.49|-|30445892.86|-|17148361.12|-|29494905.37|-|14534337.33|-|23309571.40|-|52130080.57|-|45532397.00|-|49960621.74|-|69987200.50|-|82859535.19|-|46.791264509420|-|43.188475440982|-|60.889350145994|-|34.295350425983|-|58.987451241950|-|29.067511959522|-|46.617278108876|-|104.255990900364|-|91.061151553938|-|99.917246790129|-|139.968802247910|-|165.712441882325|-|40935212.91|-|41716771.08|-|54204186.77|-|32588401.15|-|57658085.15|-|31473433.89|-|44957326.44|-|95008917.37|-|86101918.21|-|96464827.18|-|133173048.49|-|150572246.46 +Selective,|-|720621|-|Fairview|-|Williamson County|-|TN|-|United States|-|DIAMOND,AIRBORNE|-|2002|-|20296172.34|-|20076381.98|-|18742476.46|-|19749988.14|-|22365363.72|-|19418932.36|-|19946632.82|-|48292086.24|-|46433775.46|-|58944786.81|-|73216015.48|-|80944352.64|-|28.164836078882|-|27.859834753636|-|26.008784728727|-|27.406900631539|-|31.036236412761|-|26.947497172577|-|27.679782881709|-|67.014541957562|-|64.435778946214|-|81.797209365256|-|101.601279285505|-|112.325830970788|-|37590113.60|-|37494242.14|-|35297254.18|-|36123354.64|-|46846234.53|-|38273791.41|-|48690528.00|-|87591201.79|-|97529403.03|-|108714259.20|-|136415558.69|-|152625431.52 +Significantly|-|200313|-|Fairview|-|Williamson County|-|TN|-|United States|-|DIAMOND,AIRBORNE|-|2002|-|26739945.48|-|20279425.21|-|23331284.49|-|24899894.47|-|14393030.10|-|18145056.76|-|18902253.06|-|50179761.85|-|43296134.24|-|61331512.40|-|82451814.02|-|79880324.97|-|133.490814275658|-|101.238687504056|-|116.474140420242|-|124.304935126527|-|71.852701022899|-|90.583520590276|-|94.363586287461|-|250.506766160958|-|216.142408330962|-|306.178392815244|-|411.614892792780|-|398.777538003025|-|44364954.97|-|36988141.43|-|42324739.73|-|43535487.49|-|29224109.53|-|33331703.06|-|41178792.77|-|84320903.39|-|86072981.06|-|105411757.72|-|151528016.49|-|155228038.55 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q67.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q67.out new file mode 100644 index 0000000000000..70b814d15997d --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q67.out @@ -0,0 +1,100 @@ +null|-|null|-|null|-|null|-|null|-|null|-|null|-|null|-|681149.47|-|5 +null|-|null|-|null|-|null|-|null|-|null|-|null|-|null|-|1474997.55|-|4 +null|-|null|-|null|-|null|-|null|-|null|-|null|-|null|-|1577864.42|-|3 +null|-|null|-|null|-|null|-|null|-|null|-|null|-|null|-|2536204.81|-|2 +null|-|null|-|null|-|null|-|null|-|null|-|null|-|null|-|999668082.59|-|1 +null|-|null|-|null|-|null|-|2001|-|null|-|null|-|null|-|681149.47|-|5 +null|-|null|-|null|-|null|-|2001|-|1|-|null|-|null|-|111437.42|-|32 +null|-|null|-|null|-|null|-|2001|-|1|-|1|-|null|-|36235.73|-|90 +null|-|null|-|null|-|null|-|2001|-|1|-|3|-|null|-|49252.88|-|77 +null|-|null|-|null|-|null|-|2001|-|2|-|null|-|null|-|78346.18|-|63 +null|-|null|-|null|-|null|-|2001|-|2|-|6|-|null|-|34840.48|-|96 +null|-|null|-|null|-|null|-|2001|-|3|-|null|-|null|-|141691.87|-|12 +null|-|null|-|null|-|null|-|2001|-|3|-|7|-|null|-|31988.52|-|100 +null|-|null|-|null|-|null|-|2001|-|3|-|8|-|null|-|57778.28|-|69 +null|-|null|-|null|-|null|-|2001|-|3|-|9|-|null|-|51925.07|-|73 +null|-|null|-|null|-|null|-|2001|-|4|-|null|-|null|-|349674.00|-|7 +null|-|null|-|null|-|null|-|2001|-|4|-|10|-|null|-|89521.66|-|52 +null|-|null|-|null|-|null|-|2001|-|4|-|11|-|null|-|107989.95|-|35 +null|-|null|-|null|-|null|-|2001|-|4|-|11|-|AAAAAAAAHAAAAAAA|-|38673.65|-|85 +null|-|null|-|null|-|null|-|2001|-|4|-|12|-|null|-|152162.39|-|11 +null|-|null|-|null|-|null|-|2001|-|4|-|12|-|AAAAAAAACAAAAAAA|-|36936.71|-|88 +null|-|null|-|null|-|null|-|2001|-|4|-|12|-|AAAAAAAAKAAAAAAA|-|35885.68|-|92 +null|-|null|-|null|-|ationesebareing|-|null|-|null|-|null|-|null|-|130971.51|-|13 +null|-|null|-|null|-|ationesebareing|-|2001|-|null|-|null|-|null|-|130971.51|-|13 +null|-|null|-|null|-|ationesebareing|-|2001|-|3|-|null|-|null|-|49334.88|-|76 +null|-|null|-|null|-|ationesebareing|-|2001|-|4|-|null|-|null|-|36033.41|-|91 +null|-|null|-|null|-|n stcallyn stn st|-|null|-|null|-|null|-|null|-|110926.60|-|33 +null|-|null|-|null|-|n stcallyn stn st|-|2001|-|null|-|null|-|null|-|110926.60|-|33 +null|-|null|-|null|-|n stcallyn stn st|-|2001|-|3|-|null|-|null|-|33118.05|-|98 +null|-|null|-|null|-|n stcallyn stn st|-|2001|-|4|-|null|-|null|-|41603.21|-|83 +null|-|null|-|null|-|n stought|-|null|-|null|-|null|-|null|-|157465.43|-|9 +null|-|null|-|null|-|n stought|-|2001|-|null|-|null|-|null|-|157465.43|-|9 +null|-|null|-|null|-|n stought|-|2001|-|3|-|null|-|null|-|46371.14|-|78 +null|-|null|-|null|-|n stought|-|2001|-|4|-|null|-|null|-|65619.67|-|66 +null|-|null|-|null|-|n stought|-|2001|-|4|-|11|-|null|-|45528.69|-|79 +null|-|null|-|null|-|oughtableantiable|-|null|-|null|-|null|-|null|-|103187.19|-|40 +null|-|null|-|null|-|oughtableantiable|-|2001|-|null|-|null|-|null|-|103187.19|-|40 +null|-|null|-|null|-|oughtableantiable|-|2001|-|4|-|null|-|null|-|42408.80|-|82 +null|-|null|-|null|-|oughtablen stationought|-|null|-|null|-|null|-|null|-|86348.22|-|57 +null|-|null|-|null|-|oughtablen stationought|-|2001|-|null|-|null|-|null|-|86348.22|-|57 +null|-|null|-|null|-|oughtablen stationought|-|2001|-|4|-|null|-|null|-|35714.86|-|93 +null|-|null|-|null|-|oughtesebaration|-|null|-|null|-|null|-|null|-|76325.38|-|64 +null|-|null|-|null|-|oughtesebaration|-|2001|-|null|-|null|-|null|-|76325.38|-|64 +null|-|null|-|null|-|oughtesebaration|-|2001|-|4|-|null|-|null|-|36610.75|-|89 +null|-|null|-|null|-|oughteseoughtation|-|null|-|null|-|null|-|null|-|128623.75|-|19 +null|-|null|-|null|-|oughteseoughtation|-|2001|-|null|-|null|-|null|-|128623.75|-|19 +null|-|null|-|null|-|oughteseoughtation|-|2001|-|3|-|null|-|null|-|35495.82|-|94 +null|-|null|-|null|-|oughteseoughtation|-|2001|-|4|-|null|-|null|-|57203.17|-|70 +null|-|null|-|importoamalg #2|-|null|-|null|-|null|-|null|-|null|-|102866.87|-|42 +null|-|null|-|importoamalg #2|-|null|-|null|-|null|-|null|-|null|-|102866.87|-|42 +null|-|null|-|importoamalg #2|-|null|-|2001|-|null|-|null|-|null|-|102866.87|-|42 +null|-|null|-|importoamalg #2|-|null|-|2001|-|4|-|null|-|null|-|51717.30|-|74 +null|-|accessories|-|null|-|null|-|null|-|null|-|null|-|null|-|98994.39|-|48 +null|-|accessories|-|null|-|null|-|null|-|null|-|null|-|null|-|98994.39|-|48 +null|-|accessories|-|null|-|prin stn stoughtought|-|null|-|null|-|null|-|null|-|98994.39|-|48 +null|-|accessories|-|null|-|prin stn stoughtought|-|2001|-|null|-|null|-|null|-|98994.39|-|48 +null|-|accessories|-|null|-|prin stn stoughtought|-|2001|-|3|-|null|-|null|-|37246.83|-|87 +null|-|athletic|-|null|-|null|-|null|-|null|-|null|-|null|-|122120.16|-|21 +null|-|athletic|-|null|-|null|-|null|-|null|-|null|-|null|-|122120.16|-|21 +null|-|athletic|-|null|-|null|-|null|-|null|-|null|-|null|-|122120.16|-|21 +null|-|athletic|-|null|-|null|-|2001|-|null|-|null|-|null|-|122120.16|-|21 +null|-|athletic|-|null|-|null|-|2001|-|4|-|null|-|null|-|63278.49|-|67 +null|-|athletic|-|null|-|null|-|2001|-|4|-|11|-|null|-|38216.51|-|86 +null|-|baseball|-|null|-|null|-|null|-|null|-|null|-|null|-|105806.96|-|36 +null|-|baseball|-|null|-|null|-|null|-|null|-|null|-|null|-|105806.96|-|36 +null|-|baseball|-|null|-|null|-|null|-|null|-|null|-|null|-|105806.96|-|36 +null|-|baseball|-|null|-|null|-|2001|-|null|-|null|-|null|-|105806.96|-|36 +null|-|baseball|-|null|-|null|-|2001|-|4|-|null|-|null|-|58206.33|-|68 +null|-|country|-|null|-|null|-|null|-|null|-|null|-|null|-|89164.69|-|53 +null|-|country|-|importoscholar #2|-|null|-|null|-|null|-|null|-|null|-|89164.69|-|53 +null|-|country|-|importoscholar #2|-|null|-|null|-|null|-|null|-|null|-|89164.69|-|53 +null|-|country|-|importoscholar #2|-|null|-|2001|-|null|-|null|-|null|-|89164.69|-|53 +null|-|country|-|importoscholar #2|-|null|-|2001|-|4|-|null|-|null|-|55674.96|-|71 +null|-|dresses|-|null|-|null|-|null|-|null|-|null|-|null|-|116126.30|-|25 +null|-|dresses|-|null|-|null|-|null|-|null|-|null|-|null|-|217647.20|-|8 +null|-|dresses|-|null|-|oughteingantieing|-|null|-|null|-|null|-|null|-|116126.30|-|25 +null|-|dresses|-|null|-|oughteingantieing|-|2001|-|null|-|null|-|null|-|116126.30|-|25 +null|-|dresses|-|null|-|oughteingantieing|-|2001|-|3|-|null|-|null|-|35421.52|-|95 +null|-|dresses|-|null|-|oughteingantieing|-|2001|-|4|-|null|-|null|-|53283.33|-|72 +null|-|dresses|-|amalgamalg #2|-|null|-|null|-|null|-|null|-|null|-|101520.90|-|45 +null|-|dresses|-|amalgamalg #2|-|null|-|null|-|null|-|null|-|null|-|101520.90|-|45 +null|-|dresses|-|amalgamalg #2|-|null|-|2001|-|null|-|null|-|null|-|101520.90|-|45 +null|-|dresses|-|amalgamalg #2|-|null|-|2001|-|3|-|null|-|null|-|32017.28|-|99 +null|-|dresses|-|amalgamalg #2|-|null|-|2001|-|4|-|null|-|null|-|34451.25|-|97 +null|-|infants|-|null|-|null|-|null|-|null|-|null|-|null|-|128750.23|-|15 +null|-|infants|-|importoexporti #2|-|null|-|null|-|null|-|null|-|null|-|128750.23|-|15 +null|-|infants|-|importoexporti #2|-|antiationeseese|-|null|-|null|-|null|-|null|-|128750.23|-|15 +null|-|infants|-|importoexporti #2|-|antiationeseese|-|2001|-|null|-|null|-|null|-|128750.23|-|15 +null|-|infants|-|importoexporti #2|-|antiationeseese|-|2001|-|3|-|null|-|null|-|40113.56|-|84 +null|-|infants|-|importoexporti #2|-|antiationeseese|-|2001|-|4|-|null|-|null|-|50724.87|-|75 +null|-|mens|-|null|-|null|-|null|-|null|-|null|-|null|-|113853.60|-|28 +null|-|mens|-|importoedu pack #2|-|null|-|null|-|null|-|null|-|null|-|113853.60|-|28 +null|-|mens|-|importoedu pack #2|-|oughtablen steseought|-|null|-|null|-|null|-|null|-|113853.60|-|28 +null|-|mens|-|importoedu pack #2|-|oughtablen steseought|-|2001|-|null|-|null|-|null|-|113853.60|-|28 +null|-|mens|-|importoedu pack #2|-|oughtablen steseought|-|2001|-|3|-|null|-|null|-|42447.63|-|81 +null|-|mens|-|importoedu pack #2|-|oughtablen steseought|-|2001|-|4|-|null|-|null|-|43089.74|-|80 +null|-|shirts|-|null|-|null|-|null|-|null|-|null|-|null|-|82003.16|-|59 +null|-|shirts|-|null|-|null|-|null|-|null|-|null|-|null|-|82003.16|-|59 +null|-|shirts|-|null|-|oughtcallyeseantiought|-|null|-|null|-|null|-|null|-|82003.16|-|59 +null|-|shirts|-|null|-|oughtcallyeseantiought|-|2001|-|null|-|null|-|null|-|82003.16|-|59 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q68.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q68.out new file mode 100644 index 0000000000000..6a9b04b81f8e9 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q68.out @@ -0,0 +1,100 @@ +null|-|null|-|Salem|-|Lakeside|-|2203|-|23464.72|-|675.04|-|46100.94 +null|-|Ira|-|Riverdale|-|Oak Ridge|-|10508|-|32911.54|-|938.79|-|59812.32 +null|-|Christina|-|Page|-|Jamestown|-|11400|-|9481.13|-|408.05|-|25823.70 +null|-|Rebecca|-|Belmont|-|Marion|-|13206|-|14180.52|-|1072.25|-|23887.85 +null|-|null|-|Pleasant Valley|-|Lincoln|-|20829|-|16340.86|-|289.50|-|34809.84 +null|-|Joel|-|Oak Hill|-|Clifton|-|21390|-|19561.57|-|939.54|-|46319.37 +null|-|Max|-|Stringtown|-|Pine Grove|-|22049|-|20059.77|-|974.94|-|38268.07 +null|-|null|-|Bridgeport|-|Riverside|-|23264|-|10699.95|-|496.36|-|29285.70 +null|-|Rebecca|-|Union Hill|-|Farmington|-|26031|-|7636.54|-|515.78|-|13443.39 +null|-|null|-|Riverview|-|Ruth|-|27875|-|12592.35|-|374.51|-|31362.39 +null|-|Raymond|-|Bunker Hill|-|Clifton|-|30655|-|27237.08|-|1237.59|-|51322.22 +null|-|David|-|Glendale|-|Greenville|-|33716|-|15434.87|-|1012.60|-|30661.71 +null|-|null|-|Whispering Pines|-|Woodruff|-|34420|-|25919.14|-|531.58|-|49020.53 +null|-|Albertha|-|Lincoln|-|Brownsville|-|44571|-|15148.11|-|330.56|-|37163.28 +null|-|Andrew|-|Pine Grove|-|Harmony|-|44786|-|35900.43|-|1439.19|-|72190.11 +null|-|Jerome|-|Galena|-|Georgetown|-|50559|-|33831.95|-|890.50|-|57970.13 +null|-|Leah|-|Hopewell|-|Marion|-|51912|-|21702.01|-|1171.88|-|42974.33 +null|-|null|-|Hillcrest|-|Cordova|-|64306|-|10534.53|-|295.14|-|15380.96 +null|-|John|-|Stringtown|-|Arlington|-|64522|-|21495.01|-|783.81|-|45067.59 +null|-|null|-|Gladstone|-|Summit|-|66488|-|20881.36|-|605.92|-|32362.22 +null|-|Lakeshia|-|Sheffield|-|Salem|-|66896|-|7344.67|-|366.31|-|27741.30 +null|-|null|-|Hopewell|-|Riverdale|-|67278|-|24471.59|-|1549.17|-|48406.81 +null|-|null|-|Oakdale|-|Edgewood|-|72719|-|41922.51|-|1445.30|-|59799.23 +null|-|Matthew|-|Centerville|-|Woodlawn|-|76164|-|16525.09|-|689.55|-|31331.62 +null|-|Russel|-|Red Hill|-|Woodland|-|82061|-|17750.10|-|1025.09|-|40565.68 +null|-|null|-|Mount Olive|-|Maple Grove|-|82183|-|16184.99|-|573.72|-|44448.96 +null|-|null|-|Glendale|-|Macedonia|-|85998|-|19371.17|-|723.06|-|29455.67 +null|-|Cindy|-|White Oak|-|Riverside|-|87930|-|12282.48|-|527.01|-|27340.67 +null|-|Robert|-|Farmington|-|Lakeside|-|89295|-|19349.70|-|165.29|-|31209.43 +null|-|Mathew|-|Shady Grove|-|Spring Hill|-|90465|-|32758.67|-|1717.04|-|54985.01 +null|-|null|-|Hopewell|-|Mount Vernon|-|93268|-|7233.95|-|208.59|-|26331.88 +null|-|Laura|-|Sulphur Springs|-|Flint|-|96398|-|4376.26|-|121.33|-|6672.24 +null|-|Garth|-|Pleasant Grove|-|Highland Park|-|97743|-|18423.03|-|418.04|-|39546.23 +null|-|null|-|Indian Village|-|Golden|-|98530|-|18842.65|-|1005.52|-|40742.92 +null|-|null|-|Greenfield|-|Farmington|-|98985|-|13264.63|-|589.99|-|20576.04 +null|-|Virginia|-|Five Forks|-|Oakland|-|106543|-|24859.75|-|1006.88|-|39693.34 +null|-|null|-|Scottsville|-|Greenfield|-|107236|-|14638.50|-|802.00|-|35356.18 +null|-|null|-|Midway|-|New Hope|-|113272|-|50295.57|-|2963.67|-|78595.37 +null|-|William|-|Valley View|-|Providence|-|115559|-|29947.61|-|673.81|-|50883.54 +null|-|null|-|Newport|-|Indian Village|-|120966|-|15268.90|-|721.76|-|27022.81 +null|-|Brandon|-|Arlington|-|Woodland|-|135601|-|43789.02|-|1493.45|-|66479.43 +null|-|null|-|Shirley|-|Fairview|-|143290|-|19808.13|-|596.98|-|34256.82 +null|-|Luther|-|Greenville|-|Hillcrest|-|149654|-|27079.37|-|939.22|-|41067.50 +null|-|Michelle|-|Fairview|-|Hopewell|-|149783|-|29018.58|-|1426.60|-|48040.63 +null|-|null|-|Clifton|-|Sunnyside|-|149869|-|10073.90|-|492.64|-|24418.48 +null|-|Angelica|-|Barnes|-|Plainview|-|151659|-|21082.45|-|306.14|-|40857.65 +null|-|Donna|-|Centerville|-|Friendship|-|152588|-|20862.64|-|969.20|-|46304.16 +null|-|null|-|Edgewood|-|Deerfield|-|153338|-|23831.71|-|686.97|-|69961.05 +null|-|null|-|Lakeview|-|Oakland|-|153384|-|31092.17|-|1274.54|-|50275.57 +null|-|null|-|Waterloo|-|Brownsville|-|156086|-|15552.11|-|516.54|-|44164.25 +null|-|null|-|Macedonia|-|Wildwood|-|156443|-|19554.51|-|437.97|-|48655.71 +null|-|null|-|Stringtown|-|Liberty|-|158006|-|16267.97|-|450.16|-|25629.75 +null|-|Ruth|-|Highland|-|Riverside|-|167073|-|6190.71|-|221.25|-|15999.71 +null|-|Luke|-|Bethel|-|Newport|-|167199|-|31196.20|-|2157.54|-|54405.23 +null|-|null|-|Greenfield|-|Hopewell|-|168370|-|13878.80|-|617.56|-|31230.84 +null|-|Robert|-|Four Points|-|Farmington|-|176911|-|14828.21|-|674.85|-|32517.24 +null|-|null|-|Harmony|-|Spring Valley|-|178332|-|10288.94|-|631.05|-|35516.38 +null|-|null|-|Enterprise|-|Bunker Hill|-|182211|-|14072.57|-|405.42|-|33771.00 +null|-|Loretta|-|Arlington|-|Centerville|-|186071|-|22242.58|-|1002.21|-|42669.75 +null|-|null|-|Salem|-|Valley View|-|187904|-|15702.34|-|439.59|-|41237.94 +null|-|null|-|Harvey|-|Greenville|-|190089|-|16669.95|-|769.49|-|29806.75 +null|-|Debra|-|Green Acres|-|Woodlawn|-|192040|-|9053.50|-|169.31|-|13181.96 +null|-|Roy|-|Providence|-|Waterloo|-|195597|-|20381.57|-|985.45|-|33510.51 +null|-|null|-|Mount Olive|-|Mount Pleasant|-|197746|-|32038.93|-|1017.39|-|87608.72 +null|-|null|-|Rocky Hill|-|Providence|-|211665|-|15060.41|-|598.75|-|29385.31 +null|-|Sandra|-|Unionville|-|Hopewell|-|221077|-|8341.60|-|527.66|-|17817.11 +null|-|Robert|-|Summit|-|Five Points|-|224508|-|15607.69|-|500.96|-|37984.93 +null|-|null|-|Post Oak|-|Greenville|-|227170|-|24588.06|-|828.02|-|50182.83 +null|-|null|-|Five Forks|-|Greenwood|-|229217|-|28140.74|-|648.83|-|44184.05 +null|-|null|-|Bethel|-|Sunnyside|-|233081|-|13271.69|-|468.80|-|32129.60 +null|-|Shayne|-|Riverview|-|Crossroads|-|234750|-|20554.66|-|737.10|-|52975.61 +null|-|null|-|Forest Hills|-|Florence|-|238423|-|3669.07|-|172.52|-|19304.99 +Aaron|-|Nick|-|Harmony|-|Edgewood|-|73734|-|29649.48|-|959.10|-|56974.10 +Abney|-|Janice|-|Mount Zion|-|Enterprise|-|27585|-|16154.82|-|636.94|-|37751.16 +Abrams|-|Alma|-|Fairfield|-|Macedonia|-|33078|-|28262.54|-|808.09|-|48263.03 +Ackley|-|Cheryl|-|Wildwood|-|Crossroads|-|63059|-|18610.27|-|793.80|-|43184.27 +Adams|-|Catherine|-|Highland Park|-|Concord|-|49075|-|3099.06|-|146.40|-|8540.03 +Adams|-|John|-|Liberty|-|Highland|-|58899|-|15722.42|-|578.11|-|29914.34 +Adams|-|Paulette|-|Tremont|-|Lakeside|-|82644|-|25822.05|-|365.13|-|46273.62 +Adams|-|Edwin|-|Plainview|-|Greenwood|-|108138|-|23483.91|-|982.40|-|35181.82 +Adams|-|Rachel|-|Riverside|-|Five Forks|-|145232|-|12802.56|-|1048.34|-|24962.64 +Adams|-|Merrill|-|Lebanon|-|Lakeside|-|165183|-|15192.36|-|807.86|-|41300.23 +Adams|-|Nichole|-|Edgewood|-|Friendship|-|171894|-|20821.96|-|1333.70|-|48375.06 +Adams|-|Nichole|-|Edgewood|-|Green Acres|-|180862|-|17519.04|-|657.52|-|33555.87 +Adams|-|Alyson|-|Marion|-|Greenfield|-|206622|-|33883.92|-|1579.30|-|51116.63 +Adams|-|Donna|-|Plainview|-|Liberty|-|219849|-|18150.78|-|448.49|-|22444.41 +Aguirre|-|Bradley|-|Waterloo|-|Clinton|-|69169|-|24894.16|-|1778.85|-|51621.96 +Ahmed|-|Jeffrey|-|Stewart|-|Edgewood|-|202936|-|27333.88|-|948.83|-|39990.68 +Albert|-|Marina|-|Mount Olive|-|Brownsville|-|218597|-|16639.50|-|1117.80|-|31311.60 +Alcorn|-|Jeffery|-|Cedar Grove|-|Salem|-|46467|-|17634.79|-|785.53|-|57718.43 +Alderman|-|Melanie|-|Edgewood|-|Mount Zion|-|14230|-|28157.47|-|270.85|-|48818.21 +Aldridge|-|Daniel|-|Berlin|-|Wilson|-|114445|-|15440.33|-|552.85|-|22637.40 +Alexander|-|Geraldine|-|Liberty|-|Mount Pleasant|-|56644|-|16767.42|-|886.82|-|29643.19 +Alexander|-|Shane|-|Sulphur Springs|-|Phoenix|-|156857|-|15364.31|-|792.96|-|38059.32 +Alexander|-|Curtis|-|Harvey|-|Fairview|-|211843|-|19216.48|-|309.91|-|58126.40 +Alexander|-|Arthur|-|Wilson|-|Riverdale|-|236540|-|33199.93|-|1929.48|-|55876.33 +Alger|-|Beverly|-|Allentown|-|Riverview|-|173449|-|24541.75|-|797.49|-|48511.28 +Allen|-|Brittany|-|Lincoln|-|Hillcrest|-|10696|-|17579.89|-|595.90|-|46637.81 +Allen|-|Yvette|-|Providence|-|Flatwoods|-|73587|-|8938.13|-|561.96|-|27604.45 +Allen|-|Anthony|-|Oak Ridge|-|Waterloo|-|90271|-|12089.62|-|566.35|-|23879.30 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q69.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q69.out new file mode 100644 index 0000000000000..6f87e3202a22f --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q69.out @@ -0,0 +1,100 @@ +F|-|D|-|2 yr Degree|-|1|-|4500|-|1|-|Good|-|1 +F|-|D|-|2 yr Degree|-|1|-|4500|-|1|-|High Risk|-|1 +F|-|D|-|2 yr Degree|-|1|-|6500|-|1|-|Unknown|-|1 +F|-|D|-|2 yr Degree|-|1|-|10000|-|1|-|Low Risk|-|1 +F|-|D|-|4 yr Degree|-|1|-|1500|-|1|-|Low Risk|-|1 +F|-|D|-|4 yr Degree|-|1|-|4500|-|1|-|High Risk|-|1 +F|-|D|-|4 yr Degree|-|1|-|4500|-|1|-|Low Risk|-|1 +F|-|D|-|4 yr Degree|-|1|-|7500|-|1|-|Good|-|1 +F|-|D|-|4 yr Degree|-|1|-|8000|-|1|-|High Risk|-|1 +F|-|D|-|4 yr Degree|-|1|-|9000|-|1|-|Good|-|1 +F|-|D|-|Advanced Degree|-|1|-|1000|-|1|-|Low Risk|-|1 +F|-|D|-|Advanced Degree|-|1|-|2000|-|1|-|High Risk|-|1 +F|-|D|-|Advanced Degree|-|1|-|3000|-|1|-|High Risk|-|1 +F|-|D|-|Advanced Degree|-|1|-|7000|-|1|-|Good|-|1 +F|-|D|-|Advanced Degree|-|1|-|7000|-|1|-|Low Risk|-|1 +F|-|D|-|Advanced Degree|-|1|-|9000|-|1|-|Good|-|1 +F|-|D|-|College|-|2|-|500|-|2|-|High Risk|-|2 +F|-|D|-|College|-|1|-|1000|-|1|-|High Risk|-|1 +F|-|D|-|College|-|1|-|3000|-|1|-|Unknown|-|1 +F|-|D|-|College|-|1|-|7500|-|1|-|Low Risk|-|1 +F|-|D|-|College|-|1|-|8500|-|1|-|Unknown|-|1 +F|-|D|-|Primary|-|2|-|1500|-|2|-|High Risk|-|2 +F|-|D|-|Primary|-|1|-|3000|-|1|-|High Risk|-|1 +F|-|D|-|Primary|-|1|-|4000|-|1|-|Good|-|1 +F|-|D|-|Primary|-|1|-|4500|-|1|-|Low Risk|-|1 +F|-|D|-|Primary|-|1|-|6000|-|1|-|Low Risk|-|1 +F|-|D|-|Primary|-|1|-|8000|-|1|-|High Risk|-|1 +F|-|D|-|Primary|-|1|-|9000|-|1|-|High Risk|-|1 +F|-|D|-|Secondary|-|1|-|1000|-|1|-|High Risk|-|1 +F|-|D|-|Secondary|-|1|-|3000|-|1|-|Unknown|-|1 +F|-|D|-|Secondary|-|1|-|4500|-|1|-|Good|-|1 +F|-|D|-|Secondary|-|1|-|5500|-|1|-|Good|-|1 +F|-|D|-|Secondary|-|1|-|7000|-|1|-|High Risk|-|1 +F|-|D|-|Secondary|-|1|-|7500|-|1|-|High Risk|-|1 +F|-|D|-|Secondary|-|1|-|9000|-|1|-|High Risk|-|1 +F|-|D|-|Secondary|-|1|-|9500|-|1|-|High Risk|-|1 +F|-|D|-|Secondary|-|1|-|10000|-|1|-|High Risk|-|1 +F|-|D|-|Unknown|-|1|-|3500|-|1|-|Low Risk|-|1 +F|-|D|-|Unknown|-|1|-|7000|-|1|-|Low Risk|-|1 +F|-|D|-|Unknown|-|1|-|7500|-|1|-|Good|-|1 +F|-|D|-|Unknown|-|1|-|8500|-|1|-|Good|-|1 +F|-|D|-|Unknown|-|1|-|9500|-|1|-|Good|-|1 +F|-|D|-|Unknown|-|1|-|9500|-|1|-|Unknown|-|1 +F|-|D|-|Unknown|-|1|-|10000|-|1|-|Unknown|-|1 +F|-|M|-|2 yr Degree|-|1|-|2500|-|1|-|Good|-|1 +F|-|M|-|2 yr Degree|-|1|-|2500|-|1|-|Unknown|-|1 +F|-|M|-|2 yr Degree|-|1|-|4500|-|1|-|High Risk|-|1 +F|-|M|-|2 yr Degree|-|1|-|5500|-|1|-|High Risk|-|1 +F|-|M|-|2 yr Degree|-|1|-|5500|-|1|-|Low Risk|-|1 +F|-|M|-|2 yr Degree|-|1|-|5500|-|1|-|Unknown|-|1 +F|-|M|-|4 yr Degree|-|1|-|1000|-|1|-|Good|-|1 +F|-|M|-|4 yr Degree|-|1|-|1000|-|1|-|Low Risk|-|1 +F|-|M|-|4 yr Degree|-|1|-|2000|-|1|-|Low Risk|-|1 +F|-|M|-|4 yr Degree|-|1|-|3500|-|1|-|Low Risk|-|1 +F|-|M|-|4 yr Degree|-|1|-|5000|-|1|-|Low Risk|-|1 +F|-|M|-|4 yr Degree|-|1|-|5500|-|1|-|Good|-|1 +F|-|M|-|4 yr Degree|-|1|-|7000|-|1|-|Good|-|1 +F|-|M|-|4 yr Degree|-|1|-|8500|-|1|-|Unknown|-|1 +F|-|M|-|4 yr Degree|-|1|-|9000|-|1|-|Low Risk|-|1 +F|-|M|-|Advanced Degree|-|1|-|1000|-|1|-|Low Risk|-|1 +F|-|M|-|Advanced Degree|-|1|-|3000|-|1|-|High Risk|-|1 +F|-|M|-|Advanced Degree|-|1|-|4000|-|1|-|Unknown|-|1 +F|-|M|-|Advanced Degree|-|1|-|5500|-|1|-|High Risk|-|1 +F|-|M|-|Advanced Degree|-|1|-|7000|-|1|-|Good|-|1 +F|-|M|-|Advanced Degree|-|1|-|8500|-|1|-|High Risk|-|1 +F|-|M|-|Advanced Degree|-|1|-|10000|-|1|-|High Risk|-|1 +F|-|M|-|College|-|1|-|2000|-|1|-|Good|-|1 +F|-|M|-|College|-|1|-|2500|-|1|-|Good|-|1 +F|-|M|-|College|-|2|-|2500|-|2|-|High Risk|-|2 +F|-|M|-|College|-|1|-|3500|-|1|-|Good|-|1 +F|-|M|-|College|-|1|-|3500|-|1|-|High Risk|-|1 +F|-|M|-|College|-|1|-|4500|-|1|-|Good|-|1 +F|-|M|-|College|-|1|-|4500|-|1|-|High Risk|-|1 +F|-|M|-|College|-|1|-|4500|-|1|-|Unknown|-|1 +F|-|M|-|College|-|1|-|5500|-|1|-|High Risk|-|1 +F|-|M|-|College|-|2|-|8000|-|2|-|High Risk|-|2 +F|-|M|-|College|-|1|-|9500|-|1|-|High Risk|-|1 +F|-|M|-|College|-|1|-|9500|-|1|-|Unknown|-|1 +F|-|M|-|College|-|1|-|10000|-|1|-|Low Risk|-|1 +F|-|M|-|Primary|-|1|-|2500|-|1|-|High Risk|-|1 +F|-|M|-|Primary|-|1|-|4000|-|1|-|High Risk|-|1 +F|-|M|-|Primary|-|1|-|7500|-|1|-|Unknown|-|1 +F|-|M|-|Primary|-|1|-|8000|-|1|-|Good|-|1 +F|-|M|-|Primary|-|1|-|8500|-|1|-|High Risk|-|1 +F|-|M|-|Primary|-|1|-|10000|-|1|-|High Risk|-|1 +F|-|M|-|Secondary|-|1|-|1500|-|1|-|Good|-|1 +F|-|M|-|Secondary|-|1|-|3000|-|1|-|Good|-|1 +F|-|M|-|Secondary|-|1|-|3000|-|1|-|Low Risk|-|1 +F|-|M|-|Secondary|-|1|-|5000|-|1|-|High Risk|-|1 +F|-|M|-|Secondary|-|1|-|8000|-|1|-|Low Risk|-|1 +F|-|M|-|Secondary|-|1|-|8500|-|1|-|Low Risk|-|1 +F|-|M|-|Secondary|-|1|-|9500|-|1|-|Unknown|-|1 +F|-|M|-|Unknown|-|1|-|2000|-|1|-|Low Risk|-|1 +F|-|M|-|Unknown|-|1|-|4000|-|1|-|Unknown|-|1 +F|-|M|-|Unknown|-|1|-|7000|-|1|-|Low Risk|-|1 +F|-|M|-|Unknown|-|1|-|8000|-|1|-|Unknown|-|1 +F|-|S|-|2 yr Degree|-|1|-|1500|-|1|-|High Risk|-|1 +F|-|S|-|2 yr Degree|-|1|-|2000|-|1|-|Low Risk|-|1 +F|-|S|-|2 yr Degree|-|1|-|2000|-|1|-|Unknown|-|1 +F|-|S|-|2 yr Degree|-|1|-|4500|-|1|-|Unknown|-|1 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q7.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q7.out new file mode 100644 index 0000000000000..2009915d5c352 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q7.out @@ -0,0 +1,100 @@ +AAAAAAAAAAABAAAA|-|67.0|-|37.520000|-|0.000000|-|24.010000 +AAAAAAAAAAACAAAA|-|34.0|-|89.610000|-|186.400000|-|32.250000 +AAAAAAAAAACCAAAA|-|69.0|-|31.085000|-|0.000000|-|7.825000 +AAAAAAAAAACDAAAA|-|36.0|-|107.280000|-|0.000000|-|66.205000 +AAAAAAAAAADBAAAA|-|21.0|-|74.470000|-|0.000000|-|44.680000 +AAAAAAAAAAEBAAAA|-|47.0|-|30.540000|-|125.010000|-|20.460000 +AAAAAAAAAAEEAAAA|-|26.5|-|100.840000|-|362.865000|-|44.030000 +AAAAAAAAAAFCAAAA|-|50.0|-|37.055000|-|0.000000|-|7.555000 +AAAAAAAAAAGBAAAA|-|14.0|-|55.130000|-|0.000000|-|50.160000 +AAAAAAAAAAHBAAAA|-|50.0|-|106.065000|-|0.000000|-|29.695000 +AAAAAAAAAAIAAAAA|-|98.0|-|134.490000|-|0.000000|-|51.100000 +AAAAAAAAAAIDAAAA|-|37.333333333333336|-|78.440000|-|0.000000|-|51.863333 +AAAAAAAAAAJBAAAA|-|55.0|-|131.290000|-|0.000000|-|36.760000 +AAAAAAAAAAKBAAAA|-|70.0|-|66.120000|-|0.000000|-|21.150000 +AAAAAAAAAALCAAAA|-|93.0|-|104.200000|-|0.000000|-|6.250000 +AAAAAAAAAALDAAAA|-|61.5|-|150.645000|-|0.000000|-|57.335000 +AAAAAAAAAANAAAAA|-|52.0|-|2.510000|-|0.000000|-|2.280000 +AAAAAAAAAAOAAAAA|-|23.5|-|17.590000|-|0.000000|-|12.130000 +AAAAAAAAAAOCAAAA|-|30.0|-|22.380000|-|0.000000|-|4.690000 +AAAAAAAAAAPCAAAA|-|92.0|-|75.630000|-|0.000000|-|64.280000 +AAAAAAAAABAAAAAA|-|10.0|-|45.790000|-|0.000000|-|43.950000 +AAAAAAAAABABAAAA|-|63.0|-|21.890000|-|0.000000|-|19.700000 +AAAAAAAAABBAAAAA|-|26.5|-|78.785000|-|0.000000|-|35.615000 +AAAAAAAAABBDAAAA|-|14.0|-|67.910000|-|0.000000|-|36.670000 +AAAAAAAAABCBAAAA|-|42.5|-|72.900000|-|0.000000|-|44.685000 +AAAAAAAAABCCAAAA|-|50.0|-|90.835000|-|0.000000|-|42.605000 +AAAAAAAAABDBAAAA|-|40.0|-|10.100000|-|0.000000|-|4.240000 +AAAAAAAAABDEAAAA|-|67.0|-|85.420000|-|0.000000|-|31.600000 +AAAAAAAAABECAAAA|-|78.5|-|36.280000|-|1673.320000|-|25.170000 +AAAAAAAAABEDAAAA|-|60.0|-|92.410000|-|2270.190000|-|58.210000 +AAAAAAAAABGAAAAA|-|57.0|-|11.390000|-|201.900000|-|3.980000 +AAAAAAAAABGDAAAA|-|74.0|-|174.750000|-|232.650000|-|5.240000 +AAAAAAAAABHDAAAA|-|34.5|-|120.730000|-|0.000000|-|61.460000 +AAAAAAAAABIBAAAA|-|4.0|-|12.680000|-|5.040000|-|10.520000 +AAAAAAAAABICAAAA|-|20.5|-|22.420000|-|0.000000|-|20.300000 +AAAAAAAAABJBAAAA|-|38.0|-|2.850000|-|0.000000|-|0.880000 +AAAAAAAAABKCAAAA|-|8.0|-|73.980000|-|0.000000|-|51.780000 +AAAAAAAAABLCAAAA|-|49.0|-|96.580000|-|0.000000|-|28.970000 +AAAAAAAAABMAAAAA|-|50.0|-|136.990000|-|838.320000|-|69.860000 +AAAAAAAAABMBAAAA|-|76.0|-|120.520000|-|0.000000|-|83.150000 +AAAAAAAAABNAAAAA|-|17.0|-|91.190000|-|0.000000|-|16.410000 +AAAAAAAAABNCAAAA|-|61.0|-|13.080000|-|16.650000|-|0.650000 +AAAAAAAAABPAAAAA|-|30.0|-|118.380000|-|623.160000|-|46.160000 +AAAAAAAAABPBAAAA|-|30.0|-|null|-|null|-|17.350000 +AAAAAAAAACAAAAAA|-|20.0|-|3.710000|-|0.000000|-|0.250000 +AAAAAAAAACACAAAA|-|66.0|-|117.590000|-|0.000000|-|34.100000 +AAAAAAAAACADAAAA|-|79.0|-|171.850000|-|0.000000|-|127.160000 +AAAAAAAAACBBAAAA|-|81.0|-|88.700000|-|0.000000|-|13.300000 +AAAAAAAAACBCAAAA|-|26.0|-|62.780000|-|1311.600000|-|61.520000 +AAAAAAAAACBEAAAA|-|60.0|-|84.015000|-|0.000000|-|33.495000 +AAAAAAAAACCAAAAA|-|35.0|-|12.120000|-|0.000000|-|11.630000 +AAAAAAAAACCDAAAA|-|2.0|-|72.740000|-|0.000000|-|64.730000 +AAAAAAAAACCEAAAA|-|79.0|-|34.120000|-|0.000000|-|6.820000 +AAAAAAAAACDCAAAA|-|69.5|-|61.120000|-|366.825000|-|19.985000 +AAAAAAAAACDDAAAA|-|61.5|-|122.735000|-|0.000000|-|72.035000 +AAAAAAAAACECAAAA|-|57.0|-|10.120000|-|0.000000|-|6.980000 +AAAAAAAAACEEAAAA|-|23.0|-|109.270000|-|0.000000|-|14.200000 +AAAAAAAAACGAAAAA|-|52.0|-|66.360000|-|0.000000|-|29.860000 +AAAAAAAAACGCAAAA|-|56.333333333333336|-|19.550000|-|0.000000|-|14.516667 +AAAAAAAAACGDAAAA|-|79.0|-|10.790000|-|0.000000|-|2.580000 +AAAAAAAAACHBAAAA|-|88.0|-|7.520000|-|0.000000|-|3.530000 +AAAAAAAAACIDAAAA|-|50.0|-|39.535000|-|106.335000|-|35.945000 +AAAAAAAAACJCAAAA|-|54.0|-|88.195000|-|0.000000|-|7.975000 +AAAAAAAAACKBAAAA|-|63.0|-|41.810000|-|0.000000|-|9.065000 +AAAAAAAAACKCAAAA|-|52.0|-|105.830000|-|0.000000|-|23.280000 +AAAAAAAAACLAAAAA|-|68.5|-|94.255000|-|0.000000|-|35.195000 +AAAAAAAAACLBAAAA|-|45.0|-|146.140000|-|0.000000|-|141.750000 +AAAAAAAAACLDAAAA|-|15.333333333333334|-|82.326667|-|0.000000|-|49.463333 +AAAAAAAAACMAAAAA|-|40.666666666666664|-|99.666667|-|0.000000|-|32.913333 +AAAAAAAAACMDAAAA|-|8.0|-|70.200000|-|0.000000|-|39.310000 +AAAAAAAAACNBAAAA|-|1.0|-|93.450000|-|0.000000|-|0.000000 +AAAAAAAAACNCAAAA|-|33.0|-|24.450000|-|0.000000|-|23.960000 +AAAAAAAAACOAAAAA|-|69.0|-|122.730000|-|0.000000|-|117.820000 +AAAAAAAAACOBAAAA|-|78.0|-|57.360000|-|912.600000|-|19.500000 +AAAAAAAAACPAAAAA|-|88.0|-|111.300000|-|0.000000|-|79.020000 +AAAAAAAAACPCAAAA|-|73.0|-|32.070000|-|645.860000|-|28.540000 +AAAAAAAAACPDAAAA|-|28.0|-|50.915000|-|21.165000|-|20.425000 +AAAAAAAAADABAAAA|-|44.5|-|93.920000|-|0.000000|-|8.950000 +AAAAAAAAADBAAAAA|-|13.0|-|148.450000|-|0.000000|-|120.240000 +AAAAAAAAADBBAAAA|-|93.0|-|86.110000|-|0.000000|-|5.160000 +AAAAAAAAADBDAAAA|-|12.0|-|62.510000|-|0.000000|-|9.370000 +AAAAAAAAADCCAAAA|-|60.333333333333336|-|36.260000|-|519.996667|-|23.366667 +AAAAAAAAADCDAAAA|-|96.0|-|133.100000|-|0.000000|-|106.480000 +AAAAAAAAADDCAAAA|-|22.5|-|22.625000|-|0.000000|-|6.820000 +AAAAAAAAADDEAAAA|-|38.0|-|79.190000|-|4526.140000|-|76.430000 +AAAAAAAAADEDAAAA|-|89.0|-|32.110000|-|0.000000|-|9.630000 +AAAAAAAAADEEAAAA|-|59.0|-|37.345000|-|122.570000|-|33.495000 +AAAAAAAAADFAAAAA|-|12.0|-|102.250000|-|0.000000|-|78.730000 +AAAAAAAAADFCAAAA|-|26.0|-|59.426667|-|46.066667|-|12.336667 +AAAAAAAAADFDAAAA|-|85.5|-|88.350000|-|0.000000|-|49.400000 +AAAAAAAAADGBAAAA|-|87.0|-|86.340000|-|0.000000|-|69.070000 +AAAAAAAAADGCAAAA|-|50.0|-|93.840000|-|0.000000|-|7.500000 +AAAAAAAAADHAAAAA|-|65.0|-|99.580000|-|0.000000|-|68.710000 +AAAAAAAAADIAAAAA|-|16.0|-|19.070000|-|0.000000|-|16.400000 +AAAAAAAAADICAAAA|-|96.0|-|45.780000|-|0.000000|-|0.450000 +AAAAAAAAADJBAAAA|-|31.0|-|7.040000|-|7.160000|-|0.770000 +AAAAAAAAADJCAAAA|-|31.0|-|40.720000|-|0.000000|-|29.630000 +AAAAAAAAADKBAAAA|-|17.0|-|4.780000|-|0.000000|-|0.330000 +AAAAAAAAADLAAAAA|-|9.0|-|185.300000|-|0.000000|-|101.910000 +AAAAAAAAADLCAAAA|-|69.0|-|60.230000|-|0.000000|-|35.530000 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q70.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q70.out new file mode 100644 index 0000000000000..4fac0344fd6d3 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q70.out @@ -0,0 +1,3 @@ +-435656177.80|-|null|-|null|-|2|-|1 +-435656177.80|-|TN|-|null|-|1|-|1 +-435656177.80|-|TN|-|Williamson County|-|0|-|1 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q71.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q71.out new file mode 100644 index 0000000000000..57ea8e52b7f7a --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q71.out @@ -0,0 +1,1139 @@ +9014008|-|edu packunivamalg #8|-|18|-|5|-|15594.00 +9003003|-|exportimaxi #3|-|18|-|53|-|15099.72 +1002002|-|importoamalg #2|-|17|-|26|-|14956.80 +9007003|-|brandmaxi #3|-|19|-|56|-|14695.56 +3004002|-|edu packexporti #2|-|19|-|9|-|14503.50 +1002002|-|importoamalg #2|-|19|-|22|-|14489.30 +1002002|-|importoamalg #2|-|6|-|42|-|14152.50 +2002001|-|importoimporto #1|-|19|-|28|-|14108.08 +7016008|-|corpnameless #8|-|9|-|20|-|13891.37 +3004002|-|edu packexporti #2|-|6|-|4|-|13851.07 +6011001|-|amalgbrand #1|-|8|-|18|-|13608.54 +10016002|-|corpamalgamalg #2|-|18|-|3|-|13229.25 +5003001|-|exportischolar #1|-|9|-|25|-|13225.41 +10007004|-|exportiamalg #2|-|17|-|51|-|13100.12 +4004002|-|edu packedu pack #2|-|8|-|46|-|12913.42 +4003001|-|corpnameless #4|-|17|-|43|-|12870.72 +5003001|-|exportischolar #1|-|7|-|28|-|12200.02 +2004001|-|importoexporti #2|-|17|-|45|-|11472.86 +9007003|-|brandmaxi #3|-|18|-|30|-|11364.08 +6005003|-|amalgbrand #2|-|17|-|42|-|11087.14 +4004002|-|edu packedu pack #2|-|17|-|49|-|11070.36 +7012007|-|importonameless #7|-|19|-|39|-|11014.92 +7002009|-|importobrand #9|-|19|-|56|-|10975.68 +6005004|-|scholarcorp #4|-|7|-|53|-|10930.92 +2004002|-|edu packimporto #2|-|17|-|5|-|10928.94 +3004002|-|edu packexporti #2|-|18|-|57|-|10894.00 +9003003|-|exportimaxi #3|-|6|-|3|-|10525.06 +2002001|-|amalgimporto #2|-|7|-|55|-|10383.24 +9003003|-|exportimaxi #3|-|19|-|1|-|10334.10 +4003001|-|scholarnameless #8|-|17|-|56|-|10267.74 +7006007|-|corpbrand #7|-|19|-|51|-|10158.72 +10015013|-|scholaramalgamalg #13|-|18|-|51|-|10049.58 +9009009|-|maximaxi #9|-|8|-|37|-|10044.28 +10009002|-|maxiunivamalg #2|-|18|-|45|-|9999.36 +7009001|-|corpamalgamalg #17|-|19|-|12|-|9834.24 +1002002|-|importoamalg #2|-|18|-|35|-|9772.45 +8002008|-|importonameless #8|-|9|-|40|-|9723.56 +9010002|-|univunivamalg #2|-|17|-|33|-|9714.24 +9009009|-|maximaxi #9|-|18|-|32|-|9695.84 +9012009|-|importounivamalg #9|-|17|-|36|-|9569.35 +2002002|-|importoimporto #2|-|18|-|53|-|9520.41 +2002001|-|exportiexporti #2|-|19|-|38|-|9515.76 +9016008|-|corpunivamalg #8|-|19|-|1|-|9510.60 +9012009|-|importounivamalg #9|-|17|-|4|-|9502.34 +3004001|-|edu packexporti #1|-|17|-|36|-|9489.04 +7015008|-|scholarnameless #8|-|7|-|32|-|9340.50 +8003007|-|brandcorp #2|-|8|-|15|-|9253.50 +8015004|-|scholarmaxi #4|-|18|-|37|-|9242.62 +4001001|-|amalgedu pack #1|-|18|-|58|-|9190.14 +3004001|-|edu packexporti #1|-|19|-|47|-|9141.00 +1001001|-|importoexporti #2|-|17|-|20|-|9114.23 +7015004|-|scholarnameless #4|-|19|-|28|-|9054.00 +10014005|-|edu packamalgamalg #5|-|18|-|0|-|9042.75 +9015011|-|exportibrand #2|-|19|-|34|-|8989.38 +4002002|-|importoedu pack #2|-|18|-|59|-|8949.12 +10005002|-|edu packedu pack #2|-|8|-|43|-|8674.20 +4004002|-|edu packedu pack #2|-|19|-|58|-|8613.12 +7013002|-|exportinameless #2|-|18|-|54|-|8539.74 +10010002|-|exportiexporti #2|-|17|-|22|-|8488.84 +6008001|-|namelesscorp #1|-|19|-|14|-|8470.63 +7015007|-|scholarnameless #7|-|19|-|35|-|8457.05 +6002008|-|importocorp #8|-|7|-|52|-|8359.47 +2002001|-|exportiexporti #2|-|17|-|56|-|8333.25 +3003001|-|exportiexporti #1|-|8|-|44|-|8281.68 +9003006|-|exportimaxi #6|-|17|-|28|-|8151.92 +2002001|-|exportiexporti #2|-|7|-|34|-|8147.92 +5003001|-|importonameless #6|-|19|-|26|-|8052.72 +10016002|-|corpamalgamalg #2|-|6|-|33|-|8015.04 +3004001|-|edu packexporti #1|-|18|-|3|-|7973.06 +6003005|-|edu packmaxi #6|-|9|-|31|-|7923.72 +4001001|-|amalgedu pack #1|-|9|-|15|-|7750.08 +1001001|-|importoexporti #2|-|6|-|59|-|7723.42 +4003001|-|exportiedu pack #1|-|19|-|12|-|7664.93 +10014005|-|edu packamalgamalg #5|-|8|-|8|-|7573.50 +1002002|-|importoamalg #2|-|9|-|42|-|7530.88 +8013009|-|exportimaxi #9|-|8|-|27|-|7497.60 +9003003|-|exportimaxi #3|-|8|-|35|-|7481.89 +9002005|-|amalgbrand #6|-|18|-|9|-|7472.70 +8010002|-|univmaxi #2|-|18|-|57|-|7456.54 +3004002|-|edu packexporti #2|-|19|-|29|-|7440.93 +9003006|-|exportimaxi #6|-|9|-|19|-|7380.12 +1004001|-|edu packbrand #2|-|9|-|6|-|7354.58 +6005004|-|scholarcorp #4|-|9|-|59|-|7317.02 +4002002|-|importoedu pack #2|-|7|-|32|-|7270.90 +1003001|-|exportiamalg #1|-|18|-|38|-|7231.66 +2004001|-|edu packimporto #1|-|19|-|24|-|7208.11 +10007004|-|exportiamalg #2|-|17|-|46|-|7146.28 +2004002|-|edu packimporto #2|-|17|-|48|-|7042.50 +7010009|-|univnameless #9|-|17|-|31|-|7015.41 +5003001|-|exportischolar #1|-|19|-|27|-|6945.12 +2004002|-|edu packimporto #2|-|19|-|45|-|6935.50 +4001001|-|amalgedu pack #1|-|18|-|50|-|6904.00 +10008008|-|importoexporti #2|-|9|-|2|-|6883.01 +9013003|-|exportiunivamalg #3|-|9|-|22|-|6876.10 +5001002|-|amalgscholar #2|-|9|-|56|-|6870.08 +4004002|-|edu packedu pack #2|-|19|-|48|-|6801.20 +5004002|-|edu packscholar #2|-|19|-|12|-|6796.00 +3004001|-|edu packexporti #1|-|19|-|53|-|6720.00 +8008006|-|namelessnameless #6|-|8|-|51|-|6650.28 +4002002|-|importoedu pack #2|-|19|-|39|-|6615.00 +4003001|-|scholarnameless #8|-|9|-|3|-|6595.05 +2002001|-|exportiexporti #2|-|8|-|2|-|6569.91 +2002002|-|importoimporto #2|-|8|-|2|-|6545.78 +7011010|-|amalgnameless #10|-|8|-|51|-|6480.96 +3003001|-|exportiexporti #1|-|8|-|25|-|6384.95 +3004002|-|edu packexporti #2|-|17|-|53|-|6337.64 +7006003|-|importobrand #6|-|19|-|58|-|6272.00 +4003002|-|exportiedu pack #2|-|19|-|37|-|6213.03 +7012008|-|importonameless #8|-|8|-|12|-|6190.80 +10009010|-|maxiunivamalg #10|-|17|-|31|-|6165.34 +8010002|-|univmaxi #2|-|18|-|54|-|6118.47 +3004002|-|edu packexporti #2|-|17|-|44|-|6080.78 +2002001|-|amalgimporto #2|-|19|-|22|-|6059.97 +9003003|-|exportimaxi #3|-|19|-|8|-|6055.20 +10008016|-|namelessunivamalg #16|-|17|-|53|-|6032.90 +6011003|-|amalgbrand #3|-|19|-|16|-|5973.59 +7014009|-|edu packedu pack #2|-|7|-|53|-|5972.40 +9003006|-|exportimaxi #6|-|19|-|58|-|5971.32 +7015004|-|scholarnameless #4|-|7|-|14|-|5951.88 +6003004|-|exporticorp #4|-|17|-|14|-|5862.06 +6015004|-|scholarbrand #4|-|18|-|51|-|5789.63 +5002002|-|importoscholar #2|-|19|-|51|-|5779.32 +2004001|-|edu packimporto #1|-|6|-|35|-|5745.42 +4001001|-|amalgedu pack #1|-|18|-|19|-|5729.22 +7014009|-|edu packedu pack #2|-|19|-|42|-|5727.40 +5003001|-|importonameless #6|-|19|-|9|-|5672.64 +2002002|-|importoimporto #2|-|9|-|9|-|5662.44 +3003001|-|exportiexporti #1|-|8|-|48|-|5647.05 +1002002|-|importoamalg #2|-|18|-|15|-|5629.69 +7012007|-|importonameless #7|-|19|-|48|-|5617.91 +2003002|-|exportiimporto #2|-|8|-|9|-|5573.80 +2003002|-|exportiimporto #2|-|18|-|29|-|5569.20 +1004001|-|edu packbrand #2|-|19|-|28|-|5521.37 +2001002|-|amalgimporto #2|-|8|-|7|-|5512.76 +2004002|-|edu packimporto #2|-|9|-|14|-|5489.10 +8006010|-|corpnameless #10|-|18|-|38|-|5466.00 +7011010|-|amalgnameless #10|-|18|-|18|-|5432.83 +3002001|-|importoexporti #1|-|9|-|8|-|5415.60 +4001001|-|amalgedu pack #1|-|18|-|10|-|5409.60 +1003002|-|exportiamalg #2|-|9|-|49|-|5352.46 +7010005|-|univnameless #5|-|6|-|30|-|5344.92 +4003002|-|exportiedu pack #2|-|9|-|8|-|5335.45 +7016008|-|corpnameless #8|-|18|-|50|-|5321.90 +2002002|-|importoimporto #2|-|18|-|42|-|5244.48 +4003001|-|exportiedu pack #1|-|8|-|59|-|5206.76 +9003003|-|exportimaxi #3|-|19|-|7|-|5173.51 +10009016|-|maxiunivamalg #16|-|17|-|45|-|5150.96 +10003008|-|exportiunivamalg #8|-|17|-|29|-|5143.51 +1004001|-|edu packbrand #2|-|19|-|12|-|5121.91 +4002001|-|edu packscholar #2|-|17|-|16|-|5112.89 +2001001|-|amalgimporto #1|-|9|-|11|-|5099.29 +6015004|-|scholarbrand #4|-|17|-|24|-|5086.74 +10007004|-|exportiamalg #2|-|18|-|15|-|5068.04 +10009010|-|maxiunivamalg #10|-|9|-|59|-|5062.75 +4003001|-|edu packimporto #2|-|18|-|6|-|5054.08 +4004002|-|edu packedu pack #2|-|9|-|8|-|5042.57 +4001001|-|amalgedu pack #1|-|19|-|21|-|5011.20 +4002002|-|importoedu pack #2|-|19|-|19|-|4998.00 +10010002|-|exportiexporti #2|-|19|-|41|-|4987.44 +8006010|-|corpnameless #10|-|17|-|52|-|4964.32 +7002009|-|importobrand #9|-|17|-|45|-|4941.20 +4003002|-|exportiedu pack #2|-|17|-|40|-|4867.66 +6009008|-|maxicorp #8|-|18|-|47|-|4861.60 +3003001|-|exportiexporti #1|-|18|-|57|-|4845.92 +5002002|-|importoscholar #2|-|17|-|42|-|4845.61 +4002001|-|importoedu pack #1|-|17|-|7|-|4834.80 +7010005|-|univnameless #5|-|9|-|40|-|4830.84 +7014010|-|edu packnameless #10|-|7|-|2|-|4824.53 +9015011|-|exportibrand #2|-|17|-|2|-|4813.44 +4001002|-|amalgedu pack #2|-|9|-|51|-|4809.12 +8014006|-|edu packmaxi #6|-|18|-|53|-|4770.15 +4001001|-|amalgedu pack #1|-|9|-|10|-|4757.60 +7014010|-|edu packnameless #10|-|9|-|51|-|4714.79 +3004001|-|edu packexporti #1|-|19|-|33|-|4695.60 +3001001|-|amalgexporti #1|-|17|-|35|-|4679.17 +6006005|-|exportiimporto #2|-|8|-|53|-|4622.22 +4003002|-|exportiedu pack #2|-|18|-|47|-|4622.00 +10014001|-|edu packamalgamalg #1|-|17|-|10|-|4610.74 +10013010|-|exportiamalgamalg #10|-|18|-|30|-|4599.78 +7009003|-|maxibrand #3|-|18|-|40|-|4560.36 +7002002|-|importobrand #2|-|19|-|23|-|4559.79 +9003003|-|exportimaxi #3|-|9|-|10|-|4488.48 +4002001|-|importoedu pack #1|-|19|-|25|-|4388.15 +2002002|-|importoimporto #2|-|19|-|8|-|4384.12 +6005003|-|amalgbrand #2|-|19|-|0|-|4380.60 +1002002|-|importoamalg #2|-|17|-|23|-|4376.21 +9014008|-|edu packunivamalg #8|-|9|-|8|-|4347.90 +7011010|-|amalgnameless #10|-|19|-|47|-|4322.76 +4003001|-|edu packimporto #2|-|8|-|26|-|4305.15 +9003003|-|exportimaxi #3|-|8|-|49|-|4303.80 +2002002|-|importoimporto #2|-|18|-|29|-|4269.16 +10014005|-|edu packamalgamalg #5|-|9|-|45|-|4239.40 +10015013|-|scholaramalgamalg #13|-|19|-|21|-|4234.60 +10014005|-|edu packamalgamalg #5|-|18|-|44|-|4230.00 +7006005|-|corpbrand #5|-|8|-|35|-|4211.44 +8003007|-|brandcorp #2|-|18|-|31|-|4209.80 +3002001|-|edu packedu pack #2|-|9|-|53|-|4187.57 +3003002|-|exportiexporti #2|-|19|-|48|-|4181.32 +7014009|-|amalgbrand #6|-|7|-|33|-|4171.44 +3001001|-|amalgexporti #1|-|9|-|29|-|4141.26 +9008003|-|namelessmaxi #3|-|6|-|53|-|4118.25 +10007004|-|exportiamalg #2|-|18|-|4|-|4110.46 +6005003|-|amalgbrand #2|-|9|-|38|-|4081.77 +3003002|-|exportiexporti #2|-|18|-|38|-|4077.12 +2001001|-|amalgimporto #1|-|19|-|31|-|4029.84 +6002008|-|importocorp #8|-|9|-|22|-|4026.02 +3004002|-|edu packexporti #2|-|9|-|34|-|4015.50 +1003001|-|exportiamalg #1|-|7|-|21|-|4002.29 +8010002|-|univmaxi #2|-|18|-|28|-|3991.50 +9002005|-|amalgbrand #6|-|19|-|58|-|3966.57 +1001001|-|amalgamalg #1|-|18|-|49|-|3927.30 +10010002|-|exportiexporti #2|-|17|-|23|-|3922.74 +7014009|-|amalgbrand #6|-|18|-|40|-|3919.80 +9015011|-|exportibrand #2|-|18|-|49|-|3884.40 +9014008|-|edu packunivamalg #8|-|17|-|39|-|3869.64 +6003004|-|exporticorp #4|-|17|-|31|-|3857.04 +2001001|-|amalgimporto #1|-|9|-|47|-|3850.24 +1001001|-|amalgamalg #1|-|17|-|50|-|3834.81 +2004001|-|edu packimporto #1|-|17|-|2|-|3808.49 +3003002|-|exportiexporti #2|-|18|-|43|-|3802.89 +6003005|-|edu packmaxi #6|-|9|-|19|-|3796.20 +8014006|-|edu packmaxi #6|-|19|-|55|-|3789.72 +2001001|-|amalgimporto #1|-|17|-|33|-|3778.60 +4001001|-|amalgedu pack #1|-|19|-|25|-|3769.71 +7010005|-|univnameless #5|-|17|-|42|-|3752.99 +2001001|-|amalgimporto #1|-|7|-|38|-|3737.30 +4002001|-|importoedu pack #1|-|18|-|4|-|3734.88 +2004001|-|importoexporti #2|-|19|-|0|-|3728.01 +10009002|-|maxiunivamalg #2|-|9|-|20|-|3694.60 +10005002|-|exportiimporto #2|-|19|-|15|-|3690.00 +2004001|-|edu packimporto #1|-|9|-|23|-|3684.45 +4003002|-|exportiedu pack #2|-|9|-|31|-|3671.50 +8003006|-|exportinameless #6|-|8|-|2|-|3663.86 +6011001|-|amalgbrand #1|-|8|-|0|-|3662.12 +8010001|-|univmaxi #1|-|17|-|36|-|3653.10 +7009008|-|maxibrand #8|-|18|-|41|-|3652.84 +9004008|-|edu packmaxi #8|-|18|-|36|-|3651.99 +4001001|-|amalgedu pack #1|-|9|-|28|-|3642.12 +2003002|-|exportiimporto #2|-|17|-|13|-|3636.00 +8003006|-|exportinameless #6|-|19|-|46|-|3617.60 +5003001|-|exportischolar #1|-|18|-|7|-|3583.60 +4003001|-|edu packimporto #2|-|7|-|3|-|3580.80 +9013003|-|exportiunivamalg #3|-|17|-|1|-|3564.78 +6008004|-|namelesscorp #4|-|9|-|26|-|3560.14 +8014006|-|edu packmaxi #6|-|17|-|28|-|3551.60 +8002008|-|importonameless #8|-|19|-|1|-|3540.98 +7005006|-|scholarbrand #6|-|9|-|17|-|3530.73 +10008008|-|importoexporti #2|-|8|-|42|-|3529.25 +7004008|-|edu packbrand #8|-|17|-|25|-|3527.30 +3003001|-|exportinameless #4|-|18|-|8|-|3516.39 +7010009|-|univnameless #9|-|17|-|52|-|3501.54 +7014009|-|amalgbrand #6|-|9|-|14|-|3459.51 +5002001|-|importoscholar #1|-|19|-|13|-|3453.55 +2004002|-|edu packimporto #2|-|8|-|3|-|3436.56 +1004002|-|edu packamalg #2|-|18|-|9|-|3409.53 +4004002|-|edu packedu pack #2|-|18|-|23|-|3388.35 +5002001|-|importoscholar #1|-|8|-|35|-|3382.20 +6006006|-|corpcorp #6|-|19|-|54|-|3379.62 +8002008|-|importonameless #8|-|18|-|47|-|3377.70 +7014010|-|edu packnameless #10|-|19|-|25|-|3362.31 +4004002|-|edu packedu pack #2|-|17|-|15|-|3351.41 +6003004|-|exporticorp #4|-|19|-|58|-|3323.10 +9013003|-|exportiunivamalg #3|-|19|-|46|-|3320.38 +7014010|-|edu packnameless #10|-|9|-|44|-|3315.88 +2001001|-|exportiexporti #2|-|9|-|34|-|3314.07 +2004001|-|edu packimporto #1|-|19|-|31|-|3310.56 +4002001|-|importoedu pack #1|-|18|-|37|-|3297.91 +10010002|-|exportiexporti #2|-|9|-|10|-|3268.76 +9013003|-|exportiunivamalg #3|-|19|-|13|-|3253.14 +9007003|-|brandmaxi #3|-|17|-|25|-|3249.33 +6005004|-|scholarcorp #4|-|18|-|48|-|3235.50 +4003001|-|corpnameless #4|-|18|-|37|-|3231.04 +9001003|-|amalgmaxi #3|-|18|-|29|-|3211.33 +3003002|-|exportiexporti #2|-|9|-|21|-|3196.96 +7010005|-|univnameless #5|-|17|-|11|-|3193.33 +2002001|-|importoimporto #1|-|9|-|51|-|3177.53 +5003001|-|exportischolar #1|-|9|-|52|-|3173.76 +4004002|-|edu packedu pack #2|-|18|-|28|-|3173.16 +4002002|-|importoedu pack #2|-|8|-|14|-|3165.00 +1003001|-|exportiamalg #1|-|18|-|26|-|3159.45 +7006005|-|corpbrand #5|-|7|-|17|-|3137.00 +2004002|-|edu packimporto #2|-|9|-|4|-|3104.40 +5002001|-|importoscholar #1|-|19|-|16|-|3064.96 +7016008|-|corpnameless #8|-|19|-|24|-|3056.40 +7014009|-|amalgbrand #6|-|19|-|30|-|3055.92 +2004002|-|edu packimporto #2|-|9|-|1|-|3049.20 +6011003|-|amalgbrand #3|-|18|-|44|-|3048.61 +7015004|-|scholarnameless #4|-|9|-|47|-|3030.12 +10005002|-|edu packedu pack #2|-|8|-|18|-|3018.34 +7015007|-|scholarnameless #7|-|7|-|25|-|3011.40 +2004002|-|edu packimporto #2|-|9|-|34|-|3006.14 +6005004|-|scholarcorp #4|-|17|-|38|-|3000.66 +9001003|-|amalgmaxi #3|-|18|-|52|-|2993.67 +3004001|-|edu packexporti #1|-|7|-|40|-|2989.56 +4004002|-|edu packedu pack #2|-|6|-|48|-|2988.80 +10013006|-|exportiamalgamalg #6|-|18|-|37|-|2950.50 +8002008|-|importonameless #8|-|19|-|13|-|2938.08 +3004001|-|edu packexporti #1|-|6|-|18|-|2933.35 +4001001|-|amalgedu pack #1|-|17|-|19|-|2929.58 +6005004|-|scholarcorp #4|-|19|-|30|-|2925.36 +6003005|-|edu packmaxi #6|-|19|-|26|-|2920.77 +7009001|-|corpamalgamalg #17|-|9|-|12|-|2909.72 +1002002|-|importoamalg #2|-|18|-|51|-|2889.76 +4003001|-|exportiedu pack #1|-|18|-|46|-|2887.00 +4003001|-|corpnameless #4|-|9|-|15|-|2870.10 +2002002|-|importoimporto #2|-|19|-|4|-|2845.92 +1003001|-|exportiamalg #1|-|9|-|23|-|2828.08 +5001002|-|amalgscholar #2|-|9|-|3|-|2828.00 +7013002|-|exportinameless #2|-|18|-|14|-|2815.88 +3002001|-|importoexporti #1|-|19|-|29|-|2804.40 +5002002|-|importoscholar #2|-|9|-|21|-|2801.91 +3003001|-|exportiexporti #1|-|18|-|10|-|2798.59 +5001002|-|amalgscholar #2|-|17|-|58|-|2795.00 +1004002|-|edu packamalg #2|-|17|-|59|-|2794.98 +2004002|-|edu packimporto #2|-|18|-|47|-|2788.31 +4001002|-|amalgedu pack #2|-|9|-|48|-|2784.00 +6011003|-|amalgbrand #3|-|17|-|49|-|2769.35 +2001001|-|amalgimporto #1|-|9|-|51|-|2763.13 +10013006|-|exportiamalgamalg #6|-|17|-|21|-|2758.72 +2002002|-|importoimporto #2|-|19|-|35|-|2751.00 +4004002|-|edu packedu pack #2|-|19|-|51|-|2746.60 +2001002|-|amalgimporto #2|-|19|-|2|-|2728.61 +7011010|-|amalgnameless #10|-|9|-|30|-|2717.82 +4001001|-|amalgedu pack #1|-|9|-|30|-|2701.80 +5003001|-|importonameless #6|-|8|-|50|-|2697.30 +8013009|-|exportimaxi #9|-|18|-|9|-|2694.60 +6006005|-|exportiimporto #2|-|18|-|5|-|2681.07 +6006005|-|exportiimporto #2|-|18|-|40|-|2675.10 +10016002|-|corpamalgamalg #2|-|6|-|25|-|2673.93 +7012008|-|importonameless #8|-|18|-|12|-|2666.37 +8003006|-|exportinameless #6|-|17|-|46|-|2645.88 +6009008|-|maxicorp #8|-|9|-|52|-|2644.17 +3002001|-|edu packedu pack #2|-|8|-|25|-|2640.62 +2002001|-|exportiexporti #2|-|18|-|33|-|2632.20 +7016008|-|corpnameless #8|-|8|-|25|-|2620.80 +9005002|-|scholarmaxi #2|-|18|-|0|-|2619.19 +4001002|-|amalgedu pack #2|-|7|-|3|-|2603.61 +4004002|-|edu packedu pack #2|-|9|-|10|-|2596.32 +3002002|-|importoexporti #2|-|18|-|9|-|2584.28 +1003002|-|exportiamalg #2|-|17|-|12|-|2570.97 +9016003|-|corpunivamalg #3|-|18|-|4|-|2545.20 +7015004|-|scholarnameless #4|-|9|-|32|-|2540.42 +6015004|-|scholarbrand #4|-|18|-|39|-|2535.26 +10010002|-|exportiexporti #2|-|17|-|14|-|2503.72 +4002001|-|edu packscholar #2|-|19|-|14|-|2499.20 +7010005|-|univnameless #5|-|7|-|56|-|2491.00 +4001001|-|amalgedu pack #1|-|17|-|30|-|2489.50 +3003002|-|exportiexporti #2|-|19|-|7|-|2480.00 +2002002|-|importoimporto #2|-|9|-|1|-|2445.56 +4001002|-|amalgedu pack #2|-|17|-|0|-|2444.64 +10008008|-|importoexporti #2|-|19|-|58|-|2442.40 +4003001|-|corpnameless #4|-|17|-|44|-|2438.52 +3004001|-|edu packexporti #1|-|17|-|16|-|2437.12 +1001001|-|amalgamalg #1|-|8|-|5|-|2404.83 +2002001|-|amalgimporto #2|-|17|-|16|-|2399.82 +4004002|-|edu packedu pack #2|-|9|-|11|-|2394.55 +8005004|-|scholarnameless #4|-|18|-|27|-|2385.54 +7005006|-|scholarbrand #6|-|19|-|41|-|2382.90 +2001001|-|amalgimporto #1|-|17|-|16|-|2376.14 +7014010|-|edu packnameless #10|-|19|-|8|-|2374.54 +4001001|-|amalgedu pack #1|-|18|-|5|-|2367.09 +2004001|-|importoexporti #2|-|17|-|44|-|2360.28 +7016008|-|corpnameless #8|-|17|-|17|-|2353.05 +10007004|-|exportiamalg #2|-|19|-|15|-|2348.72 +1002002|-|importoamalg #2|-|6|-|38|-|2348.64 +7009001|-|corpamalgamalg #17|-|18|-|50|-|2335.20 +2004002|-|edu packimporto #2|-|19|-|12|-|2334.96 +10014001|-|edu packamalgamalg #1|-|19|-|4|-|2319.00 +7005006|-|scholarbrand #6|-|9|-|11|-|2314.78 +9003003|-|exportimaxi #3|-|6|-|53|-|2308.75 +3001001|-|amalgexporti #1|-|18|-|13|-|2306.88 +7010009|-|univnameless #9|-|9|-|59|-|2298.80 +2001001|-|amalgimporto #1|-|17|-|37|-|2297.28 +7011010|-|amalgnameless #10|-|8|-|20|-|2295.72 +3004002|-|edu packexporti #2|-|6|-|40|-|2289.21 +7015004|-|scholarnameless #4|-|17|-|57|-|2286.40 +4004002|-|edu packedu pack #2|-|18|-|30|-|2285.28 +4002001|-|importoedu pack #1|-|19|-|20|-|2281.44 +5003001|-|exportischolar #1|-|6|-|31|-|2279.75 +4001001|-|amalgedu pack #1|-|17|-|6|-|2273.85 +7014009|-|edu packedu pack #2|-|8|-|20|-|2261.95 +7014009|-|amalgbrand #6|-|6|-|31|-|2251.04 +4001001|-|amalgedu pack #1|-|9|-|48|-|2237.75 +1001001|-|importoexporti #2|-|6|-|47|-|2230.60 +10007004|-|exportiamalg #2|-|6|-|59|-|2229.01 +10007004|-|exportiamalg #2|-|17|-|0|-|2210.39 +2002002|-|importoimporto #2|-|8|-|12|-|2208.64 +6005004|-|scholarcorp #4|-|9|-|56|-|2196.00 +4001001|-|amalgedu pack #1|-|19|-|49|-|2195.65 +10001007|-|amalgunivamalg #7|-|19|-|1|-|2193.60 +9001003|-|amalgmaxi #3|-|19|-|37|-|2187.66 +7014009|-|edu packedu pack #2|-|17|-|42|-|2181.00 +2004001|-|edu packimporto #1|-|17|-|8|-|2173.48 +7015004|-|scholarnameless #4|-|19|-|35|-|2172.24 +10008006|-|namelessunivamalg #6|-|9|-|57|-|2167.62 +10013006|-|exportiamalgamalg #6|-|17|-|22|-|2167.20 +6005004|-|scholarcorp #4|-|9|-|26|-|2153.00 +5001002|-|amalgscholar #2|-|17|-|37|-|2150.78 +7009001|-|corpamalgamalg #17|-|19|-|1|-|2137.08 +2002001|-|amalgimporto #2|-|9|-|8|-|2134.86 +8006010|-|corpnameless #10|-|18|-|44|-|2134.08 +10007004|-|exportiamalg #2|-|18|-|43|-|2127.15 +6006005|-|exportiimporto #2|-|17|-|19|-|2106.30 +10007004|-|exportiamalg #2|-|19|-|21|-|2099.31 +5002002|-|importoscholar #2|-|9|-|55|-|2099.00 +8010001|-|univmaxi #1|-|19|-|17|-|2097.56 +1003002|-|exportiamalg #2|-|19|-|35|-|2087.40 +1002002|-|importoamalg #2|-|17|-|4|-|2086.83 +2001001|-|exportiexporti #2|-|8|-|30|-|2082.16 +10013006|-|exportiamalgamalg #6|-|19|-|9|-|2064.48 +6005004|-|scholarcorp #4|-|17|-|34|-|2064.24 +8005004|-|scholarnameless #4|-|7|-|29|-|2056.32 +4003001|-|edu packimporto #2|-|17|-|55|-|2047.24 +8002008|-|importonameless #8|-|17|-|19|-|2045.67 +4001001|-|amalgedu pack #1|-|8|-|15|-|2040.50 +7009003|-|maxibrand #3|-|19|-|18|-|2039.70 +8015004|-|scholarmaxi #4|-|18|-|49|-|2038.92 +9003003|-|exportimaxi #3|-|19|-|20|-|2037.10 +3004001|-|edu packexporti #1|-|18|-|43|-|2035.11 +3002001|-|edu packedu pack #2|-|17|-|50|-|2029.50 +2002001|-|exportiexporti #2|-|8|-|15|-|2020.96 +8014006|-|edu packmaxi #6|-|17|-|58|-|2019.40 +4002001|-|importoedu pack #1|-|9|-|57|-|2011.24 +5003001|-|importonameless #6|-|6|-|57|-|2010.54 +8005004|-|scholarnameless #4|-|17|-|52|-|2007.09 +8008006|-|namelessnameless #6|-|6|-|35|-|2005.08 +3002002|-|importoexporti #2|-|8|-|2|-|1984.70 +4002001|-|importoedu pack #1|-|17|-|25|-|1984.32 +10005002|-|edu packedu pack #2|-|9|-|26|-|1970.64 +2004001|-|edu packimporto #1|-|17|-|30|-|1965.71 +9002011|-|brandbrand #6|-|19|-|45|-|1955.00 +5003001|-|exportischolar #1|-|19|-|7|-|1954.56 +1002002|-|importoamalg #2|-|8|-|11|-|1951.56 +9010002|-|univunivamalg #2|-|19|-|14|-|1946.50 +7004008|-|edu packbrand #8|-|18|-|13|-|1939.74 +10008016|-|namelessunivamalg #16|-|9|-|42|-|1931.80 +1001002|-|amalgamalg #2|-|8|-|29|-|1922.90 +3001001|-|amalgexporti #1|-|8|-|19|-|1918.28 +2004002|-|edu packimporto #2|-|9|-|44|-|1914.84 +4001002|-|amalgedu pack #2|-|17|-|6|-|1908.80 +7009003|-|maxibrand #3|-|17|-|5|-|1895.40 +7014010|-|edu packnameless #10|-|17|-|9|-|1893.62 +9008003|-|namelessmaxi #3|-|18|-|53|-|1887.84 +9008003|-|namelessmaxi #3|-|9|-|13|-|1885.08 +1002002|-|importoamalg #2|-|17|-|38|-|1880.36 +6006006|-|corpcorp #6|-|9|-|26|-|1873.50 +4002001|-|importoedu pack #1|-|19|-|43|-|1870.87 +7015004|-|scholarnameless #4|-|17|-|33|-|1866.22 +7015008|-|scholarnameless #8|-|18|-|36|-|1850.40 +7015008|-|scholarnameless #8|-|18|-|14|-|1848.24 +6005004|-|scholarcorp #4|-|17|-|36|-|1845.22 +9004008|-|edu packmaxi #8|-|9|-|49|-|1844.22 +4002001|-|importoedu pack #1|-|18|-|54|-|1833.79 +8014006|-|edu packmaxi #6|-|18|-|37|-|1823.54 +4002001|-|importoedu pack #1|-|17|-|23|-|1817.71 +7005006|-|scholarbrand #6|-|9|-|36|-|1816.40 +4003001|-|exportiedu pack #1|-|18|-|47|-|1811.64 +9013003|-|exportiunivamalg #3|-|19|-|23|-|1809.36 +1001002|-|amalgamalg #2|-|18|-|40|-|1806.90 +9003006|-|exportimaxi #6|-|19|-|57|-|1804.88 +2004001|-|edu packimporto #1|-|9|-|57|-|1795.64 +4004002|-|edu packedu pack #2|-|9|-|0|-|1794.24 +2002002|-|importoimporto #2|-|7|-|41|-|1786.98 +3001001|-|amalgexporti #1|-|18|-|47|-|1773.20 +7006007|-|corpbrand #7|-|19|-|38|-|1770.30 +2002002|-|importoimporto #2|-|9|-|21|-|1768.87 +2004001|-|edu packimporto #1|-|17|-|13|-|1768.68 +8006010|-|corpnameless #10|-|8|-|3|-|1762.90 +10001007|-|amalgunivamalg #7|-|19|-|25|-|1760.85 +2004002|-|edu packimporto #2|-|17|-|16|-|1750.00 +8002007|-|importonameless #7|-|17|-|15|-|1747.98 +3002001|-|importoexporti #1|-|9|-|44|-|1737.45 +7012007|-|importonameless #7|-|8|-|45|-|1734.48 +9009009|-|maximaxi #9|-|18|-|26|-|1720.86 +2004001|-|edu packimporto #1|-|8|-|36|-|1717.96 +8015004|-|scholarmaxi #4|-|19|-|15|-|1715.70 +2001001|-|amalgimporto #1|-|8|-|33|-|1711.50 +2002002|-|importoimporto #2|-|18|-|45|-|1708.35 +8010001|-|univmaxi #1|-|19|-|46|-|1703.76 +3003002|-|exportiexporti #2|-|19|-|33|-|1703.24 +10008006|-|namelessunivamalg #6|-|17|-|57|-|1695.12 +8002007|-|importonameless #7|-|18|-|30|-|1693.12 +10014001|-|edu packamalgamalg #1|-|17|-|16|-|1688.58 +5004002|-|edu packscholar #2|-|19|-|33|-|1682.38 +7014010|-|edu packnameless #10|-|19|-|52|-|1680.75 +1002001|-|importoamalg #1|-|18|-|54|-|1680.20 +9008003|-|namelessmaxi #3|-|8|-|25|-|1675.96 +9013003|-|exportiunivamalg #3|-|17|-|39|-|1663.36 +5003001|-|importonameless #6|-|19|-|13|-|1653.36 +6006005|-|exportiimporto #2|-|17|-|6|-|1646.84 +7002009|-|importobrand #9|-|19|-|1|-|1645.20 +9001003|-|amalgmaxi #3|-|18|-|33|-|1640.00 +4004002|-|edu packedu pack #2|-|18|-|37|-|1638.30 +7005006|-|scholarbrand #6|-|17|-|9|-|1622.70 +2004001|-|edu packimporto #1|-|17|-|28|-|1622.32 +7010005|-|univnameless #5|-|17|-|19|-|1621.62 +6008001|-|namelesscorp #1|-|17|-|20|-|1614.17 +1001001|-|amalgamalg #1|-|18|-|54|-|1609.92 +5003001|-|importonameless #6|-|17|-|26|-|1607.76 +5003001|-|exportischolar #1|-|8|-|9|-|1605.24 +4003001|-|scholarnameless #8|-|19|-|34|-|1599.78 +8010001|-|univmaxi #1|-|17|-|16|-|1595.70 +9003006|-|exportimaxi #6|-|17|-|17|-|1584.83 +10009010|-|maxiunivamalg #10|-|7|-|42|-|1577.10 +2001002|-|amalgimporto #2|-|18|-|11|-|1573.20 +5004002|-|edu packscholar #2|-|17|-|16|-|1561.68 +5004002|-|edu packscholar #2|-|9|-|9|-|1555.16 +7009003|-|maxibrand #3|-|8|-|31|-|1551.73 +9016008|-|corpunivamalg #8|-|17|-|10|-|1541.80 +4002001|-|importoedu pack #1|-|7|-|53|-|1533.29 +3003002|-|exportiexporti #2|-|9|-|23|-|1526.50 +7002009|-|importobrand #9|-|19|-|25|-|1521.30 +6011003|-|amalgbrand #3|-|7|-|33|-|1518.29 +1004001|-|edu packbrand #2|-|19|-|7|-|1501.91 +7014010|-|edu packnameless #10|-|19|-|24|-|1500.72 +8008006|-|namelessnameless #6|-|6|-|57|-|1493.04 +4003001|-|exportiedu pack #1|-|9|-|45|-|1486.52 +10009016|-|maxiunivamalg #16|-|17|-|11|-|1482.78 +1002002|-|importoamalg #2|-|18|-|36|-|1479.53 +6006005|-|exportiimporto #2|-|18|-|54|-|1474.40 +10008008|-|importoexporti #2|-|17|-|33|-|1470.40 +6005003|-|amalgbrand #2|-|9|-|10|-|1447.68 +5003001|-|importonameless #6|-|8|-|56|-|1441.44 +1003002|-|exportiamalg #2|-|17|-|24|-|1439.20 +9015011|-|exportibrand #2|-|9|-|51|-|1433.64 +4003001|-|exportiedu pack #1|-|18|-|0|-|1431.90 +8003007|-|brandcorp #2|-|18|-|56|-|1428.94 +2002002|-|importoimporto #2|-|17|-|0|-|1422.30 +4001001|-|amalgedu pack #1|-|17|-|14|-|1413.03 +4002001|-|importoedu pack #1|-|8|-|29|-|1412.32 +4001001|-|amalgedu pack #1|-|17|-|24|-|1405.24 +3003001|-|exportinameless #4|-|18|-|38|-|1403.60 +9008003|-|namelessmaxi #3|-|18|-|13|-|1402.20 +9014008|-|edu packunivamalg #8|-|8|-|46|-|1399.71 +2004002|-|edu packimporto #2|-|8|-|24|-|1399.68 +4003001|-|edu packimporto #2|-|17|-|20|-|1395.52 +2002001|-|amalgimporto #2|-|8|-|55|-|1391.65 +6011001|-|amalgbrand #1|-|18|-|11|-|1385.10 +3003002|-|exportiexporti #2|-|6|-|28|-|1383.68 +7006003|-|importobrand #6|-|19|-|33|-|1382.74 +7002009|-|importobrand #9|-|17|-|32|-|1376.97 +3004002|-|edu packexporti #2|-|19|-|27|-|1372.28 +1004002|-|edu packamalg #2|-|6|-|42|-|1370.25 +3004002|-|edu packexporti #2|-|17|-|32|-|1359.59 +9003003|-|exportimaxi #3|-|19|-|19|-|1354.24 +1001001|-|importoexporti #2|-|9|-|16|-|1351.25 +9003003|-|exportimaxi #3|-|17|-|10|-|1348.05 +8008006|-|namelessnameless #6|-|18|-|13|-|1341.90 +7010009|-|univnameless #9|-|19|-|15|-|1334.16 +10003008|-|exportiunivamalg #8|-|19|-|33|-|1332.26 +10016008|-|corpamalgamalg #8|-|18|-|32|-|1332.00 +4001001|-|amalgedu pack #1|-|18|-|23|-|1331.26 +6005004|-|scholarcorp #4|-|17|-|45|-|1327.20 +3002001|-|importoexporti #1|-|18|-|43|-|1323.00 +10015013|-|scholaramalgamalg #13|-|17|-|25|-|1322.88 +5003001|-|exportischolar #1|-|19|-|22|-|1315.70 +1001002|-|amalgamalg #2|-|19|-|41|-|1315.50 +2001001|-|exportiexporti #2|-|8|-|52|-|1307.20 +7005006|-|scholarbrand #6|-|9|-|39|-|1305.70 +10014001|-|edu packamalgamalg #1|-|17|-|24|-|1298.50 +8006010|-|corpnameless #10|-|19|-|34|-|1294.65 +3003001|-|exportiexporti #1|-|17|-|21|-|1286.52 +7011010|-|amalgnameless #10|-|8|-|39|-|1281.96 +10009002|-|maxiunivamalg #2|-|6|-|19|-|1273.16 +7006007|-|corpbrand #7|-|19|-|56|-|1265.82 +7015008|-|scholarnameless #8|-|9|-|19|-|1263.90 +8004002|-|edu packnameless #2|-|8|-|38|-|1263.42 +10008008|-|importoexporti #2|-|19|-|23|-|1260.72 +2004002|-|edu packimporto #2|-|19|-|52|-|1259.26 +4003001|-|scholarnameless #8|-|9|-|25|-|1249.50 +9002011|-|brandbrand #6|-|18|-|51|-|1245.50 +6006006|-|corpcorp #6|-|18|-|3|-|1241.72 +6008001|-|namelesscorp #1|-|17|-|44|-|1236.27 +1001002|-|amalgamalg #2|-|17|-|15|-|1227.20 +9002011|-|brandbrand #6|-|19|-|49|-|1218.87 +null|-|null|-|17|-|37|-|1212.00 +4003001|-|corpnameless #4|-|18|-|24|-|1206.63 +9003003|-|exportimaxi #3|-|17|-|45|-|1198.46 +5003001|-|exportischolar #1|-|9|-|34|-|1187.67 +4003001|-|edu packimporto #2|-|18|-|10|-|1185.92 +4003001|-|edu packimporto #2|-|19|-|20|-|1182.20 +3001001|-|amalgexporti #1|-|8|-|16|-|1181.64 +10014005|-|edu packamalgamalg #5|-|17|-|52|-|1170.40 +4003002|-|exportiedu pack #2|-|9|-|7|-|1167.48 +10016008|-|corpamalgamalg #8|-|19|-|34|-|1166.37 +5003001|-|exportischolar #1|-|8|-|37|-|1163.94 +10014001|-|edu packamalgamalg #1|-|8|-|15|-|1157.20 +10008016|-|namelessunivamalg #16|-|8|-|2|-|1154.52 +3004001|-|edu packexporti #1|-|17|-|59|-|1150.05 +4004002|-|edu packedu pack #2|-|19|-|7|-|1144.36 +9014008|-|edu packunivamalg #8|-|17|-|30|-|1141.25 +9016003|-|corpunivamalg #3|-|9|-|44|-|1132.71 +4003001|-|corpnameless #4|-|17|-|2|-|1128.16 +2004002|-|edu packimporto #2|-|18|-|26|-|1123.07 +9002005|-|amalgbrand #6|-|19|-|33|-|1122.59 +8008006|-|namelessnameless #6|-|8|-|39|-|1118.28 +2003002|-|exportiimporto #2|-|18|-|53|-|1114.01 +2004002|-|edu packimporto #2|-|7|-|28|-|1113.53 +6008004|-|namelesscorp #4|-|9|-|41|-|1111.80 +3003001|-|exportiexporti #1|-|19|-|12|-|1110.12 +10005002|-|exportiimporto #2|-|17|-|58|-|1106.85 +10014005|-|edu packamalgamalg #5|-|8|-|38|-|1100.32 +1002002|-|importoamalg #2|-|6|-|47|-|1099.68 +2004001|-|edu packimporto #1|-|18|-|38|-|1098.90 +8005004|-|scholarnameless #4|-|18|-|11|-|1098.03 +3003002|-|exportiexporti #2|-|8|-|59|-|1095.73 +3003001|-|exportiexporti #1|-|17|-|0|-|1092.28 +6005004|-|scholarcorp #4|-|9|-|19|-|1089.08 +2002002|-|importoimporto #2|-|8|-|21|-|1088.40 +7009008|-|maxibrand #8|-|17|-|53|-|1085.13 +4003001|-|scholarnameless #8|-|18|-|47|-|1082.76 +9016003|-|corpunivamalg #3|-|17|-|0|-|1080.77 +1004001|-|edu packbrand #2|-|19|-|52|-|1077.93 +10008008|-|importoexporti #2|-|18|-|42|-|1070.96 +1001001|-|importoexporti #2|-|18|-|27|-|1069.38 +10009002|-|maxiunivamalg #2|-|9|-|39|-|1069.04 +5001002|-|amalgscholar #2|-|9|-|19|-|1068.49 +7015008|-|scholarnameless #8|-|9|-|46|-|1066.05 +4002001|-|edu packscholar #2|-|17|-|10|-|1065.90 +2004001|-|importoexporti #2|-|18|-|14|-|1059.76 +1002001|-|importoamalg #1|-|19|-|51|-|1056.00 +1001001|-|importoexporti #2|-|19|-|33|-|1051.46 +1002002|-|importoamalg #2|-|9|-|44|-|1050.56 +9003003|-|exportimaxi #3|-|17|-|43|-|1032.08 +4003002|-|exportiedu pack #2|-|19|-|13|-|1024.24 +9012009|-|importounivamalg #9|-|18|-|2|-|1019.10 +4001002|-|amalgedu pack #2|-|19|-|6|-|1019.00 +4003002|-|exportiedu pack #2|-|9|-|50|-|1017.45 +5001002|-|amalgscholar #2|-|7|-|16|-|1017.36 +8014006|-|edu packmaxi #6|-|18|-|21|-|1017.28 +5003001|-|exportischolar #1|-|19|-|15|-|1015.68 +2003002|-|exportiimporto #2|-|9|-|40|-|1012.68 +4001001|-|amalgedu pack #1|-|17|-|36|-|1004.06 +5004002|-|edu packscholar #2|-|17|-|45|-|994.68 +7004008|-|edu packbrand #8|-|8|-|2|-|972.84 +5002002|-|importoscholar #2|-|17|-|35|-|963.69 +4004002|-|edu packedu pack #2|-|18|-|9|-|959.04 +7015007|-|scholarnameless #7|-|19|-|4|-|956.12 +3001001|-|amalgexporti #1|-|9|-|49|-|954.60 +3003001|-|exportiexporti #1|-|19|-|53|-|941.50 +4003002|-|exportiedu pack #2|-|19|-|22|-|939.00 +6005003|-|amalgbrand #2|-|18|-|52|-|937.86 +3003001|-|exportiexporti #1|-|18|-|54|-|924.00 +2004002|-|edu packimporto #2|-|9|-|6|-|918.40 +4001002|-|amalgedu pack #2|-|17|-|46|-|916.32 +7011006|-|amalgnameless #6|-|18|-|58|-|898.32 +6008004|-|namelesscorp #4|-|19|-|55|-|897.17 +3004001|-|edu packexporti #1|-|19|-|14|-|892.68 +5003001|-|exportischolar #1|-|18|-|11|-|891.88 +1001001|-|amalgamalg #1|-|19|-|36|-|890.24 +7004008|-|edu packbrand #8|-|18|-|37|-|889.98 +9016003|-|corpunivamalg #3|-|17|-|26|-|888.30 +4003001|-|exportiedu pack #1|-|9|-|15|-|887.68 +9003003|-|exportimaxi #3|-|19|-|55|-|883.77 +7011006|-|amalgnameless #6|-|18|-|30|-|878.90 +2001001|-|amalgimporto #1|-|9|-|19|-|876.80 +3001001|-|amalgexporti #1|-|17|-|24|-|876.76 +3004002|-|edu packexporti #2|-|19|-|40|-|876.40 +2002002|-|importoimporto #2|-|8|-|9|-|876.35 +3004002|-|edu packexporti #2|-|17|-|11|-|876.06 +10003008|-|exportiunivamalg #8|-|19|-|24|-|874.76 +7005006|-|scholarbrand #6|-|17|-|29|-|868.48 +2004002|-|edu packimporto #2|-|18|-|53|-|866.88 +6006006|-|corpcorp #6|-|18|-|54|-|865.80 +3002001|-|edu packedu pack #2|-|18|-|32|-|861.58 +1002001|-|importoamalg #1|-|17|-|1|-|860.62 +1004002|-|edu packamalg #2|-|7|-|0|-|856.20 +10009010|-|maxiunivamalg #10|-|18|-|21|-|855.68 +3002001|-|edu packedu pack #2|-|19|-|5|-|849.25 +7010009|-|univnameless #9|-|9|-|31|-|843.60 +2004001|-|edu packimporto #1|-|18|-|47|-|843.51 +7009001|-|corpamalgamalg #17|-|18|-|48|-|840.75 +10014001|-|edu packamalgamalg #1|-|19|-|33|-|839.16 +8002007|-|importonameless #7|-|19|-|25|-|838.10 +2002001|-|importoimporto #1|-|8|-|2|-|837.64 +3003002|-|exportiexporti #2|-|19|-|22|-|834.00 +3001001|-|amalgexporti #1|-|18|-|56|-|820.80 +1004001|-|edu packbrand #2|-|17|-|43|-|811.70 +6006006|-|corpcorp #6|-|18|-|40|-|810.00 +6005004|-|scholarcorp #4|-|19|-|41|-|807.04 +2002001|-|amalgimporto #2|-|17|-|23|-|802.72 +3001001|-|amalgexporti #1|-|8|-|2|-|797.35 +3004001|-|edu packexporti #1|-|9|-|11|-|796.22 +3004002|-|edu packexporti #2|-|18|-|20|-|793.56 +9013003|-|exportiunivamalg #3|-|18|-|15|-|792.98 +3003002|-|exportiexporti #2|-|19|-|57|-|790.55 +4004002|-|edu packedu pack #2|-|17|-|25|-|787.78 +2004002|-|edu packimporto #2|-|18|-|22|-|787.08 +3002001|-|edu packedu pack #2|-|6|-|51|-|787.05 +2001001|-|amalgimporto #1|-|18|-|51|-|784.70 +2002001|-|amalgimporto #2|-|9|-|12|-|783.84 +9010002|-|univunivamalg #2|-|18|-|5|-|778.62 +9003006|-|exportimaxi #6|-|18|-|34|-|769.20 +10013010|-|exportiamalgamalg #10|-|18|-|32|-|766.48 +7013002|-|exportinameless #2|-|8|-|21|-|764.22 +2004001|-|edu packimporto #1|-|6|-|3|-|760.98 +8010001|-|univmaxi #1|-|17|-|24|-|760.20 +9009009|-|maximaxi #9|-|8|-|53|-|752.08 +3004002|-|edu packexporti #2|-|8|-|17|-|737.76 +9010002|-|univunivamalg #2|-|18|-|21|-|737.00 +6006005|-|exportiimporto #2|-|19|-|10|-|736.47 +1001001|-|importoexporti #2|-|9|-|7|-|735.18 +8005004|-|scholarnameless #4|-|19|-|40|-|734.40 +9002005|-|amalgbrand #6|-|9|-|3|-|732.16 +10008006|-|namelessunivamalg #6|-|19|-|37|-|729.12 +10009002|-|maxiunivamalg #2|-|6|-|34|-|728.95 +9014008|-|edu packunivamalg #8|-|9|-|26|-|726.40 +7015004|-|scholarnameless #4|-|9|-|46|-|726.24 +4003002|-|exportiedu pack #2|-|8|-|59|-|722.70 +3001001|-|amalgexporti #1|-|9|-|44|-|721.05 +2001001|-|amalgimporto #1|-|17|-|42|-|720.98 +4004002|-|edu packedu pack #2|-|9|-|49|-|720.72 +9004008|-|edu packmaxi #8|-|17|-|21|-|719.60 +2004002|-|edu packimporto #2|-|17|-|47|-|718.40 +6003005|-|edu packmaxi #6|-|18|-|35|-|718.38 +5002002|-|importoscholar #2|-|18|-|24|-|718.00 +3002001|-|edu packedu pack #2|-|17|-|38|-|717.25 +9004008|-|edu packmaxi #8|-|18|-|51|-|714.70 +2004002|-|edu packimporto #2|-|17|-|28|-|712.38 +7011010|-|amalgnameless #10|-|18|-|32|-|711.90 +2001001|-|amalgimporto #1|-|18|-|17|-|704.70 +6008004|-|namelesscorp #4|-|18|-|39|-|703.71 +4002001|-|edu packscholar #2|-|9|-|4|-|702.72 +4004002|-|edu packedu pack #2|-|17|-|48|-|696.80 +9002005|-|amalgbrand #6|-|19|-|56|-|692.22 +10014001|-|edu packamalgamalg #1|-|6|-|48|-|686.28 +3003002|-|exportiexporti #2|-|17|-|16|-|680.67 +10008006|-|namelessunivamalg #6|-|17|-|45|-|680.16 +2004001|-|edu packimporto #1|-|8|-|17|-|677.58 +3004002|-|edu packexporti #2|-|8|-|49|-|677.04 +null|-|null|-|19|-|29|-|676.60 +10013010|-|exportiamalgamalg #10|-|18|-|44|-|673.65 +5002002|-|importoscholar #2|-|18|-|45|-|669.32 +1002002|-|importoamalg #2|-|9|-|49|-|667.70 +7014010|-|edu packnameless #10|-|8|-|40|-|664.64 +10008006|-|namelessunivamalg #6|-|6|-|57|-|664.20 +7010005|-|univnameless #5|-|19|-|40|-|661.86 +7004008|-|edu packbrand #8|-|9|-|40|-|660.25 +8008006|-|namelessnameless #6|-|19|-|47|-|656.64 +7015007|-|scholarnameless #7|-|9|-|38|-|656.28 +8014006|-|edu packmaxi #6|-|17|-|16|-|655.18 +2004002|-|edu packimporto #2|-|9|-|43|-|653.76 +6003004|-|exporticorp #4|-|9|-|57|-|650.77 +5002002|-|importoscholar #2|-|9|-|3|-|650.70 +7004008|-|edu packbrand #8|-|9|-|8|-|649.90 +2002002|-|importoimporto #2|-|6|-|26|-|646.72 +10005002|-|exportiimporto #2|-|18|-|36|-|642.88 +7006005|-|corpbrand #5|-|19|-|44|-|641.70 +10013010|-|exportiamalgamalg #10|-|18|-|28|-|637.56 +2004002|-|edu packimporto #2|-|18|-|18|-|635.66 +8003007|-|brandcorp #2|-|9|-|10|-|633.00 +4004002|-|edu packedu pack #2|-|19|-|44|-|632.94 +2004001|-|edu packimporto #1|-|9|-|12|-|631.75 +5003001|-|exportischolar #1|-|17|-|34|-|626.24 +1002001|-|importoamalg #1|-|18|-|43|-|624.34 +7006005|-|corpbrand #5|-|9|-|19|-|620.85 +9001003|-|amalgmaxi #3|-|9|-|48|-|619.04 +1001001|-|importoexporti #2|-|9|-|58|-|618.00 +10005002|-|edu packedu pack #2|-|9|-|3|-|617.94 +5003001|-|exportischolar #1|-|9|-|27|-|617.67 +6011001|-|amalgbrand #1|-|19|-|49|-|617.16 +1002001|-|importoamalg #1|-|17|-|58|-|615.48 +7015008|-|scholarnameless #8|-|18|-|6|-|611.00 +9007003|-|brandmaxi #3|-|17|-|20|-|609.45 +7013002|-|exportinameless #2|-|17|-|50|-|605.70 +9002011|-|brandbrand #6|-|9|-|20|-|602.70 +2001001|-|exportiexporti #2|-|19|-|28|-|601.56 +4004002|-|edu packedu pack #2|-|19|-|29|-|600.80 +4004002|-|edu packedu pack #2|-|8|-|15|-|598.92 +10016008|-|corpamalgamalg #8|-|9|-|12|-|596.16 +10005002|-|edu packedu pack #2|-|18|-|44|-|596.02 +3003002|-|exportiexporti #2|-|19|-|36|-|594.55 +3003001|-|exportiexporti #1|-|17|-|25|-|587.25 +8002007|-|importonameless #7|-|9|-|21|-|586.32 +8006010|-|corpnameless #10|-|18|-|9|-|585.12 +3004001|-|edu packexporti #1|-|17|-|49|-|582.48 +10014005|-|edu packamalgamalg #5|-|9|-|0|-|581.04 +3003001|-|exportinameless #4|-|18|-|59|-|580.71 +9004008|-|edu packmaxi #8|-|19|-|7|-|580.23 +1002002|-|importoamalg #2|-|9|-|3|-|576.45 +1004001|-|edu packbrand #2|-|17|-|37|-|574.02 +7009001|-|corpamalgamalg #17|-|6|-|14|-|571.68 +4002001|-|importoedu pack #1|-|19|-|31|-|568.62 +8002007|-|importonameless #7|-|17|-|8|-|567.80 +2004001|-|edu packimporto #1|-|9|-|35|-|567.22 +1003001|-|exportiamalg #1|-|18|-|36|-|567.12 +3002001|-|edu packedu pack #2|-|17|-|4|-|566.94 +5003001|-|importonameless #6|-|19|-|18|-|565.02 +2002002|-|importoimporto #2|-|18|-|58|-|559.86 +2004001|-|importoexporti #2|-|19|-|53|-|557.13 +5002001|-|importoscholar #1|-|17|-|53|-|554.26 +6008001|-|namelesscorp #1|-|6|-|25|-|553.20 +6006006|-|corpcorp #6|-|18|-|0|-|552.78 +7015007|-|scholarnameless #7|-|18|-|43|-|552.75 +3004002|-|edu packexporti #2|-|9|-|6|-|549.93 +4002001|-|importoedu pack #1|-|17|-|9|-|543.60 +10009016|-|maxiunivamalg #16|-|19|-|9|-|542.36 +9010002|-|univunivamalg #2|-|17|-|57|-|533.82 +6005004|-|scholarcorp #4|-|19|-|46|-|527.62 +10005002|-|exportiimporto #2|-|17|-|35|-|521.04 +5001002|-|amalgscholar #2|-|18|-|38|-|520.98 +3002001|-|importoexporti #1|-|19|-|46|-|520.74 +7012008|-|importonameless #8|-|19|-|23|-|520.52 +10014001|-|edu packamalgamalg #1|-|17|-|57|-|518.12 +3003002|-|exportiexporti #2|-|8|-|31|-|514.90 +6002008|-|importocorp #8|-|19|-|50|-|514.60 +6011003|-|amalgbrand #3|-|17|-|21|-|504.56 +7014009|-|edu packedu pack #2|-|9|-|49|-|502.16 +4002002|-|importoedu pack #2|-|19|-|22|-|497.71 +8015004|-|scholarmaxi #4|-|18|-|48|-|490.08 +1001001|-|amalgamalg #1|-|19|-|21|-|487.90 +6005004|-|scholarcorp #4|-|19|-|5|-|482.25 +9003003|-|exportimaxi #3|-|9|-|34|-|478.40 +9002011|-|brandbrand #6|-|6|-|8|-|476.18 +7013002|-|exportinameless #2|-|18|-|20|-|472.92 +10009002|-|maxiunivamalg #2|-|8|-|47|-|472.89 +7015004|-|scholarnameless #4|-|17|-|35|-|472.00 +5001002|-|amalgscholar #2|-|17|-|5|-|471.20 +3003002|-|exportiexporti #2|-|17|-|25|-|470.72 +10016008|-|corpamalgamalg #8|-|8|-|12|-|467.84 +2002002|-|importoimporto #2|-|19|-|31|-|466.40 +3004002|-|edu packexporti #2|-|17|-|42|-|463.20 +3001001|-|amalgexporti #1|-|19|-|27|-|458.78 +10009016|-|maxiunivamalg #16|-|17|-|33|-|458.75 +7004008|-|edu packbrand #8|-|19|-|10|-|456.94 +3003001|-|exportinameless #4|-|17|-|41|-|452.20 +2002001|-|exportiexporti #2|-|17|-|51|-|445.00 +1002002|-|importoamalg #2|-|18|-|34|-|444.62 +5001002|-|amalgscholar #2|-|17|-|7|-|438.75 +9003003|-|exportimaxi #3|-|17|-|11|-|438.62 +6009008|-|maxicorp #8|-|8|-|20|-|429.78 +3002001|-|importoexporti #1|-|8|-|1|-|422.10 +6015004|-|scholarbrand #4|-|17|-|29|-|421.59 +10009016|-|maxiunivamalg #16|-|19|-|17|-|418.68 +9015011|-|exportibrand #2|-|17|-|34|-|418.44 +10015013|-|scholaramalgamalg #13|-|18|-|17|-|417.24 +10016002|-|corpamalgamalg #2|-|19|-|40|-|415.87 +4002001|-|importoedu pack #1|-|18|-|51|-|414.54 +7006007|-|corpbrand #7|-|8|-|49|-|413.28 +7002002|-|importobrand #2|-|8|-|30|-|409.32 +8004002|-|edu packnameless #2|-|19|-|24|-|408.00 +9014008|-|edu packunivamalg #8|-|18|-|41|-|406.03 +1004001|-|edu packbrand #2|-|17|-|29|-|403.70 +3004001|-|edu packexporti #1|-|17|-|12|-|396.55 +7006005|-|corpbrand #5|-|18|-|53|-|393.26 +10014005|-|edu packamalgamalg #5|-|19|-|8|-|392.35 +3002001|-|edu packedu pack #2|-|8|-|11|-|387.03 +4003001|-|edu packimporto #2|-|17|-|24|-|386.43 +8004002|-|edu packnameless #2|-|17|-|47|-|384.00 +null|-|null|-|17|-|16|-|383.68 +3002001|-|importoexporti #1|-|17|-|41|-|382.50 +8013009|-|exportimaxi #9|-|17|-|21|-|382.36 +4003001|-|scholarnameless #8|-|19|-|50|-|381.60 +6008001|-|namelesscorp #1|-|17|-|12|-|381.48 +9003003|-|exportimaxi #3|-|9|-|24|-|380.52 +2001001|-|amalgimporto #1|-|19|-|27|-|380.12 +6015004|-|scholarbrand #4|-|8|-|24|-|378.27 +2004001|-|importoexporti #2|-|9|-|52|-|378.20 +9016003|-|corpunivamalg #3|-|18|-|47|-|377.60 +6005004|-|scholarcorp #4|-|17|-|51|-|377.12 +3004002|-|edu packexporti #2|-|17|-|8|-|374.50 +7011006|-|amalgnameless #6|-|7|-|42|-|372.66 +8004002|-|edu packnameless #2|-|19|-|5|-|368.94 +9003003|-|exportimaxi #3|-|9|-|57|-|368.50 +8014006|-|edu packmaxi #6|-|7|-|6|-|367.74 +6005003|-|amalgbrand #2|-|18|-|53|-|364.80 +1002002|-|importoamalg #2|-|18|-|52|-|362.60 +9001003|-|amalgmaxi #3|-|17|-|43|-|362.10 +4003001|-|scholarnameless #8|-|7|-|25|-|361.20 +6006005|-|exportiimporto #2|-|18|-|57|-|359.28 +9003003|-|exportimaxi #3|-|17|-|14|-|355.77 +7014009|-|edu packedu pack #2|-|18|-|36|-|355.74 +6005003|-|amalgbrand #2|-|19|-|58|-|355.32 +4003002|-|exportiedu pack #2|-|19|-|59|-|344.90 +2002002|-|importoimporto #2|-|19|-|56|-|343.04 +2004002|-|edu packimporto #2|-|19|-|36|-|340.80 +6006006|-|corpcorp #6|-|17|-|53|-|340.50 +6006005|-|exportiimporto #2|-|17|-|21|-|338.24 +3001001|-|amalgexporti #1|-|9|-|59|-|338.01 +9004008|-|edu packmaxi #8|-|18|-|1|-|334.37 +4003001|-|scholarnameless #8|-|18|-|17|-|333.56 +8005004|-|scholarnameless #4|-|19|-|39|-|333.20 +4004002|-|edu packedu pack #2|-|8|-|16|-|332.64 +5002002|-|importoscholar #2|-|18|-|9|-|330.64 +2004001|-|edu packimporto #1|-|19|-|1|-|328.86 +4003001|-|edu packimporto #2|-|9|-|36|-|327.72 +4003001|-|exportiedu pack #1|-|19|-|48|-|327.06 +3004002|-|edu packexporti #2|-|17|-|19|-|322.98 +4003001|-|edu packimporto #2|-|6|-|19|-|322.24 +5002001|-|importoscholar #1|-|9|-|38|-|321.30 +7014010|-|edu packnameless #10|-|19|-|0|-|319.19 +3004001|-|edu packexporti #1|-|9|-|50|-|313.74 +10009016|-|maxiunivamalg #16|-|19|-|12|-|310.20 +1002002|-|importoamalg #2|-|18|-|7|-|309.82 +2004001|-|edu packimporto #1|-|18|-|6|-|309.21 +7014010|-|edu packnameless #10|-|19|-|16|-|307.60 +5001002|-|amalgscholar #2|-|19|-|33|-|304.98 +9003003|-|exportimaxi #3|-|17|-|46|-|303.36 +7006007|-|corpbrand #7|-|19|-|18|-|303.24 +1002002|-|importoamalg #2|-|17|-|42|-|301.15 +10016002|-|corpamalgamalg #2|-|17|-|46|-|300.94 +9015011|-|exportibrand #2|-|9|-|43|-|300.79 +7002002|-|importobrand #2|-|19|-|44|-|300.64 +6015004|-|scholarbrand #4|-|18|-|24|-|299.25 +8014006|-|edu packmaxi #6|-|18|-|54|-|291.84 +1001001|-|importoexporti #2|-|19|-|32|-|290.18 +4001001|-|amalgedu pack #1|-|17|-|1|-|285.61 +9008003|-|namelessmaxi #3|-|18|-|50|-|284.48 +10008016|-|namelessunivamalg #16|-|17|-|31|-|280.20 +2004002|-|edu packimporto #2|-|19|-|49|-|278.98 +5003001|-|exportischolar #1|-|18|-|22|-|278.88 +4001001|-|amalgedu pack #1|-|18|-|45|-|275.45 +6005004|-|scholarcorp #4|-|19|-|47|-|274.23 +7011010|-|amalgnameless #10|-|17|-|56|-|270.40 +10008008|-|importoexporti #2|-|8|-|16|-|269.94 +9012009|-|importounivamalg #9|-|9|-|2|-|269.04 +6003005|-|edu packmaxi #6|-|17|-|42|-|268.11 +8003007|-|brandcorp #2|-|9|-|34|-|267.96 +4004002|-|edu packedu pack #2|-|19|-|59|-|267.54 +7015007|-|scholarnameless #7|-|9|-|21|-|266.60 +9007003|-|brandmaxi #3|-|9|-|5|-|265.22 +4004002|-|edu packedu pack #2|-|19|-|11|-|261.36 +6003004|-|exporticorp #4|-|8|-|47|-|260.96 +7013002|-|exportinameless #2|-|6|-|17|-|256.70 +2004001|-|edu packimporto #1|-|18|-|45|-|255.85 +null|-|null|-|9|-|36|-|251.86 +9003003|-|exportimaxi #3|-|9|-|9|-|251.28 +1002002|-|importoamalg #2|-|19|-|8|-|251.16 +6005003|-|amalgbrand #2|-|17|-|24|-|251.10 +9003006|-|exportimaxi #6|-|19|-|42|-|251.04 +6005004|-|scholarcorp #4|-|17|-|20|-|247.10 +8010002|-|univmaxi #2|-|8|-|36|-|247.01 +6011003|-|amalgbrand #3|-|8|-|53|-|245.18 +2004002|-|edu packimporto #2|-|19|-|17|-|243.90 +9008003|-|namelessmaxi #3|-|19|-|16|-|241.80 +3003001|-|exportinameless #4|-|18|-|23|-|240.24 +3004002|-|edu packexporti #2|-|19|-|34|-|236.73 +3003002|-|exportiexporti #2|-|9|-|9|-|234.78 +10005002|-|edu packedu pack #2|-|17|-|12|-|233.28 +3003001|-|exportinameless #4|-|17|-|13|-|232.64 +6008001|-|namelesscorp #1|-|8|-|39|-|232.64 +9003006|-|exportimaxi #6|-|18|-|47|-|230.28 +9010002|-|univunivamalg #2|-|9|-|6|-|230.10 +9005002|-|scholarmaxi #2|-|8|-|38|-|229.50 +5002001|-|importoscholar #1|-|18|-|7|-|228.44 +10008008|-|importoexporti #2|-|6|-|49|-|223.74 +5002002|-|importoscholar #2|-|17|-|19|-|223.50 +2004002|-|edu packimporto #2|-|19|-|27|-|222.20 +1003001|-|exportiamalg #1|-|7|-|58|-|219.96 +2001001|-|exportiexporti #2|-|17|-|46|-|214.88 +6005003|-|amalgbrand #2|-|8|-|3|-|214.54 +7011010|-|amalgnameless #10|-|18|-|36|-|212.66 +3004001|-|edu packexporti #1|-|17|-|0|-|212.43 +4003002|-|exportiedu pack #2|-|9|-|15|-|212.16 +7009001|-|corpamalgamalg #17|-|9|-|2|-|210.56 +7004008|-|edu packbrand #8|-|8|-|40|-|208.00 +6015004|-|scholarbrand #4|-|19|-|9|-|206.72 +7004008|-|edu packbrand #8|-|17|-|27|-|206.10 +4001001|-|amalgedu pack #1|-|8|-|35|-|204.10 +3002001|-|importoexporti #1|-|18|-|15|-|202.46 +7012007|-|importonameless #7|-|9|-|8|-|202.30 +3002002|-|importoexporti #2|-|18|-|41|-|201.81 +9015011|-|exportibrand #2|-|9|-|31|-|200.16 +4001001|-|amalgedu pack #1|-|17|-|53|-|199.94 +3002001|-|importoexporti #1|-|9|-|57|-|199.53 +5002001|-|importoscholar #1|-|18|-|41|-|197.34 +4003001|-|edu packimporto #2|-|17|-|18|-|197.10 +8003006|-|exportinameless #6|-|19|-|48|-|194.82 +3003001|-|exportiexporti #1|-|17|-|7|-|193.86 +9003006|-|exportimaxi #6|-|9|-|49|-|193.84 +8005004|-|scholarnameless #4|-|17|-|57|-|191.43 +3004001|-|edu packexporti #1|-|18|-|36|-|190.62 +7002002|-|importobrand #2|-|17|-|53|-|188.00 +4001002|-|amalgedu pack #2|-|8|-|4|-|186.48 +8010002|-|univmaxi #2|-|9|-|1|-|186.05 +3004002|-|edu packexporti #2|-|18|-|53|-|184.00 +9003003|-|exportimaxi #3|-|9|-|3|-|182.85 +5002002|-|importoscholar #2|-|17|-|13|-|181.92 +null|-|null|-|19|-|14|-|181.38 +10015013|-|scholaramalgamalg #13|-|8|-|4|-|179.28 +7013002|-|exportinameless #2|-|18|-|38|-|176.46 +2004001|-|edu packimporto #1|-|17|-|59|-|175.23 +3003001|-|exportinameless #4|-|9|-|31|-|175.07 +2001001|-|exportiexporti #2|-|17|-|25|-|174.24 +1004002|-|edu packamalg #2|-|19|-|33|-|173.25 +7010005|-|univnameless #5|-|6|-|47|-|172.50 +2004002|-|edu packimporto #2|-|6|-|18|-|171.06 +7004008|-|edu packbrand #8|-|19|-|0|-|169.29 +7014009|-|amalgbrand #6|-|18|-|25|-|169.28 +1002002|-|importoamalg #2|-|19|-|15|-|168.75 +3002001|-|edu packedu pack #2|-|19|-|26|-|165.77 +9003003|-|exportimaxi #3|-|17|-|39|-|162.69 +4003002|-|exportiedu pack #2|-|9|-|59|-|162.24 +4002001|-|edu packscholar #2|-|18|-|42|-|161.24 +2001001|-|exportiexporti #2|-|17|-|43|-|160.74 +2001001|-|amalgimporto #1|-|17|-|39|-|159.44 +1001001|-|importoexporti #2|-|18|-|44|-|158.22 +3004002|-|edu packexporti #2|-|18|-|48|-|157.50 +9005002|-|scholarmaxi #2|-|18|-|33|-|156.00 +10009002|-|maxiunivamalg #2|-|18|-|49|-|154.57 +2002002|-|importoimporto #2|-|17|-|3|-|154.56 +8003006|-|exportinameless #6|-|9|-|55|-|154.22 +2002002|-|importoimporto #2|-|18|-|55|-|153.90 +9010002|-|univunivamalg #2|-|9|-|31|-|153.00 +10003008|-|exportiunivamalg #8|-|19|-|48|-|151.06 +7002009|-|importobrand #9|-|8|-|10|-|150.00 +1001001|-|importoexporti #2|-|8|-|2|-|148.00 +2004002|-|edu packimporto #2|-|8|-|10|-|147.60 +3002002|-|importoexporti #2|-|19|-|27|-|147.12 +10003008|-|exportiunivamalg #8|-|19|-|51|-|145.52 +7016008|-|corpnameless #8|-|19|-|21|-|141.64 +8015004|-|scholarmaxi #4|-|18|-|30|-|139.80 +7014010|-|edu packnameless #10|-|18|-|40|-|138.47 +4003001|-|scholarnameless #8|-|9|-|52|-|136.16 +3004001|-|edu packexporti #1|-|19|-|34|-|135.24 +9014008|-|edu packunivamalg #8|-|9|-|47|-|135.16 +2004002|-|edu packimporto #2|-|7|-|43|-|127.68 +4001001|-|amalgedu pack #1|-|17|-|4|-|122.24 +3004002|-|edu packexporti #2|-|9|-|42|-|121.00 +3001001|-|amalgexporti #1|-|9|-|1|-|119.40 +7011006|-|amalgnameless #6|-|9|-|32|-|119.38 +9016003|-|corpunivamalg #3|-|17|-|55|-|117.72 +8004002|-|edu packnameless #2|-|8|-|27|-|116.70 +3004001|-|edu packexporti #1|-|19|-|39|-|116.12 +7009003|-|maxibrand #3|-|17|-|13|-|114.30 +4001002|-|amalgedu pack #2|-|9|-|55|-|114.18 +2004002|-|edu packimporto #2|-|9|-|25|-|111.52 +7012008|-|importonameless #8|-|19|-|17|-|111.14 +9013003|-|exportiunivamalg #3|-|8|-|28|-|110.70 +3001001|-|amalgexporti #1|-|9|-|11|-|109.80 +9002011|-|brandbrand #6|-|18|-|43|-|109.28 +6011001|-|amalgbrand #1|-|18|-|3|-|109.15 +7014009|-|edu packedu pack #2|-|18|-|32|-|108.46 +10014001|-|edu packamalgamalg #1|-|18|-|43|-|108.16 +10013010|-|exportiamalgamalg #10|-|17|-|25|-|104.30 +3003002|-|exportiexporti #2|-|9|-|31|-|102.80 +2003002|-|exportiimporto #2|-|17|-|53|-|102.60 +9016003|-|corpunivamalg #3|-|9|-|1|-|102.15 +5003001|-|exportischolar #1|-|8|-|59|-|100.10 +10014001|-|edu packamalgamalg #1|-|9|-|46|-|99.30 +7013002|-|exportinameless #2|-|8|-|11|-|99.00 +1004002|-|edu packamalg #2|-|19|-|58|-|95.55 +10014001|-|edu packamalgamalg #1|-|9|-|24|-|95.34 +7005006|-|scholarbrand #6|-|18|-|40|-|95.06 +4002001|-|edu packscholar #2|-|19|-|24|-|94.86 +5001002|-|amalgscholar #2|-|18|-|44|-|93.59 +10014005|-|edu packamalgamalg #5|-|9|-|35|-|93.08 +3004002|-|edu packexporti #2|-|9|-|56|-|90.87 +9016003|-|corpunivamalg #3|-|8|-|17|-|89.50 +6015004|-|scholarbrand #4|-|19|-|16|-|89.28 +7014009|-|amalgbrand #6|-|18|-|6|-|89.10 +9003003|-|exportimaxi #3|-|8|-|52|-|88.35 +2002002|-|importoimporto #2|-|7|-|53|-|86.80 +7006003|-|importobrand #6|-|7|-|48|-|85.04 +10008016|-|namelessunivamalg #16|-|19|-|36|-|83.88 +9005002|-|scholarmaxi #2|-|17|-|17|-|83.57 +10005002|-|exportiimporto #2|-|17|-|26|-|82.88 +10016008|-|corpamalgamalg #8|-|9|-|53|-|82.65 +10013010|-|exportiamalgamalg #10|-|7|-|48|-|82.35 +6015004|-|scholarbrand #4|-|7|-|45|-|81.13 +7010009|-|univnameless #9|-|18|-|21|-|79.82 +10009016|-|maxiunivamalg #16|-|8|-|36|-|79.24 +6003004|-|exporticorp #4|-|9|-|31|-|78.12 +9012009|-|importounivamalg #9|-|9|-|32|-|77.46 +2001001|-|amalgimporto #1|-|7|-|43|-|77.18 +3003001|-|exportiexporti #1|-|7|-|25|-|77.14 +2004002|-|edu packimporto #2|-|8|-|1|-|76.86 +2002002|-|importoimporto #2|-|19|-|20|-|70.60 +8010002|-|univmaxi #2|-|9|-|49|-|64.90 +7006003|-|importobrand #6|-|18|-|28|-|64.82 +6011003|-|amalgbrand #3|-|18|-|35|-|61.83 +4002001|-|importoedu pack #1|-|9|-|12|-|61.60 +6003005|-|edu packmaxi #6|-|7|-|21|-|61.36 +9016003|-|corpunivamalg #3|-|18|-|55|-|60.72 +6009008|-|maxicorp #8|-|19|-|39|-|60.00 +1002002|-|importoamalg #2|-|8|-|35|-|57.85 +2004002|-|edu packimporto #2|-|6|-|59|-|55.00 +9002005|-|amalgbrand #6|-|8|-|32|-|54.60 +4003001|-|scholarnameless #8|-|18|-|14|-|53.65 +6015004|-|scholarbrand #4|-|18|-|38|-|52.02 +9007003|-|brandmaxi #3|-|18|-|45|-|47.02 +9003006|-|exportimaxi #6|-|9|-|24|-|46.76 +5001002|-|amalgscholar #2|-|17|-|43|-|45.98 +10005002|-|exportiimporto #2|-|18|-|7|-|43.68 +5002002|-|importoscholar #2|-|8|-|40|-|42.75 +8010001|-|univmaxi #1|-|9|-|3|-|41.16 +1002002|-|importoamalg #2|-|17|-|28|-|39.95 +10009010|-|maxiunivamalg #10|-|9|-|31|-|39.17 +8015004|-|scholarmaxi #4|-|18|-|25|-|37.24 +4001001|-|amalgedu pack #1|-|18|-|36|-|37.20 +9003003|-|exportimaxi #3|-|17|-|55|-|36.09 +2002002|-|importoimporto #2|-|17|-|13|-|35.70 +8002008|-|importonameless #8|-|19|-|22|-|35.42 +3004002|-|edu packexporti #2|-|18|-|33|-|35.00 +9003006|-|exportimaxi #6|-|17|-|16|-|34.58 +7014009|-|amalgbrand #6|-|19|-|46|-|33.04 +9014008|-|edu packunivamalg #8|-|17|-|53|-|32.22 +6015004|-|scholarbrand #4|-|8|-|6|-|32.19 +5003001|-|exportischolar #1|-|17|-|55|-|31.50 +1002002|-|importoamalg #2|-|17|-|51|-|31.46 +9007003|-|brandmaxi #3|-|18|-|25|-|30.20 +2004001|-|importoexporti #2|-|18|-|50|-|28.44 +2001001|-|amalgimporto #1|-|18|-|1|-|28.32 +9003006|-|exportimaxi #6|-|18|-|22|-|25.30 +4002001|-|edu packscholar #2|-|18|-|59|-|24.10 +1001001|-|amalgamalg #1|-|17|-|51|-|22.05 +5003001|-|exportischolar #1|-|18|-|36|-|21.96 +3002001|-|importoexporti #1|-|19|-|31|-|21.24 +9001003|-|amalgmaxi #3|-|19|-|38|-|19.17 +3002001|-|importoexporti #1|-|17|-|44|-|18.24 +9004008|-|edu packmaxi #8|-|17|-|48|-|17.88 +9003003|-|exportimaxi #3|-|8|-|40|-|16.20 +4004002|-|edu packedu pack #2|-|19|-|39|-|14.07 +2004001|-|edu packimporto #1|-|18|-|26|-|13.86 +10009016|-|maxiunivamalg #16|-|18|-|40|-|13.18 +7015007|-|scholarnameless #7|-|8|-|49|-|12.99 +8005004|-|scholarnameless #4|-|9|-|37|-|11.88 +2001001|-|exportiexporti #2|-|19|-|8|-|9.28 +1002002|-|importoamalg #2|-|19|-|59|-|8.48 +7014009|-|amalgbrand #6|-|17|-|44|-|8.22 +1001002|-|amalgamalg #2|-|18|-|58|-|7.56 +4003001|-|edu packimporto #2|-|6|-|34|-|6.24 +2002001|-|exportiexporti #2|-|19|-|17|-|0.00 +2003002|-|exportiimporto #2|-|18|-|8|-|0.00 +2004001|-|edu packimporto #1|-|18|-|21|-|0.00 +3003001|-|exportinameless #4|-|17|-|14|-|0.00 +3003001|-|exportiexporti #1|-|17|-|48|-|0.00 +4001002|-|amalgedu pack #2|-|17|-|28|-|0.00 +4004002|-|edu packedu pack #2|-|8|-|12|-|0.00 +6002008|-|importocorp #8|-|17|-|22|-|0.00 +7009003|-|maxibrand #3|-|19|-|9|-|0.00 +10008008|-|importoexporti #2|-|8|-|50|-|0.00 +2004001|-|edu packimporto #1|-|19|-|28|-|null +5003001|-|importonameless #6|-|9|-|45|-|null +6003004|-|exporticorp #4|-|18|-|48|-|null +7009008|-|maxibrand #8|-|9|-|26|-|null +9003003|-|exportimaxi #3|-|18|-|6|-|null +10001007|-|amalgunivamalg #7|-|18|-|26|-|null +10016008|-|corpamalgamalg #8|-|17|-|28|-|null diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q72.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q72.out new file mode 100644 index 0000000000000..3798884bf0ade --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q72.out @@ -0,0 +1,100 @@ +Again perfect sons used to put always. Europea|-|Significantly|-|5305|-|0|-|2|-|2 +Ago new arguments accept previously european parents; fo|-|Selective,|-|5313|-|0|-|2|-|2 +Difficult, rapid sizes say so; initial banks stress high single sports; prisoners used to think likely firms. Good, current services must take human, precise persons. Signals m|-|Selective,|-|5322|-|0|-|2|-|2 +Eventually soft issues will see pp.; possible children pay completely future tasks. Only women will not rehearse more old parts; different movements sponsor most. Please political allowance|-|Significantly|-|5273|-|0|-|2|-|2 +Happy, nuclear obligations should not leave little payments. About able relationships impress thus only original a|-|Significantly|-|5313|-|0|-|2|-|2 +Healthy, delighted conclusions may offer experienced condi|-|Significantly|-|5305|-|0|-|2|-|2 +Hitherto certain kinds evade also by a months. Poor points might make even just selective passengers. Old, general qualities could overcome over; recent variables might s|-|Just good amou|-|5280|-|0|-|2|-|2 +Ideas total sadly. International members contribute perhaps lucky cells. Texts would acknowled|-|Selective,|-|5280|-|0|-|2|-|2 +Important audiences shall murder.|-|Selective,|-|5322|-|0|-|2|-|2 +In order suitable conditions used to eat more on a americans. As open rates shall go sometimes big authorities. Tickets respond for example pregnant, good women. Banks could exploit also full, old cr|-|Matches produce|-|5319|-|0|-|2|-|2 +Little, num|-|Matches produce|-|5322|-|0|-|2|-|2 +National, l|-|Operations|-|5318|-|0|-|2|-|2 +Obvious, present cells may not define appointed, military boys. Answers can get little. Over there comparative days become in a police. Particularly divine prop|-|Just good amou|-|5322|-|0|-|2|-|2 +Outside, useful animals find again also british decisions; now small attitudes shall n|-|Significantly|-|5322|-|0|-|2|-|2 +Particular, british wa|-|Operations|-|5313|-|0|-|2|-|2 +Parts will recruit si|-|Selective,|-|5322|-|0|-|2|-|2 +Rational, given goods would stay just equal materials. Very alternative months might not buy voc|-|Just good amou|-|5319|-|0|-|2|-|2 +Royal, military notions will not find very very wet acids. Funny actions take western, remaining homes. Great patients will replace simply. Signs can think equivalent reasons. Campaigns |-|Matches produce|-|5313|-|0|-|2|-|2 +Short companies get that is for a days. Early, special hands might keep to the women. Present blocks co-ordinate so sure results. Seasons lend still recent friends. Dead |-|Just good amou|-|5273|-|0|-|2|-|2 +Short companies get that is for a days. Early, special hands might keep to the women. Present blocks co-ordinate so sure results. Seasons lend still recent friends. Dead |-|Selective,|-|5273|-|0|-|2|-|2 +Specialist, identical factors should not answer so main shares. Sales might reduce then free hours. Ethic|-|Just good amou|-|5306|-|0|-|2|-|2 +Then sp|-|Selective,|-|5308|-|0|-|2|-|2 +null|-|Just good amou|-|5297|-|0|-|1|-|1 +null|-|Matches produce|-|5282|-|0|-|1|-|1 +null|-|Operations|-|5308|-|0|-|1|-|1 +null|-|Selective,|-|5318|-|0|-|1|-|1 +A bit important |-|Significantly|-|5284|-|0|-|1|-|1 +A bit liable flowers change also writings. Currently soviet ministers come. Hotels telephone before aggressive, economic eyes. Blue changes improve. Overal|-|Operations|-|5317|-|0|-|1|-|1 +A bit liable flowers change also writings. Currently soviet ministers come. Hotels telephone before aggressive, economic eyes. Blue changes improve. Overal|-|Selective,|-|5317|-|0|-|1|-|1 +A little local letters think over like a children; nevertheless particular powers damage now suddenly absent prote|-|Significantly|-|5317|-|0|-|1|-|1 +Able systems merge from a areas. Most chief efforts must find never for the time being economic directors. Activities sit there. Available polic|-|Selective,|-|5305|-|0|-|1|-|1 +Able troubles dust into the styles. Independent feet kill wounds. Fundamental months should exploit arms. Massive years read only modern courses; twin forms shall become products. Even h|-|Matches produce|-|5309|-|0|-|1|-|1 +Able troubles dust into the styles. Independent feet kill wounds. Fundamental months should exploit arms. Massive years read only modern courses; twin forms shall become products. Even h|-|Operations|-|5309|-|0|-|1|-|1 +Able, active jobs might not play upstairs. Electoral crimes could not worry for the solutions. Wholly capitalist effects would not get |-|Matches produce|-|5291|-|0|-|1|-|1 +Able, initial men cannot assume then rational, new references; shares could support physical, internati|-|Operations|-|5304|-|0|-|1|-|1 +Able, reasonable standards make forward. Strategic, |-|Just good amou|-|5319|-|0|-|1|-|1 +About military programmes identify all in a thousands; able sentences mean also flats. Branches know secrets; right, increased interactions tour a little. High, lov|-|Selective,|-|5299|-|0|-|1|-|1 +About supreme days tell then for a consequences. Ill items force meals; years may not mean quite social structures. Goals|-|Significantly|-|5311|-|0|-|1|-|1 +Above, new groups will not like much local bodies. However traditional sessions can walk slowly big, young aspects. Quite close companies ought to take in a rules. Leaders must not like of cou|-|Just good amou|-|5314|-|0|-|1|-|1 +Above, new groups will not like much local bodies. However traditional sessions can walk slowly big, young aspects. Quite close companies ought to take in a rules. Leaders must not like of cou|-|Matches produce|-|5314|-|0|-|1|-|1 +Above, new groups will not like much local bodies. However traditional sessions can walk slowly big, young aspects. Quite close companies ought to take in a rules. Leaders must not like of cou|-|Matches produce|-|5315|-|0|-|1|-|1 +Absolute|-|Matches produce|-|5322|-|0|-|1|-|1 +Absolutely angry odds put strongly. Telecommunications help only recent, |-|Selective,|-|5316|-|0|-|1|-|1 +Ac|-|Significantly|-|5306|-|0|-|1|-|1 +Accessible, likel|-|Matches produce|-|5301|-|0|-|1|-|1 +Accessible, likel|-|Selective,|-|5301|-|0|-|1|-|1 +Accessible, old walls profit here. Wars form therefore as effective servants. Secrets could not feel meanwhile regional theories. Perfect, new service|-|Operations|-|5273|-|0|-|1|-|1 +Accidents can include below other, marginal plans. Comparable, welsh exceptions argue most as usual physical claims. Certain months may smell far from in a cases. Active seconds used to restore t|-|Matches produce|-|5304|-|0|-|1|-|1 +Accidents fly bet|-|Matches produce|-|5321|-|0|-|1|-|1 +Accounts rank only high plans. Days sho|-|Just good amou|-|5302|-|0|-|1|-|1 +Accurately economic workers play clearly. Deliberately other stands recapture social, cultural prices. Full paths used to make twice alw|-|Matches produce|-|5301|-|0|-|1|-|1 +Actions must not compare so economi|-|Matches produce|-|5320|-|0|-|1|-|1 +Actions see of course informal phrases. Markedly right men buy honest, additional stations. In order imaginative factors used to move human thanks. Centres shall catch altogether succe|-|Significantly|-|5289|-|0|-|1|-|1 +Actual arrangements should introduce never in a unions. Ultimately d|-|Just good amou|-|5273|-|0|-|1|-|1 +Actual, possible sides employ here future hands. Powerful intervals ought to respond new, particular marks. Appointed, spiritual accidents sustain but modern, coming findings. Male, national year|-|Selective,|-|5304|-|0|-|1|-|1 +Actually subtle subjects mark as tories. Yet possible areas |-|Just good amou|-|5321|-|0|-|1|-|1 +Actually subtle subjects mark as tories. Yet possible areas |-|Matches produce|-|5320|-|0|-|1|-|1 +Acutely possible kilometres cannot trim fully justly original visitors. Owners can transport from the connections. Then controversial girls might tell yet more big kinds. More typical houses g|-|Just good amou|-|5272|-|0|-|1|-|1 +Acutely possible kilometres cannot trim fully justly original visitors. Owners can transport from the connections. Then controversial girls might tell yet more big kinds. More typical houses g|-|Selective,|-|5318|-|0|-|1|-|1 +Additional companies visit. Grey opportunities may not look numbers. Entire, british models assist also great quarters. Little males show|-|Just good amou|-|5284|-|0|-|1|-|1 +Additional companies visit. Grey opportunities may not look numbers. Entire, british models assist also great quarters. Little males show|-|Selective,|-|5284|-|0|-|1|-|1 +Additional figures consult relationships. Sole addresses convict right, |-|Operations|-|5322|-|0|-|1|-|1 +Advantages emerge moves; special, expected operations pass etc natural preferences; very posit|-|Selective,|-|5313|-|0|-|1|-|1 +Afterwards defensive standards answer just almost informal officers. Now constant rights shall hear courses. Signs go on a budgets|-|Just good amou|-|5280|-|0|-|1|-|1 +Afterwards oth|-|Just good amou|-|5277|-|0|-|1|-|1 +Afterwards oth|-|Selective,|-|5277|-|0|-|1|-|1 +Afterwards rich options go unlikely, welsh elections. Just gentle authors must not provi|-|Operations|-|5285|-|0|-|1|-|1 +Afterwards written skills influence; english, level departments like just. Really legal rocks would |-|Just good amou|-|5300|-|0|-|1|-|1 +Again|-|Just good amou|-|5319|-|0|-|1|-|1 +Again brief things should remember only in a patients. Deals reply soon other points. Increasingly religious times necessitate farther troops. Both added programmes must come wonderfully solid pupi|-|Matches produce|-|5308|-|0|-|1|-|1 +Again brief things should remember only in a patients. Deals reply soon other points. Increasingly religious times necessitate farther troops. Both added programmes must come wonderfully solid pupi|-|Operations|-|5308|-|0|-|1|-|1 +Again brief things should remember only in a patients. Deals reply soon other points. Increasingly religious times necessitate farther troops. Both added programmes must come wonderfully solid pupi|-|Selective,|-|5308|-|0|-|1|-|1 +Again new teeth heat delicately. Just future officers|-|Just good amou|-|5319|-|0|-|1|-|1 +Again new teeth heat delicately. Just future officers|-|Operations|-|5294|-|0|-|1|-|1 +Again new teeth heat delicately. Just future officers|-|Significantly|-|5294|-|0|-|1|-|1 +Again old police could work in the skills. Points announce agents. Pieces conform slowly to a hea|-|Significantly|-|5307|-|0|-|1|-|1 +Again scottish women shall ag|-|Significantly|-|5308|-|0|-|1|-|1 +Agencies will not move criminal issues. Years mean very largel|-|Selective,|-|5305|-|0|-|1|-|1 +Agents invest often things. French cars ought to get locally distinctive, local powers. More american entries compensate only|-|Operations|-|5317|-|0|-|1|-|1 +Ago correct profits must not handle else. Healthy children may not go only ancient words. Later just characters ought to drink about. British parts must watch soon ago other clients. So vital d|-|Just good amou|-|5317|-|0|-|1|-|1 +Ago correct profits must not handle else. Healthy children may not go only ancient words. Later just characters ought to drink about. British parts must watch soon ago other clients. So vital d|-|Operations|-|5304|-|0|-|1|-|1 +Ago interested doctors meet really fair, cold minds. Fine children understand original procedures. So other services ought to|-|Operations|-|5303|-|0|-|1|-|1 +Ago interested doctors meet really fair, cold minds. Fine children understand original procedures. So other services ought to|-|Significantly|-|5303|-|0|-|1|-|1 +Ago new studies shall not apply of course small forces. Dead parts used to point on a students. Then other students should pay only|-|Matches produce|-|5307|-|0|-|1|-|1 +Ago sexual courts may attract. Important, alone observations expect. New, available ways represent years. Excell|-|Matches produce|-|5301|-|0|-|1|-|1 +Ahead national cir|-|Matches produce|-|5320|-|0|-|1|-|1 +All attractive ways develop originally lucky sites. New, single sounds might excuse enough senior savings. Other bacteria live across a concerns. Dark minutes s|-|Significantly|-|5316|-|0|-|1|-|1 +All capital bacteria make jobs. Again appropriate eyes may not leave others. There fixed ways|-|Just good amou|-|5285|-|0|-|1|-|1 +All difficult emotions supervise. Mere |-|Just good amou|-|5322|-|0|-|1|-|1 +All environmental lips cannot catch; social, broad authorities add for no customers. Interes|-|Just good amou|-|5318|-|0|-|1|-|1 +All following systems develop home different words. Old minutes will come never independent, real duties. Policies used to distinguish all rats. E|-|Matches produce|-|5311|-|0|-|1|-|1 +All full things will not administer quickly difficult women. Ready, new arrangements ma|-|Just good amou|-|5284|-|0|-|1|-|1 +All full things will not administer quickly difficult women. Ready, new arrangements ma|-|Significantly|-|5284|-|0|-|1|-|1 +All real fam|-|Operations|-|5318|-|0|-|1|-|1 +All real fam|-|Selective,|-|5318|-|0|-|1|-|1 +All right other details might distrib|-|Selective,|-|5277|-|0|-|1|-|1 +Almost busy threats go together recent sides; still tired wines shall not admit on a|-|Significantly|-|5300|-|0|-|1|-|1 +Alone arms happen again real documents. Paintings might not invite steps. Internal pairs may increase only rural rooms. Men must not deal here long, heavy patients; merely e|-|Matches produce|-|5310|-|0|-|1|-|1 +Already early meetings cannot go animals. As comprehensive evenings w|-|Just good amou|-|5320|-|0|-|1|-|1 +Already professional senses encourage broad theories. Nearly eastern eyes would describe correct, complex proposals. Friends change crimin|-|Selective,|-|5291|-|0|-|1|-|1 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q73.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q73.out new file mode 100644 index 0000000000000..3e72bb4602652 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q73.out @@ -0,0 +1,5 @@ +Clifford|-|Mark|-|Mr.|-|N|-|61575|-|5 +Ransom|-|Thomas|-|Sir|-|N|-|872|-|5 +Richardson|-|Harry|-|Mr.|-|Y|-|85055|-|5 +Sauer|-|Larry|-|Mr.|-|N|-|215795|-|5 +Valle|-|Chandra|-|Dr.|-|N|-|45338|-|5 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q74.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q74.out new file mode 100644 index 0000000000000..e8d8cd7e444ca --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q74.out @@ -0,0 +1,76 @@ +AAAAAAAAAHOPAAAA|-|null|-|Williams +AAAAAAAAHEIFBAAA|-|null|-|Jones +AAAAAAAAGLDMAAAA|-|Alex|-|Norris +AAAAAAAAOEDIAAAA|-|Alexander|-|Rich +AAAAAAAADKDMAAAA|-|Alice|-|Carpenter +AAAAAAAAKNMEBAAA|-|Amber|-|Gonzalez +AAAAAAAAFGNEAAAA|-|Andrew|-|Silva +AAAAAAAACMIBBAAA|-|Angel|-|Jennings +AAAAAAAACGLDAAAA|-|Angelo|-|Sloan +AAAAAAAAOCDCAAAA|-|Armando|-|Jackson +AAAAAAAABJEDBAAA|-|Arthur|-|Bryan +AAAAAAAAFAIEAAAA|-|Betty|-|Gipson +AAAAAAAAILLJAAAA|-|Billy|-|Ortiz +AAAAAAAAGMFHAAAA|-|Bruce|-|Howe +AAAAAAAAKAKPAAAA|-|Carolann|-|Royer +AAAAAAAAAGLPAAAA|-|Charlene|-|Marcus +AAAAAAAABIIHAAAA|-|Charles|-|Quarles +AAAAAAAAIPKJAAAA|-|Charles|-|Jones +AAAAAAAAPIGBBAAA|-|Charles|-|Welch +AAAAAAAAPNMGAAAA|-|Christine|-|Olds +AAAAAAAAEFCEBAAA|-|Cornelius|-|Martino +AAAAAAAAIBJDBAAA|-|Dean|-|Velez +AAAAAAAALMGGBAAA|-|Dedra|-|Rainey +AAAAAAAANKBBAAAA|-|Diann|-|Saunders +AAAAAAAADKMBAAAA|-|Donald|-|Nelson +AAAAAAAALPHGBAAA|-|Dorothy|-|Heller +AAAAAAAALEAHBAAA|-|Eddie|-|Pena +AAAAAAAAIEJAAAAA|-|Ernest|-|Watson +AAAAAAAAAAECBAAA|-|Frank|-|Wenzel +AAAAAAAAOFFIAAAA|-|Frank|-|Milton +AAAAAAAALLEGBAAA|-|Gary|-|Fink +AAAAAAAAHLEAAAAA|-|Geneva|-|Sims +AAAAAAAALMAJAAAA|-|Ileen|-|Linn +AAAAAAAACEMIAAAA|-|James|-|Hernandez +AAAAAAAABBEAAAAA|-|Jason|-|Gallegos +AAAAAAAAAPAGAAAA|-|Jennifer|-|Lipscomb +AAAAAAAAIODCBAAA|-|Jennifer|-|Crane +AAAAAAAAOMNCAAAA|-|Jerry|-|Mccabe +AAAAAAAACKAJAAAA|-|John|-|Chandler +AAAAAAAAMFMKAAAA|-|John|-|Sanders +AAAAAAAAJCNBBAAA|-|Johnnie|-|Cox +AAAAAAAAOJBPAAAA|-|Jonathan|-|Mcbride +AAAAAAAAABGKAAAA|-|Jonna|-|King +AAAAAAAAPBIPAAAA|-|Joseph|-|Collier +AAAAAAAAGGMHAAAA|-|Julia|-|Fisher +AAAAAAAAOFNOAAAA|-|Kenton|-|Rodriguez +AAAAAAAAOMOKAAAA|-|Laurette|-|Gary +AAAAAAAABIABAAAA|-|Letha|-|Stone +AAAAAAAAPFKDAAAA|-|Linda|-|Simmons +AAAAAAAAJDEFAAAA|-|Loretta|-|Serrano +AAAAAAAAFOEDAAAA|-|Lori|-|Erwin +AAAAAAAABAAGAAAA|-|Luis|-|James +AAAAAAAAGCGIAAAA|-|Mae|-|Williams +AAAAAAAAMJFAAAAA|-|Marcus|-|Espinal +AAAAAAAAJADIAAAA|-|Margaret|-|Roberts +AAAAAAAAHLJCAAAA|-|Marlene|-|Grover +AAAAAAAABGMHBAAA|-|Michael|-|Gillespie +AAAAAAAANBECBAAA|-|Michael|-|Lombardi +AAAAAAAANHFLAAAA|-|Michael|-|Mcreynolds +AAAAAAAAMLOEAAAA|-|Miguel|-|Jackson +AAAAAAAACHNDAAAA|-|Norma|-|Dailey +AAAAAAAADFJBBAAA|-|Patrick|-|Jones +AAAAAAAADHNHBAAA|-|Patrick|-|Cooper +AAAAAAAAOPMDAAAA|-|Peggy|-|Smith +AAAAAAAAAFAGAAAA|-|Robert|-|Chang +AAAAAAAAAFBNAAAA|-|Robert|-|Baines +AAAAAAAAKMHPAAAA|-|Robert|-|Jones +AAAAAAAAJMIDAAAA|-|Sally|-|Thurman +AAAAAAAAMLFGAAAA|-|Samuel|-|Roth +AAAAAAAAJDKKAAAA|-|Sharon|-|Reynolds +AAAAAAAAJIAHAAAA|-|Shawna|-|Delgado +AAAAAAAAHHIOAAAA|-|Sylvia|-|Frazier +AAAAAAAAGMGEBAAA|-|Tamika|-|Potts +AAAAAAAAMHOLAAAA|-|Terri|-|Cook +AAAAAAAADHCBAAAA|-|Therese|-|Perez +AAAAAAAAFHNDAAAA|-|Virgil|-|Mcdonald diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q75.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q75.out new file mode 100644 index 0000000000000..615765ab047b3 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q75.out @@ -0,0 +1,100 @@ +2001|-|2002|-|8015008|-|15|-|8|-|53|-|11672|-|4997|-|-6675|-|-214239.81 +2001|-|2002|-|8015010|-|15|-|8|-|293|-|7243|-|4321|-|-2922|-|-71859.91 +2001|-|2002|-|8008010|-|3|-|8|-|536|-|6300|-|3987|-|-2313|-|-91661.25 +2001|-|2002|-|8013005|-|13|-|8|-|172|-|6690|-|4461|-|-2229|-|-20713.11 +2001|-|2002|-|8014004|-|14|-|8|-|118|-|6253|-|4082|-|-2171|-|-116962.06 +2001|-|2002|-|8016010|-|16|-|8|-|285|-|5812|-|3648|-|-2164|-|-133858.10 +2001|-|2002|-|8012002|-|12|-|8|-|257|-|6342|-|4284|-|-2058|-|-89906.07 +2001|-|2002|-|8003002|-|4|-|8|-|847|-|6404|-|4356|-|-2048|-|-63635.33 +2001|-|2002|-|8014006|-|14|-|8|-|101|-|5587|-|3651|-|-1936|-|-91893.46 +2001|-|2002|-|8001010|-|1|-|8|-|284|-|6507|-|4649|-|-1858|-|-129629.88 +2001|-|2002|-|8006002|-|6|-|8|-|351|-|6414|-|4572|-|-1842|-|-99183.62 +2001|-|2002|-|8001006|-|1|-|8|-|17|-|5539|-|3700|-|-1839|-|-76215.79 +2001|-|2002|-|8006002|-|6|-|8|-|68|-|6384|-|4658|-|-1726|-|-99252.58 +2001|-|2002|-|8015008|-|15|-|8|-|394|-|6199|-|4487|-|-1712|-|-47208.61 +2001|-|2002|-|8002002|-|2|-|8|-|383|-|5332|-|3640|-|-1692|-|-81714.66 +2001|-|2002|-|8015004|-|15|-|8|-|604|-|6300|-|4724|-|-1576|-|-72882.41 +2001|-|2002|-|8007010|-|7|-|8|-|131|-|5060|-|3497|-|-1563|-|-61853.42 +2001|-|2002|-|2001001|-|1|-|8|-|93|-|5967|-|4410|-|-1557|-|-65991.01 +2001|-|2002|-|8013008|-|13|-|8|-|201|-|5613|-|4059|-|-1554|-|-72320.50 +2001|-|2002|-|8007004|-|7|-|8|-|79|-|5489|-|3946|-|-1543|-|-94392.28 +2001|-|2002|-|8010004|-|10|-|8|-|96|-|5529|-|3991|-|-1538|-|-64198.89 +2001|-|2002|-|8012010|-|12|-|8|-|215|-|6352|-|4837|-|-1515|-|-26070.23 +2001|-|2002|-|8013008|-|13|-|8|-|354|-|6384|-|4879|-|-1505|-|-33916.26 +2001|-|2002|-|3003001|-|3|-|8|-|40|-|4913|-|3460|-|-1453|-|-21686.40 +2001|-|2002|-|8011004|-|11|-|8|-|221|-|6155|-|4710|-|-1445|-|-79887.65 +2001|-|2002|-|8012006|-|12|-|8|-|317|-|6224|-|4793|-|-1431|-|-31355.38 +2001|-|2002|-|8013002|-|13|-|8|-|430|-|6524|-|5094|-|-1430|-|1105.64 +2001|-|2002|-|8015004|-|15|-|8|-|435|-|5874|-|4463|-|-1411|-|-70486.25 +2001|-|2002|-|8004002|-|4|-|8|-|379|-|4936|-|3547|-|-1389|-|-83110.25 +2001|-|2002|-|8003008|-|3|-|8|-|450|-|5613|-|4231|-|-1382|-|-55642.18 +2001|-|2002|-|8013010|-|13|-|8|-|113|-|5420|-|4045|-|-1375|-|-25232.38 +2001|-|2002|-|8008008|-|8|-|8|-|90|-|6186|-|4813|-|-1373|-|-52431.49 +2001|-|2002|-|8014006|-|14|-|8|-|115|-|6006|-|4649|-|-1357|-|13658.96 +2001|-|2002|-|9016009|-|16|-|8|-|372|-|5260|-|3931|-|-1329|-|-71539.66 +2001|-|2002|-|8016002|-|16|-|8|-|70|-|6281|-|4970|-|-1311|-|-70869.74 +2001|-|2002|-|8010002|-|10|-|8|-|307|-|5551|-|4268|-|-1283|-|-30988.45 +2001|-|2002|-|8015004|-|15|-|8|-|578|-|5532|-|4251|-|-1281|-|-44337.77 +2001|-|2002|-|1003001|-|3|-|8|-|9|-|6432|-|5152|-|-1280|-|-37290.57 +2001|-|2002|-|8003008|-|10|-|8|-|171|-|6059|-|4807|-|-1252|-|-85910.60 +2001|-|2002|-|9008003|-|8|-|8|-|86|-|5726|-|4479|-|-1247|-|-33406.37 +2001|-|2002|-|8002001|-|15|-|8|-|290|-|5740|-|4508|-|-1232|-|-53291.56 +2001|-|2002|-|8013008|-|13|-|8|-|572|-|5707|-|4479|-|-1228|-|-30795.88 +2001|-|2002|-|8014004|-|14|-|8|-|128|-|6300|-|5078|-|-1222|-|-55888.24 +2001|-|2002|-|8015008|-|15|-|8|-|255|-|6063|-|4852|-|-1211|-|-92017.82 +2001|-|2002|-|8015002|-|15|-|8|-|485|-|6343|-|5147|-|-1196|-|-54784.89 +2001|-|2002|-|8002008|-|2|-|8|-|195|-|5501|-|4312|-|-1189|-|-52573.89 +2001|-|2002|-|8001010|-|5|-|8|-|497|-|5094|-|3923|-|-1171|-|-25947.52 +2001|-|2002|-|8002002|-|2|-|8|-|160|-|5996|-|4829|-|-1167|-|-20244.59 +2001|-|2002|-|8006002|-|6|-|8|-|662|-|5291|-|4125|-|-1166|-|-51922.41 +2001|-|2002|-|3002001|-|10|-|8|-|578|-|6262|-|5118|-|-1144|-|-38510.83 +2001|-|2002|-|8007010|-|7|-|8|-|300|-|6094|-|4965|-|-1129|-|-17445.70 +2001|-|2002|-|8014010|-|14|-|8|-|694|-|5555|-|4434|-|-1121|-|-17567.39 +2001|-|2002|-|2002001|-|2|-|8|-|131|-|6191|-|5086|-|-1105|-|-35818.95 +2001|-|2002|-|6003001|-|3|-|8|-|577|-|5600|-|4504|-|-1096|-|-11476.44 +2001|-|2002|-|10003009|-|3|-|8|-|237|-|6061|-|4984|-|-1077|-|-73999.88 +2001|-|2002|-|8003002|-|3|-|8|-|440|-|5521|-|4448|-|-1073|-|1754.03 +2001|-|2002|-|1003001|-|7|-|8|-|59|-|5315|-|4245|-|-1070|-|-100603.10 +2001|-|2002|-|6016007|-|3|-|8|-|711|-|5584|-|4537|-|-1047|-|-234.14 +2001|-|2002|-|8005004|-|5|-|8|-|84|-|4763|-|3719|-|-1044|-|-50155.92 +2001|-|2002|-|8006002|-|6|-|8|-|239|-|5522|-|4478|-|-1044|-|-8580.43 +2001|-|2002|-|10012015|-|12|-|8|-|662|-|5755|-|4718|-|-1037|-|-36515.27 +2001|-|2002|-|3001001|-|1|-|8|-|244|-|6116|-|5098|-|-1018|-|1550.33 +2001|-|2002|-|1003001|-|3|-|8|-|770|-|5255|-|4243|-|-1012|-|-92630.15 +2001|-|2002|-|8009008|-|9|-|8|-|171|-|6025|-|5017|-|-1008|-|-85427.38 +2001|-|2002|-|8007004|-|7|-|8|-|129|-|6074|-|5080|-|-994|-|-103397.99 +2001|-|2002|-|8016002|-|16|-|8|-|61|-|5169|-|4177|-|-992|-|-39689.60 +2001|-|2002|-|8002008|-|13|-|8|-|295|-|5488|-|4526|-|-962|-|-115637.74 +2001|-|2002|-|8010004|-|1|-|8|-|164|-|4997|-|4036|-|-961|-|-31752.89 +2001|-|2002|-|8016010|-|16|-|8|-|55|-|5883|-|4939|-|-944|-|14736.76 +2001|-|2002|-|8010004|-|16|-|8|-|422|-|5909|-|4966|-|-943|-|-71117.17 +2001|-|2002|-|8004008|-|4|-|8|-|759|-|4998|-|4059|-|-939|-|-25491.13 +2001|-|2002|-|2002001|-|10|-|8|-|985|-|5647|-|4713|-|-934|-|-73166.12 +2001|-|2002|-|8001010|-|1|-|8|-|206|-|5821|-|4889|-|-932|-|-48806.96 +2001|-|2002|-|4003001|-|5|-|8|-|90|-|5862|-|4931|-|-931|-|-82995.00 +2001|-|2002|-|8010002|-|10|-|8|-|68|-|5952|-|5037|-|-915|-|-70925.52 +2001|-|2002|-|8004006|-|4|-|8|-|288|-|5424|-|4524|-|-900|-|-95670.03 +2001|-|2002|-|4004001|-|4|-|8|-|45|-|5602|-|4709|-|-893|-|-40992.18 +2001|-|2002|-|8011006|-|11|-|8|-|44|-|6132|-|5240|-|-892|-|-101995.76 +2001|-|2002|-|6016003|-|16|-|8|-|841|-|6076|-|5208|-|-868|-|-72996.88 +2001|-|2002|-|8005008|-|5|-|8|-|225|-|5273|-|4413|-|-860|-|-11471.16 +2001|-|2002|-|7015001|-|10|-|8|-|293|-|5583|-|4752|-|-831|-|-12557.84 +2001|-|2002|-|6012001|-|12|-|8|-|20|-|5160|-|4347|-|-813|-|-108686.86 +2001|-|2002|-|8008008|-|8|-|8|-|286|-|5282|-|4476|-|-806|-|-68661.89 +2001|-|2002|-|8015008|-|15|-|8|-|190|-|5284|-|4483|-|-801|-|9994.42 +2001|-|2002|-|8006010|-|6|-|8|-|233|-|6139|-|5343|-|-796|-|-56294.64 +2001|-|2002|-|8014006|-|2|-|8|-|404|-|5623|-|4830|-|-793|-|-50114.75 +2001|-|2002|-|8014010|-|3|-|8|-|296|-|5771|-|4978|-|-793|-|57092.74 +2001|-|2002|-|2002001|-|2|-|8|-|257|-|5750|-|4959|-|-791|-|-63685.68 +2001|-|2002|-|8010008|-|4|-|8|-|170|-|5412|-|4627|-|-785|-|-16691.01 +2001|-|2002|-|2004001|-|4|-|8|-|207|-|5801|-|5025|-|-776|-|-37662.74 +2001|-|2002|-|8010004|-|10|-|8|-|165|-|5250|-|4479|-|-771|-|-13198.50 +2001|-|2002|-|7014009|-|10|-|8|-|640|-|5681|-|4915|-|-766|-|-13854.39 +2001|-|2002|-|3001001|-|1|-|8|-|72|-|5288|-|4528|-|-760|-|-76670.28 +2001|-|2002|-|8013008|-|13|-|8|-|128|-|5859|-|5115|-|-744|-|-38901.22 +2001|-|2002|-|4003001|-|16|-|8|-|393|-|5169|-|4426|-|-743|-|-56320.53 +2001|-|2002|-|8010002|-|10|-|8|-|146|-|6312|-|5570|-|-742|-|-5300.03 +2001|-|2002|-|8009004|-|9|-|8|-|924|-|5437|-|4700|-|-737|-|18673.54 +2001|-|2002|-|8001010|-|1|-|8|-|478|-|5686|-|4954|-|-732|-|1586.95 +2001|-|2002|-|8012008|-|12|-|8|-|5|-|5315|-|4587|-|-728|-|-88639.37 +2001|-|2002|-|8001001|-|7|-|8|-|232|-|5718|-|4991|-|-727|-|-41111.39 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q76.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q76.out new file mode 100644 index 0000000000000..40b7b36cbbadf --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q76.out @@ -0,0 +1,100 @@ +catalog|-|cs_warehouse_sk|-|1998|-|1|-|Books|-|8|-|2768.55 +catalog|-|cs_warehouse_sk|-|1998|-|1|-|Children|-|10|-|1797.50 +catalog|-|cs_warehouse_sk|-|1998|-|1|-|Electronics|-|14|-|20772.43 +catalog|-|cs_warehouse_sk|-|1998|-|1|-|Home|-|10|-|9208.02 +catalog|-|cs_warehouse_sk|-|1998|-|1|-|Jewelry|-|6|-|2223.80 +catalog|-|cs_warehouse_sk|-|1998|-|1|-|Men|-|17|-|24377.72 +catalog|-|cs_warehouse_sk|-|1998|-|1|-|Music|-|11|-|15323.00 +catalog|-|cs_warehouse_sk|-|1998|-|1|-|Shoes|-|9|-|37730.93 +catalog|-|cs_warehouse_sk|-|1998|-|1|-|Sports|-|9|-|4440.16 +catalog|-|cs_warehouse_sk|-|1998|-|1|-|Women|-|11|-|8271.52 +catalog|-|cs_warehouse_sk|-|1998|-|2|-|Books|-|16|-|28372.19 +catalog|-|cs_warehouse_sk|-|1998|-|2|-|Children|-|11|-|28823.14 +catalog|-|cs_warehouse_sk|-|1998|-|2|-|Electronics|-|15|-|24163.90 +catalog|-|cs_warehouse_sk|-|1998|-|2|-|Home|-|10|-|5926.38 +catalog|-|cs_warehouse_sk|-|1998|-|2|-|Jewelry|-|8|-|5581.26 +catalog|-|cs_warehouse_sk|-|1998|-|2|-|Men|-|13|-|21785.27 +catalog|-|cs_warehouse_sk|-|1998|-|2|-|Music|-|9|-|15305.12 +catalog|-|cs_warehouse_sk|-|1998|-|2|-|Shoes|-|9|-|4560.10 +catalog|-|cs_warehouse_sk|-|1998|-|2|-|Sports|-|13|-|19607.26 +catalog|-|cs_warehouse_sk|-|1998|-|2|-|Women|-|9|-|6033.05 +catalog|-|cs_warehouse_sk|-|1998|-|3|-|Books|-|13|-|13861.87 +catalog|-|cs_warehouse_sk|-|1998|-|3|-|Children|-|16|-|29763.99 +catalog|-|cs_warehouse_sk|-|1998|-|3|-|Electronics|-|24|-|55646.19 +catalog|-|cs_warehouse_sk|-|1998|-|3|-|Home|-|19|-|23564.27 +catalog|-|cs_warehouse_sk|-|1998|-|3|-|Jewelry|-|23|-|17703.39 +catalog|-|cs_warehouse_sk|-|1998|-|3|-|Men|-|17|-|22716.57 +catalog|-|cs_warehouse_sk|-|1998|-|3|-|Music|-|23|-|37152.75 +catalog|-|cs_warehouse_sk|-|1998|-|3|-|Shoes|-|20|-|29778.48 +catalog|-|cs_warehouse_sk|-|1998|-|3|-|Sports|-|23|-|25879.90 +catalog|-|cs_warehouse_sk|-|1998|-|3|-|Women|-|22|-|28348.20 +catalog|-|cs_warehouse_sk|-|1998|-|4|-|null|-|2|-|607.00 +catalog|-|cs_warehouse_sk|-|1998|-|4|-|Books|-|30|-|38710.54 +catalog|-|cs_warehouse_sk|-|1998|-|4|-|Children|-|44|-|50909.95 +catalog|-|cs_warehouse_sk|-|1998|-|4|-|Electronics|-|41|-|37473.41 +catalog|-|cs_warehouse_sk|-|1998|-|4|-|Home|-|32|-|65827.26 +catalog|-|cs_warehouse_sk|-|1998|-|4|-|Jewelry|-|37|-|84470.31 +catalog|-|cs_warehouse_sk|-|1998|-|4|-|Men|-|27|-|37255.49 +catalog|-|cs_warehouse_sk|-|1998|-|4|-|Music|-|41|-|59017.74 +catalog|-|cs_warehouse_sk|-|1998|-|4|-|Shoes|-|32|-|51428.53 +catalog|-|cs_warehouse_sk|-|1998|-|4|-|Sports|-|27|-|49440.25 +catalog|-|cs_warehouse_sk|-|1998|-|4|-|Women|-|28|-|26421.30 +catalog|-|cs_warehouse_sk|-|1999|-|1|-|Books|-|15|-|17765.70 +catalog|-|cs_warehouse_sk|-|1999|-|1|-|Children|-|6|-|13151.50 +catalog|-|cs_warehouse_sk|-|1999|-|1|-|Electronics|-|8|-|8211.40 +catalog|-|cs_warehouse_sk|-|1999|-|1|-|Home|-|12|-|10096.95 +catalog|-|cs_warehouse_sk|-|1999|-|1|-|Jewelry|-|9|-|10902.15 +catalog|-|cs_warehouse_sk|-|1999|-|1|-|Men|-|10|-|8698.62 +catalog|-|cs_warehouse_sk|-|1999|-|1|-|Music|-|9|-|12104.76 +catalog|-|cs_warehouse_sk|-|1999|-|1|-|Shoes|-|7|-|2139.68 +catalog|-|cs_warehouse_sk|-|1999|-|1|-|Sports|-|6|-|7533.74 +catalog|-|cs_warehouse_sk|-|1999|-|1|-|Women|-|8|-|4619.87 +catalog|-|cs_warehouse_sk|-|1999|-|2|-|Books|-|16|-|23049.55 +catalog|-|cs_warehouse_sk|-|1999|-|2|-|Children|-|13|-|14074.05 +catalog|-|cs_warehouse_sk|-|1999|-|2|-|Electronics|-|17|-|8330.80 +catalog|-|cs_warehouse_sk|-|1999|-|2|-|Home|-|10|-|8329.01 +catalog|-|cs_warehouse_sk|-|1999|-|2|-|Jewelry|-|14|-|14929.85 +catalog|-|cs_warehouse_sk|-|1999|-|2|-|Men|-|9|-|3176.34 +catalog|-|cs_warehouse_sk|-|1999|-|2|-|Music|-|12|-|10221.55 +catalog|-|cs_warehouse_sk|-|1999|-|2|-|Shoes|-|14|-|19748.15 +catalog|-|cs_warehouse_sk|-|1999|-|2|-|Sports|-|14|-|7882.61 +catalog|-|cs_warehouse_sk|-|1999|-|2|-|Women|-|15|-|8652.85 +catalog|-|cs_warehouse_sk|-|1999|-|3|-|Books|-|27|-|41582.37 +catalog|-|cs_warehouse_sk|-|1999|-|3|-|Children|-|18|-|26718.63 +catalog|-|cs_warehouse_sk|-|1999|-|3|-|Electronics|-|20|-|54529.80 +catalog|-|cs_warehouse_sk|-|1999|-|3|-|Home|-|21|-|33259.93 +catalog|-|cs_warehouse_sk|-|1999|-|3|-|Jewelry|-|23|-|38851.88 +catalog|-|cs_warehouse_sk|-|1999|-|3|-|Men|-|25|-|42529.13 +catalog|-|cs_warehouse_sk|-|1999|-|3|-|Music|-|17|-|12196.96 +catalog|-|cs_warehouse_sk|-|1999|-|3|-|Shoes|-|19|-|16619.83 +catalog|-|cs_warehouse_sk|-|1999|-|3|-|Sports|-|14|-|8927.01 +catalog|-|cs_warehouse_sk|-|1999|-|3|-|Women|-|23|-|32173.35 +catalog|-|cs_warehouse_sk|-|1999|-|4|-|Books|-|33|-|42191.52 +catalog|-|cs_warehouse_sk|-|1999|-|4|-|Children|-|24|-|20568.45 +catalog|-|cs_warehouse_sk|-|1999|-|4|-|Electronics|-|36|-|53305.08 +catalog|-|cs_warehouse_sk|-|1999|-|4|-|Home|-|38|-|47024.04 +catalog|-|cs_warehouse_sk|-|1999|-|4|-|Jewelry|-|25|-|30823.46 +catalog|-|cs_warehouse_sk|-|1999|-|4|-|Men|-|31|-|17402.24 +catalog|-|cs_warehouse_sk|-|1999|-|4|-|Music|-|30|-|33307.41 +catalog|-|cs_warehouse_sk|-|1999|-|4|-|Shoes|-|25|-|24656.50 +catalog|-|cs_warehouse_sk|-|1999|-|4|-|Sports|-|32|-|41097.74 +catalog|-|cs_warehouse_sk|-|1999|-|4|-|Women|-|30|-|55217.57 +catalog|-|cs_warehouse_sk|-|2000|-|1|-|Books|-|11|-|13775.24 +catalog|-|cs_warehouse_sk|-|2000|-|1|-|Children|-|15|-|23935.95 +catalog|-|cs_warehouse_sk|-|2000|-|1|-|Electronics|-|10|-|16858.62 +catalog|-|cs_warehouse_sk|-|2000|-|1|-|Home|-|5|-|3096.06 +catalog|-|cs_warehouse_sk|-|2000|-|1|-|Jewelry|-|11|-|20417.53 +catalog|-|cs_warehouse_sk|-|2000|-|1|-|Men|-|3|-|507.84 +catalog|-|cs_warehouse_sk|-|2000|-|1|-|Music|-|12|-|17055.20 +catalog|-|cs_warehouse_sk|-|2000|-|1|-|Shoes|-|9|-|9024.87 +catalog|-|cs_warehouse_sk|-|2000|-|1|-|Sports|-|14|-|19137.11 +catalog|-|cs_warehouse_sk|-|2000|-|1|-|Women|-|7|-|9003.33 +catalog|-|cs_warehouse_sk|-|2000|-|2|-|null|-|1|-|125.12 +catalog|-|cs_warehouse_sk|-|2000|-|2|-|Books|-|13|-|9606.60 +catalog|-|cs_warehouse_sk|-|2000|-|2|-|Children|-|9|-|3079.90 +catalog|-|cs_warehouse_sk|-|2000|-|2|-|Electronics|-|10|-|5803.55 +catalog|-|cs_warehouse_sk|-|2000|-|2|-|Home|-|11|-|10771.22 +catalog|-|cs_warehouse_sk|-|2000|-|2|-|Jewelry|-|14|-|11651.47 +catalog|-|cs_warehouse_sk|-|2000|-|2|-|Men|-|10|-|5584.23 +catalog|-|cs_warehouse_sk|-|2000|-|2|-|Music|-|13|-|7676.64 +catalog|-|cs_warehouse_sk|-|2000|-|2|-|Shoes|-|12|-|235.60 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q77.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q77.out new file mode 100644 index 0000000000000..32a63a07acbab --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q77.out @@ -0,0 +1,44 @@ +null|-|null|-|483431246.61|-|9940693.53|-|-91441062.56 +catalog channel|-|null|-|325825253.96|-|6721169.80|-|-36052465.76 +catalog channel|-|null|-|481773.56|-|1680292.45|-|-1025835.10 +catalog channel|-|1|-|102044852.84|-|1680292.45|-|-13105188.90 +catalog channel|-|2|-|113283637.64|-|1680292.45|-|-12312524.30 +catalog channel|-|4|-|110014989.92|-|1680292.45|-|-9608917.46 +store channel|-|null|-|114950675.73|-|2650053.56|-|-51250807.34 +store channel|-|1|-|19900057.08|-|430318.96|-|-9021290.46 +store channel|-|2|-|19357997.15|-|420826.73|-|-8260880.77 +store channel|-|4|-|18625533.75|-|413145.75|-|-8693775.33 +store channel|-|7|-|19392254.22|-|523129.28|-|-8781756.70 +store channel|-|8|-|18443448.06|-|453191.53|-|-8177970.58 +store channel|-|10|-|19231385.47|-|409441.31|-|-8315133.50 +web channel|-|null|-|42655316.92|-|569470.17|-|-4137789.46 +web channel|-|1|-|1484216.46|-|22578.30|-|-145384.36 +web channel|-|2|-|1434288.77|-|8368.29|-|-74179.21 +web channel|-|4|-|1366508.91|-|23624.40|-|-200293.36 +web channel|-|7|-|1357762.92|-|40137.83|-|-123205.40 +web channel|-|8|-|1488902.03|-|21963.58|-|-135533.22 +web channel|-|10|-|1568120.92|-|11055.99|-|-148192.16 +web channel|-|13|-|1322895.39|-|16655.94|-|-110269.99 +web channel|-|14|-|1367483.46|-|8838.41|-|-184084.28 +web channel|-|16|-|1393205.82|-|26800.78|-|-87656.13 +web channel|-|19|-|1364048.12|-|13570.75|-|-121815.95 +web channel|-|20|-|1313170.80|-|14044.48|-|-194480.66 +web channel|-|22|-|1372505.20|-|19743.54|-|-82372.11 +web channel|-|25|-|1483839.68|-|17464.70|-|12637.58 +web channel|-|26|-|1351984.72|-|16290.97|-|-210017.25 +web channel|-|28|-|1515110.49|-|34693.25|-|-87241.61 +web channel|-|31|-|1472020.01|-|6383.43|-|-163741.34 +web channel|-|32|-|1371605.44|-|23901.58|-|-201414.74 +web channel|-|34|-|1550210.89|-|15290.60|-|-189498.78 +web channel|-|37|-|1292707.71|-|17894.26|-|-179114.08 +web channel|-|38|-|1271096.72|-|16767.70|-|-211804.95 +web channel|-|40|-|1529058.38|-|21329.09|-|-126745.86 +web channel|-|43|-|1489558.57|-|24760.75|-|-100645.79 +web channel|-|44|-|1506795.25|-|9375.29|-|-161279.12 +web channel|-|46|-|1311086.33|-|13347.60|-|-144246.40 +web channel|-|49|-|1492170.04|-|21268.41|-|-97796.30 +web channel|-|50|-|1486817.09|-|14070.53|-|-109583.01 +web channel|-|52|-|1564493.01|-|26771.44|-|-74766.72 +web channel|-|55|-|1330931.73|-|18908.13|-|-235881.43 +web channel|-|56|-|1448998.86|-|26396.32|-|-131860.48 +web channel|-|58|-|1353723.20|-|17173.83|-|-117322.35 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q78.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q78.out new file mode 100644 index 0000000000000..c3ad8b1df860e --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q78.out @@ -0,0 +1,100 @@ +2000|-|173|-|54405|-|1.13|-|52|-|75.21|-|28.63|-|46|-|5.41|-|3.24 +2000|-|200|-|2730|-|15.5|-|93|-|71.28|-|88.90|-|6|-|76.84|-|24.95 +2000|-|205|-|72329|-|2.41|-|94|-|61.57|-|55.70|-|39|-|7.33|-|16.43 +2000|-|209|-|68429|-|4.69|-|75|-|12.41|-|5.70|-|16|-|86.72|-|99.37 +2000|-|614|-|76396|-|0.7|-|31|-|44.11|-|31.33|-|44|-|96.79|-|160.82 +2000|-|781|-|20104|-|1.82|-|31|-|95.70|-|31.23|-|17|-|47.57|-|89.43 +2000|-|817|-|65288|-|3.48|-|73|-|53.45|-|52.27|-|21|-|63.37|-|37.71 +2000|-|821|-|70050|-|0.56|-|44|-|69.71|-|5.22|-|78|-|5.19|-|11.14 +2000|-|902|-|37182|-|1.38|-|77|-|72.80|-|28.82|-|56|-|50.92|-|23.21 +2000|-|908|-|72866|-|0.21|-|18|-|29.18|-|42.78|-|85|-|19.29|-|25.39 +2000|-|955|-|38182|-|null|-|null|-|null|-|34.57|-|14|-|3.26|-|1.16 +2000|-|977|-|14891|-|11.88|-|95|-|72.08|-|64.15|-|8|-|87.62|-|59.45 +2000|-|977|-|78926|-|3.06|-|55|-|50.06|-|14.04|-|18|-|99.40|-|221.96 +2000|-|989|-|65855|-|0.85|-|77|-|33.43|-|43.12|-|91|-|99.51|-|88.11 +2000|-|1213|-|73018|-|0.58|-|49|-|95.20|-|58.15|-|85|-|23.60|-|6.80 +2000|-|1232|-|54921|-|2.33|-|63|-|92.13|-|70.30|-|27|-|69.02|-|80.92 +2000|-|1334|-|92446|-|0.7|-|39|-|81.05|-|3.27|-|56|-|95.89|-|86.00 +2000|-|1415|-|79155|-|0.08|-|7|-|5.76|-|4.16|-|92|-|29.82|-|37.12 +2000|-|1475|-|96517|-|0.46|-|44|-|81.17|-|85.44|-|95|-|76.53|-|26.08 +2000|-|1507|-|57137|-|3.5|-|49|-|36.63|-|28.91|-|14|-|24.70|-|26.04 +2000|-|1661|-|72833|-|1.32|-|74|-|5.20|-|1.01|-|56|-|49.73|-|19.09 +2000|-|1700|-|59383|-|0.35|-|28|-|78.18|-|68.48|-|80|-|97.88|-|164.13 +2000|-|1712|-|22513|-|1.28|-|91|-|35.59|-|29.81|-|71|-|49.17|-|96.94 +2000|-|1741|-|65894|-|1.06|-|70|-|4.79|-|0.54|-|66|-|56.32|-|40.04 +2000|-|1790|-|52233|-|13.5|-|81|-|11.15|-|0.17|-|6|-|80.37|-|21.39 +2000|-|1801|-|94913|-|0.84|-|57|-|15.49|-|0.42|-|68|-|54.91|-|143.90 +2000|-|1853|-|11141|-|0.24|-|16|-|5.65|-|7.97|-|66|-|98.70|-|128.24 +2000|-|1873|-|21793|-|0.78|-|76|-|92.43|-|98.56|-|97|-|58.83|-|129.40 +2000|-|2006|-|61672|-|0.11|-|10|-|37.51|-|33.70|-|93|-|5.14|-|5.63 +2000|-|2102|-|78771|-|6.25|-|100|-|71.20|-|101.71|-|16|-|86.04|-|2.15 +2000|-|2147|-|88708|-|0.03|-|1|-|27.68|-|34.67|-|36|-|67.27|-|42.54 +2000|-|2450|-|56920|-|12.75|-|51|-|69.03|-|38.25|-|4|-|11.58|-|7.58 +2000|-|2567|-|40839|-|0.5|-|27|-|44.39|-|49.26|-|54|-|55.22|-|2.73 +2000|-|2678|-|54927|-|0.98|-|93|-|57.15|-|14.18|-|95|-|43.99|-|2.24 +2000|-|2714|-|71747|-|0.39|-|39|-|86.54|-|58.06|-|99|-|77.54|-|83.46 +2000|-|2911|-|85967|-|1.23|-|37|-|41.12|-|10.58|-|30|-|89.80|-|6.57 +2000|-|2981|-|11933|-|0.57|-|28|-|27.36|-|16.85|-|49|-|24.26|-|8.94 +2000|-|3005|-|13054|-|0.71|-|42|-|72.23|-|124.92|-|59|-|90.18|-|180.75 +2000|-|3151|-|2303|-|1.05|-|99|-|17.17|-|2.07|-|94|-|10.82|-|9.59 +2000|-|3161|-|67421|-|0.8|-|33|-|62.97|-|68.75|-|41|-|72.26|-|91.91 +2000|-|3163|-|92809|-|2.63|-|21|-|8.47|-|0.00|-|8|-|94.08|-|142.39 +2000|-|3218|-|45759|-|0.33|-|23|-|49.64|-|41.51|-|70|-|92.25|-|103.97 +2000|-|3230|-|30229|-|0.72|-|44|-|21.60|-|0.68|-|61|-|72.90|-|178.73 +2000|-|3305|-|88656|-|1.44|-|65|-|61.65|-|13.37|-|45|-|71.10|-|15.99 +2000|-|3434|-|37362|-|0.73|-|32|-|66.31|-|26.41|-|44|-|59.01|-|9.00 +2000|-|3475|-|68428|-|1.12|-|57|-|10.20|-|7.44|-|51|-|51.65|-|74.07 +2000|-|3475|-|85263|-|0.27|-|8|-|61.96|-|108.90|-|30|-|69.95|-|90.27 +2000|-|3524|-|96374|-|3.78|-|68|-|7.77|-|0.99|-|18|-|85.55|-|82.04 +2000|-|3635|-|48930|-|0.31|-|27|-|10.03|-|7.46|-|86|-|54.44|-|94.26 +2000|-|3641|-|15494|-|0.77|-|55|-|9.42|-|6.17|-|71|-|61.88|-|19.26 +2000|-|3877|-|91198|-|1.11|-|49|-|91.53|-|30.49|-|44|-|74.39|-|89.89 +2000|-|3907|-|80864|-|1.22|-|99|-|83.10|-|13.29|-|81|-|62.25|-|44.20 +2000|-|3973|-|26414|-|0.57|-|28|-|83.49|-|77.91|-|49|-|67.48|-|10.48 +2000|-|4061|-|27712|-|5.25|-|84|-|15.89|-|22.40|-|16|-|19.27|-|32.96 +2000|-|4280|-|68469|-|2.7|-|73|-|74.69|-|67.28|-|27|-|52.81|-|88.61 +2000|-|4307|-|49756|-|0.71|-|65|-|90.03|-|29.88|-|91|-|95.19|-|7.31 +2000|-|4448|-|29710|-|1.02|-|91|-|69.23|-|25.61|-|89|-|95.02|-|27.36 +2000|-|4453|-|45451|-|0.58|-|42|-|65.22|-|106.27|-|73|-|87.97|-|152.92 +2000|-|4591|-|42894|-|0.35|-|35|-|92.05|-|80.85|-|100|-|3.27|-|6.51 +2000|-|4658|-|70804|-|0.46|-|32|-|95.25|-|30.04|-|69|-|6.09|-|15.78 +2000|-|4694|-|6009|-|4.07|-|57|-|69.18|-|99.26|-|14|-|13.90|-|6.57 +2000|-|4700|-|81849|-|5.17|-|62|-|60.02|-|87.11|-|12|-|21.70|-|5.76 +2000|-|4789|-|37282|-|0.36|-|36|-|49.47|-|5.49|-|99|-|74.02|-|113.33 +2000|-|4801|-|47319|-|0.09|-|7|-|34.37|-|11.88|-|74|-|79.62|-|59.91 +2000|-|4808|-|32198|-|2.07|-|95|-|89.25|-|66.26|-|46|-|86.11|-|116.69 +2000|-|4940|-|17980|-|2.64|-|58|-|41.82|-|16.20|-|22|-|73.12|-|11.58 +2000|-|4991|-|63914|-|0.4|-|28|-|9.81|-|5.56|-|70|-|25.43|-|5.49 +2000|-|5033|-|32558|-|0.55|-|52|-|3.02|-|4.20|-|95|-|82.55|-|141.58 +2000|-|5075|-|68427|-|12.25|-|98|-|77.20|-|41.68|-|8|-|35.26|-|47.43 +2000|-|5081|-|39149|-|1.41|-|93|-|34.01|-|49.07|-|66|-|51.71|-|75.75 +2000|-|5089|-|94991|-|0.83|-|40|-|35.07|-|30.92|-|48|-|38.57|-|57.24 +2000|-|5093|-|41878|-|1.79|-|86|-|27.16|-|10.25|-|48|-|73.90|-|15.69 +2000|-|5108|-|48482|-|0.1|-|7|-|49.00|-|22.49|-|71|-|48.40|-|49.38 +2000|-|5180|-|75131|-|0.38|-|27|-|95.79|-|67.58|-|72|-|86.93|-|28.65 +2000|-|5279|-|72477|-|1.0|-|62|-|38.18|-|10.84|-|62|-|24.09|-|0.00 +2000|-|5329|-|74950|-|2.05|-|86|-|9.97|-|0.67|-|42|-|5.93|-|3.83 +2000|-|5429|-|49801|-|3.07|-|83|-|79.14|-|46.77|-|27|-|9.22|-|1.25 +2000|-|5611|-|82649|-|2.44|-|44|-|18.05|-|1.83|-|18|-|8.71|-|5.72 +2000|-|5933|-|94977|-|0.69|-|43|-|84.80|-|115.46|-|62|-|21.37|-|17.34 +2000|-|5951|-|54927|-|3.08|-|77|-|2.35|-|3.51|-|25|-|40.50|-|71.18 +2000|-|5959|-|79052|-|0.51|-|37|-|53.51|-|7.35|-|73|-|94.36|-|6.30 +2000|-|6008|-|19872|-|0.38|-|9|-|96.54|-|0.00|-|24|-|76.38|-|3.81 +2000|-|6026|-|25885|-|0.26|-|11|-|85.32|-|58.58|-|43|-|15.36|-|10.83 +2000|-|6035|-|26756|-|0.07|-|6|-|8.74|-|0.15|-|88|-|41.20|-|4.20 +2000|-|6173|-|20157|-|1.37|-|63|-|75.59|-|42.32|-|46|-|8.90|-|2.59 +2000|-|6511|-|47637|-|0.93|-|76|-|90.64|-|119.45|-|82|-|93.36|-|13.47 +2000|-|6557|-|62747|-|1.88|-|60|-|78.99|-|40.52|-|32|-|96.03|-|29.73 +2000|-|6869|-|2961|-|1.96|-|98|-|94.31|-|141.96|-|50|-|16.50|-|4.17 +2000|-|6943|-|9179|-|1.2|-|65|-|55.86|-|31.34|-|54|-|2.09|-|3.14 +2000|-|6989|-|98611|-|0.86|-|70|-|61.11|-|44.48|-|81|-|99.43|-|180.75 +2000|-|7010|-|79575|-|0.45|-|13|-|66.40|-|91.27|-|29|-|59.84|-|29.90 +2000|-|7163|-|60356|-|1.02|-|54|-|91.38|-|67.44|-|53|-|16.38|-|9.05 +2000|-|7229|-|37704|-|1.34|-|94|-|87.20|-|107.35|-|70|-|50.55|-|81.82 +2000|-|7274|-|46985|-|0.05|-|4|-|98.49|-|26.15|-|73|-|55.32|-|20.21 +2000|-|7277|-|72178|-|0.45|-|17|-|53.79|-|71.80|-|38|-|92.51|-|127.20 +2000|-|7297|-|59632|-|1.13|-|54|-|24.08|-|36.44|-|48|-|32.97|-|5.43 +2000|-|7313|-|93524|-|0.33|-|7|-|55.84|-|91.77|-|21|-|6.61|-|1.91 +2000|-|7358|-|8989|-|1.59|-|59|-|16.62|-|21.86|-|37|-|53.82|-|56.13 +2000|-|7385|-|84343|-|1.0|-|44|-|37.83|-|46.32|-|44|-|48.15|-|63.05 +2000|-|7394|-|52815|-|0.69|-|49|-|93.86|-|117.47|-|71|-|89.46|-|123.74 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q79.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q79.out new file mode 100644 index 0000000000000..f1086c661d2c7 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q79.out @@ -0,0 +1,100 @@ +Zook|-|James|-|Midway|-|84825|-|813.99|-|-5125.51 +Zimmerman|-|Barbara|-|Midway|-|77858|-|4118.61|-|-8097.69 +Zimmerman|-|Edward|-|Midway|-|65664|-|2559.16|-|-1691.06 +Zimmerman|-|James|-|Fairview|-|178789|-|0.00|-|-3918.72 +Zimmerman|-|Leonard|-|Midway|-|137226|-|0.00|-|-165.01 +Zimmerman|-|Maritza|-|Midway|-|92437|-|3198.67|-|-15896.29 +Zimmerman|-|Ronald|-|Midway|-|30137|-|553.08|-|-5329.56 +Zimmerman|-|Sonya|-|Fairview|-|32189|-|0.00|-|null +Zimmerman|-|Sonya|-|Fairview|-|32189|-|606.06|-|-626.12 +Zimmer|-|Dale|-|Midway|-|70536|-|39.12|-|-16263.18 +Zielinski|-|Sharon|-|Midway|-|16510|-|1411.17|-|-6948.88 +Ziegler|-|Richard|-|Midway|-|52724|-|797.68|-|-12420.03 +Ziegler|-|Samuel|-|Midway|-|98470|-|3858.99|-|-16638.72 +Zeller|-|Marissa|-|Midway|-|208121|-|0.00|-|-2362.59 +Zeigler|-|Hollie|-|Midway|-|174097|-|1218.11|-|-11699.29 +Zeigler|-|Travis|-|Fairview|-|56427|-|2513.95|-|-13333.55 +Zeigler|-|Travis|-|Midway|-|13494|-|1589.43|-|-7806.79 +Zarate|-|null|-|Midway|-|197343|-|743.77|-|-7265.53 +Zarate|-|Ambrose|-|Midway|-|147481|-|6223.61|-|-21067.39 +Zarate|-|Laura|-|Midway|-|38104|-|1633.46|-|-6446.70 +Zaragoza|-|Sarah|-|Midway|-|93482|-|1752.90|-|-6564.80 +Zaragoza|-|Sarah|-|Midway|-|94285|-|180.59|-|1412.74 +Zamora|-|Leonora|-|Midway|-|136033|-|0.00|-|-5513.60 +Zamora|-|Ruth|-|Midway|-|10944|-|131.66|-|-8839.39 +Zamora|-|Thomas|-|Midway|-|75711|-|7945.46|-|-20077.06 +Yu|-|Julia|-|Midway|-|193176|-|223.44|-|-8544.11 +Yount|-|Roger|-|Midway|-|46630|-|320.50|-|-735.77 +Younger|-|Lida|-|Midway|-|10341|-|2777.25|-|-3988.99 +Youngblood|-|Dominick|-|Midway|-|106106|-|2224.52|-|-18066.60 +Youngblood|-|Joyce|-|Midway|-|212552|-|536.23|-|-8345.46 +Youngblood|-|Stephen|-|Midway|-|139736|-|0.00|-|-2831.90 +Young|-|null|-|Midway|-|98098|-|4834.43|-|-12969.53 +Young|-|Aaron|-|Midway|-|165202|-|0.00|-|2605.73 +Young|-|Agnes|-|Midway|-|155622|-|1415.54|-|-20582.87 +Young|-|Ashley|-|Fairview|-|105131|-|144.39|-|-7578.13 +Young|-|Chris|-|Midway|-|199719|-|351.79|-|-6025.44 +Young|-|Clara|-|Midway|-|225988|-|1292.69|-|-5453.74 +Young|-|Dale|-|Midway|-|152159|-|250.72|-|-10688.56 +Young|-|Danny|-|Midway|-|205085|-|1541.44|-|-5959.32 +Young|-|David|-|Midway|-|235059|-|2277.67|-|-8721.81 +Young|-|David|-|Midway|-|59754|-|1860.33|-|-3889.98 +Young|-|Edward|-|Midway|-|12912|-|7042.11|-|-8170.15 +Young|-|Edward|-|Midway|-|226108|-|744.57|-|-675.87 +Young|-|Elsie|-|Midway|-|179022|-|654.70|-|-2039.88 +Young|-|Eve|-|Midway|-|157931|-|1588.44|-|5792.56 +Young|-|Everett|-|Midway|-|136056|-|3227.31|-|-9213.99 +Young|-|Francis|-|Midway|-|170470|-|537.20|-|-19278.76 +Young|-|Isaac|-|Midway|-|26573|-|595.98|-|-3052.40 +Young|-|Jamie|-|Midway|-|169732|-|4146.72|-|-7217.20 +Young|-|Jeffrey|-|Midway|-|169218|-|366.65|-|-3938.53 +Young|-|Jennifer|-|Midway|-|104691|-|1065.93|-|-5445.08 +Young|-|John|-|Midway|-|111507|-|647.45|-|-17494.28 +Young|-|Jose|-|Midway|-|178702|-|4654.15|-|-18602.97 +Young|-|Karen|-|Midway|-|232692|-|1180.29|-|-4515.22 +Young|-|Laurence|-|Midway|-|48794|-|95.08|-|-8467.60 +Young|-|Lisa|-|Fairview|-|211969|-|904.25|-|-13617.14 +Young|-|Lynette|-|Fairview|-|23078|-|41.90|-|-6463.50 +Young|-|Matthew|-|Midway|-|104867|-|391.84|-|-5583.19 +Young|-|Melissa|-|Midway|-|139261|-|255.65|-|-12543.29 +Young|-|Melissa|-|Midway|-|168653|-|1317.18|-|-5484.77 +Young|-|Melissa|-|Midway|-|168653|-|2731.03|-|-4211.83 +Young|-|Michael|-|Midway|-|154046|-|7903.77|-|-16815.77 +Young|-|Mindy|-|Midway|-|11010|-|0.00|-|-4282.08 +Young|-|Rebecca|-|Midway|-|215921|-|0.00|-|-4899.05 +Young|-|Shawna|-|Midway|-|47235|-|0.00|-|-4629.30 +Young|-|Terry|-|Midway|-|113476|-|2680.02|-|-10025.82 +Young|-|Timothy|-|Midway|-|129000|-|2650.94|-|-15330.69 +Young|-|Timothy|-|Midway|-|172503|-|673.04|-|-14714.80 +Young|-|Timothy|-|Midway|-|210129|-|1159.17|-|-10657.13 +Young|-|Tony|-|Midway|-|82967|-|1659.25|-|-1205.92 +Young|-|Vickie|-|Midway|-|72946|-|5436.18|-|-19947.93 +Young|-|Vincent|-|Midway|-|54641|-|0.00|-|-3492.38 +Young|-|Walton|-|Midway|-|168233|-|2807.73|-|-650.19 +Young|-|Woodrow|-|Midway|-|26435|-|3383.67|-|1042.56 +York|-|Cheryl|-|Midway|-|137203|-|1934.63|-|-4005.57 +York|-|Michelle|-|Midway|-|8085|-|626.77|-|-10025.29 +Yoon|-|Christopher|-|Midway|-|222292|-|3571.20|-|-8126.33 +Yoo|-|Calvin|-|Midway|-|69174|-|24.82|-|-11639.54 +Yoder|-|David|-|Midway|-|166436|-|2327.96|-|-6582.38 +Yoder|-|Gary|-|Midway|-|226050|-|248.75|-|-9115.48 +Yoder|-|Joseph|-|Midway|-|93346|-|1624.98|-|-12480.67 +Yoder|-|Marilyn|-|Midway|-|35755|-|546.38|-|-17636.14 +Yocum|-|Lawrence|-|Midway|-|59217|-|2383.09|-|-9784.13 +Yocum|-|Ruth|-|Midway|-|54131|-|1930.78|-|-7666.33 +Yi|-|Tricia|-|Midway|-|106847|-|2051.66|-|-10972.65 +Yee|-|David|-|Midway|-|126371|-|319.46|-|-14975.27 +Yeager|-|Donnie|-|Midway|-|194339|-|410.23|-|-10797.71 +Ybarra|-|Bao|-|Fairview|-|16895|-|0.00|-|-5302.11 +Ybarra|-|Bao|-|Midway|-|133834|-|2542.62|-|-3277.89 +Ybarra|-|Judy|-|Fairview|-|93433|-|547.89|-|-11959.54 +Ybarra|-|Julia|-|Midway|-|97795|-|266.38|-|-1694.89 +Yates|-|Beverly|-|Fairview|-|78968|-|22.17|-|-6834.08 +Yates|-|Debra|-|Fairview|-|164634|-|null|-|null +Yates|-|Debra|-|Fairview|-|164634|-|2627.48|-|-9370.19 +Yates|-|John|-|Midway|-|179653|-|329.35|-|-7055.85 +Yates|-|Raymond|-|Fairview|-|129381|-|3630.18|-|-14284.77 +Yarbrough|-|Ellen|-|Midway|-|100928|-|23.65|-|-7130.99 +Yarbrough|-|Jane|-|Midway|-|174061|-|120.68|-|-10791.15 +Yarbrough|-|Jason|-|Midway|-|56795|-|171.97|-|-7994.17 +Yarborough|-|Rodney|-|Midway|-|209479|-|1187.71|-|-10165.49 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q8.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q8.out new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q80.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q80.out new file mode 100644 index 0000000000000..7e936c574bd10 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q80.out @@ -0,0 +1,100 @@ +null|-|null|-|12394002.28|-|579360.90|-|-3565544.29 +catalog channel|-|null|-|4336403.99|-|190045.19|-|-496576.74 +catalog channel|-|catalog_pageAAAAAAAAAABAAAAA|-|4438.43|-|383.01|-|-4797.32 +catalog channel|-|catalog_pageAAAAAAAAAADAAAAA|-|1459.86|-|0.00|-|-538.24 +catalog channel|-|catalog_pageAAAAAAAAABBAAAAA|-|6092.40|-|0.00|-|-37.09 +catalog channel|-|catalog_pageAAAAAAAAABDAAAAA|-|878.66|-|0.00|-|401.04 +catalog channel|-|catalog_pageAAAAAAAAACBAAAAA|-|15564.33|-|0.00|-|-743.39 +catalog channel|-|catalog_pageAAAAAAAAACDAAAAA|-|19434.58|-|0.00|-|-1241.86 +catalog channel|-|catalog_pageAAAAAAAAADBAAAAA|-|3357.08|-|0.00|-|-223.80 +catalog channel|-|catalog_pageAAAAAAAAADDAAAAA|-|17773.31|-|0.00|-|10583.67 +catalog channel|-|catalog_pageAAAAAAAAAEBAAAAA|-|11505.75|-|0.00|-|1975.14 +catalog channel|-|catalog_pageAAAAAAAAAEDAAAAA|-|14132.65|-|0.00|-|-3283.42 +catalog channel|-|catalog_pageAAAAAAAAAFDAAAAA|-|8636.84|-|216.08|-|-1736.94 +catalog channel|-|catalog_pageAAAAAAAAAGDAAAAA|-|17045.61|-|145.32|-|1162.68 +catalog channel|-|catalog_pageAAAAAAAAAHAAAAAA|-|19082.44|-|2556.07|-|-16790.11 +catalog channel|-|catalog_pageAAAAAAAAAIAAAAAA|-|7785.09|-|33.84|-|-3860.11 +catalog channel|-|catalog_pageAAAAAAAAAJAAAAAA|-|33875.64|-|0.00|-|6085.44 +catalog channel|-|catalog_pageAAAAAAAAAKAAAAAA|-|4069.90|-|3395.00|-|-57.06 +catalog channel|-|catalog_pageAAAAAAAAALAAAAAA|-|10778.98|-|0.00|-|-6320.25 +catalog channel|-|catalog_pageAAAAAAAAAMAAAAAA|-|23566.51|-|0.00|-|1270.50 +catalog channel|-|catalog_pageAAAAAAAAANAAAAAA|-|11997.42|-|0.00|-|-7811.93 +catalog channel|-|catalog_pageAAAAAAAAANCAAAAA|-|1574.03|-|0.00|-|170.61 +catalog channel|-|catalog_pageAAAAAAAAAOAAAAAA|-|12768.66|-|0.00|-|-1180.46 +catalog channel|-|catalog_pageAAAAAAAAAPAAAAAA|-|15591.17|-|0.00|-|617.97 +catalog channel|-|catalog_pageAAAAAAAAAPCAAAAA|-|0.00|-|0.00|-|-2448.27 +catalog channel|-|catalog_pageAAAAAAAABABAAAAA|-|22630.47|-|0.00|-|4803.56 +catalog channel|-|catalog_pageAAAAAAAABADAAAAA|-|4689.30|-|0.00|-|1920.53 +catalog channel|-|catalog_pageAAAAAAAABBBAAAAA|-|8799.41|-|1594.88|-|-1551.23 +catalog channel|-|catalog_pageAAAAAAAABBDAAAAA|-|2900.27|-|0.00|-|-1813.33 +catalog channel|-|catalog_pageAAAAAAAABCBAAAAA|-|19972.81|-|189.75|-|5730.83 +catalog channel|-|catalog_pageAAAAAAAABCDAAAAA|-|24932.09|-|2122.08|-|3205.82 +catalog channel|-|catalog_pageAAAAAAAABDBAAAAA|-|5321.51|-|0.00|-|143.34 +catalog channel|-|catalog_pageAAAAAAAABDDAAAAA|-|2502.32|-|0.00|-|-1101.24 +catalog channel|-|catalog_pageAAAAAAAABHAAAAAA|-|3734.33|-|0.00|-|-3819.22 +catalog channel|-|catalog_pageAAAAAAAABIAAAAAA|-|37573.12|-|586.70|-|5857.09 +catalog channel|-|catalog_pageAAAAAAAABJAAAAAA|-|12330.42|-|0.00|-|-1486.17 +catalog channel|-|catalog_pageAAAAAAAABJCAAAAA|-|6097.67|-|0.00|-|3736.59 +catalog channel|-|catalog_pageAAAAAAAABKAAAAAA|-|18001.80|-|41.67|-|-7542.13 +catalog channel|-|catalog_pageAAAAAAAABLAAAAAA|-|21210.22|-|0.00|-|2386.64 +catalog channel|-|catalog_pageAAAAAAAABMAAAAAA|-|27450.22|-|35.95|-|-6130.18 +catalog channel|-|catalog_pageAAAAAAAABNAAAAAA|-|24544.71|-|0.00|-|-19634.16 +catalog channel|-|catalog_pageAAAAAAAABNCAAAAA|-|1254.78|-|23.70|-|-2121.59 +catalog channel|-|catalog_pageAAAAAAAABOAAAAAA|-|7397.94|-|0.00|-|-2259.68 +catalog channel|-|catalog_pageAAAAAAAABPAAAAAA|-|23154.42|-|0.00|-|744.22 +catalog channel|-|catalog_pageAAAAAAAACABAAAAA|-|4702.71|-|0.00|-|-13312.05 +catalog channel|-|catalog_pageAAAAAAAACADAAAAA|-|1010.39|-|0.00|-|-2765.23 +catalog channel|-|catalog_pageAAAAAAAACBBAAAAA|-|74.70|-|0.00|-|-1114.49 +catalog channel|-|catalog_pageAAAAAAAACBDAAAAA|-|9217.35|-|0.00|-|3327.65 +catalog channel|-|catalog_pageAAAAAAAACCBAAAAA|-|11097.18|-|0.00|-|3019.32 +catalog channel|-|catalog_pageAAAAAAAACCDAAAAA|-|771.30|-|0.00|-|-365.85 +catalog channel|-|catalog_pageAAAAAAAACDBAAAAA|-|3370.78|-|61.32|-|-1489.09 +catalog channel|-|catalog_pageAAAAAAAACEBAAAAA|-|3646.15|-|0.00|-|1089.86 +catalog channel|-|catalog_pageAAAAAAAACEDAAAAA|-|2402.24|-|0.00|-|-1262.38 +catalog channel|-|catalog_pageAAAAAAAACFDAAAAA|-|2351.04|-|581.76|-|-3631.49 +catalog channel|-|catalog_pageAAAAAAAACHAAAAAA|-|14363.16|-|72.40|-|-6022.88 +catalog channel|-|catalog_pageAAAAAAAACIAAAAAA|-|17233.80|-|290.61|-|-1149.33 +catalog channel|-|catalog_pageAAAAAAAACJAAAAAA|-|17334.55|-|0.00|-|-5325.06 +catalog channel|-|catalog_pageAAAAAAAACKAAAAAA|-|33391.87|-|0.00|-|5427.63 +catalog channel|-|catalog_pageAAAAAAAACLAAAAAA|-|29852.16|-|55.65|-|-4206.17 +catalog channel|-|catalog_pageAAAAAAAACMAAAAAA|-|13596.19|-|0.00|-|1289.63 +catalog channel|-|catalog_pageAAAAAAAACNAAAAAA|-|12652.74|-|2776.86|-|-10512.27 +catalog channel|-|catalog_pageAAAAAAAACOAAAAAA|-|15417.46|-|0.00|-|8.02 +catalog channel|-|catalog_pageAAAAAAAACPAAAAAA|-|6001.13|-|0.00|-|-948.15 +catalog channel|-|catalog_pageAAAAAAAACPCAAAAA|-|6110.72|-|0.00|-|-34.56 +catalog channel|-|catalog_pageAAAAAAAADABAAAAA|-|0.00|-|0.00|-|-674.57 +catalog channel|-|catalog_pageAAAAAAAADADAAAAA|-|13815.26|-|0.00|-|4963.37 +catalog channel|-|catalog_pageAAAAAAAADBBAAAAA|-|4417.61|-|0.00|-|1955.36 +catalog channel|-|catalog_pageAAAAAAAADBDAAAAA|-|9645.90|-|0.00|-|2941.05 +catalog channel|-|catalog_pageAAAAAAAADCBAAAAA|-|4124.08|-|0.00|-|-7880.15 +catalog channel|-|catalog_pageAAAAAAAADCDAAAAA|-|20198.02|-|0.00|-|-3874.19 +catalog channel|-|catalog_pageAAAAAAAADDBAAAAA|-|7697.49|-|875.52|-|3573.72 +catalog channel|-|catalog_pageAAAAAAAADDDAAAAA|-|81.18|-|0.00|-|-40.95 +catalog channel|-|catalog_pageAAAAAAAADEBAAAAA|-|7221.62|-|0.00|-|-2080.43 +catalog channel|-|catalog_pageAAAAAAAADEDAAAAA|-|31633.70|-|0.00|-|1203.47 +catalog channel|-|catalog_pageAAAAAAAADFDAAAAA|-|4486.06|-|0.00|-|-194.53 +catalog channel|-|catalog_pageAAAAAAAADHAAAAAA|-|29478.34|-|0.00|-|2568.57 +catalog channel|-|catalog_pageAAAAAAAADIAAAAAA|-|3541.34|-|0.00|-|-5860.49 +catalog channel|-|catalog_pageAAAAAAAADJAAAAAA|-|27011.83|-|995.61|-|-13747.67 +catalog channel|-|catalog_pageAAAAAAAADKAAAAAA|-|22422.65|-|0.00|-|10022.26 +catalog channel|-|catalog_pageAAAAAAAADLAAAAAA|-|25580.22|-|1878.40|-|3693.93 +catalog channel|-|catalog_pageAAAAAAAADMAAAAAA|-|14964.93|-|0.00|-|-3775.51 +catalog channel|-|catalog_pageAAAAAAAADNAAAAAA|-|7954.26|-|7.41|-|-11362.44 +catalog channel|-|catalog_pageAAAAAAAADOAAAAAA|-|20282.62|-|389.76|-|20.54 +catalog channel|-|catalog_pageAAAAAAAADOCAAAAA|-|2056.15|-|1394.00|-|-96.79 +catalog channel|-|catalog_pageAAAAAAAADPAAAAAA|-|2325.25|-|0.00|-|-3003.94 +catalog channel|-|catalog_pageAAAAAAAADPCAAAAA|-|5.79|-|0.00|-|0.11 +catalog channel|-|catalog_pageAAAAAAAAEABAAAAA|-|5870.11|-|0.00|-|-2224.89 +catalog channel|-|catalog_pageAAAAAAAAEADAAAAA|-|15887.40|-|294.38|-|1553.93 +catalog channel|-|catalog_pageAAAAAAAAEBBAAAAA|-|750.60|-|48.60|-|-1121.83 +catalog channel|-|catalog_pageAAAAAAAAEBDAAAAA|-|2076.12|-|1787.04|-|-7886.05 +catalog channel|-|catalog_pageAAAAAAAAECBAAAAA|-|18310.64|-|2076.12|-|1185.01 +catalog channel|-|catalog_pageAAAAAAAAECDAAAAA|-|6384.54|-|0.00|-|-2290.17 +catalog channel|-|catalog_pageAAAAAAAAEDBAAAAA|-|6470.98|-|0.00|-|3092.44 +catalog channel|-|catalog_pageAAAAAAAAEDDAAAAA|-|7165.64|-|0.00|-|-169.94 +catalog channel|-|catalog_pageAAAAAAAAEEBAAAAA|-|8572.26|-|697.82|-|-1507.83 +catalog channel|-|catalog_pageAAAAAAAAEEDAAAAA|-|9693.59|-|811.58|-|-7987.68 +catalog channel|-|catalog_pageAAAAAAAAEFDAAAAA|-|5850.24|-|0.00|-|2898.90 +catalog channel|-|catalog_pageAAAAAAAAEHAAAAAA|-|18074.80|-|2563.92|-|-2315.60 +catalog channel|-|catalog_pageAAAAAAAAEIAAAAAA|-|1842.65|-|0.00|-|-4113.10 +catalog channel|-|catalog_pageAAAAAAAAEJAAAAAA|-|31976.85|-|194.76|-|4337.39 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q81.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q81.out new file mode 100644 index 0000000000000..1cc23962fe17c --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q81.out @@ -0,0 +1,98 @@ +AAAAAAAAAGGFBAAA|-|Dr.|-|Frank|-|Butler|-|225|-|Oak Hickory|-|Wy|-|Suite K|-|Summerville|-|Warren County|-|IL|-|62033|-|United States|-|-6.00|-|apartment|-|1588.20 +AAAAAAAAAIDKAAAA|-|Miss|-|Tisha|-|Brown|-|37|-|Sixth Lake|-|Wy|-|Suite D|-|Liberty|-|Stephenson County|-|IL|-|63451|-|United States|-|-6.00|-|condo|-|4200.88 +AAAAAAAAAKDBBAAA|-|Dr.|-|Christopher|-|Sullivan|-|111|-|Madison |-|Drive|-|Suite 30|-|Edwards|-|Henderson County|-|IL|-|61409|-|United States|-|-6.00|-|apartment|-|3782.03 +AAAAAAAAANFEBAAA|-|Dr.|-|Rodney|-|Banks|-|9|-|Seventh |-|Lane|-|Suite D|-|Valley View|-|McLean County|-|IL|-|65124|-|United States|-|-6.00|-|apartment|-|15759.01 +AAAAAAAAAPCDBAAA|-|Dr.|-|Marvin|-|Iverson|-|302|-|Walnut 2nd|-|Pkwy|-|Suite X|-|White Oak|-|Marion County|-|IL|-|66668|-|United States|-|-6.00|-|single family|-|2916.20 +AAAAAAAABAEIBAAA|-|Dr.|-|Nicholas|-|Woodard|-|74|-|13th 6th|-|Blvd|-|Suite 390|-|Cedar Grove|-|Grundy County|-|IL|-|60411|-|United States|-|-6.00|-|single family|-|2384.51 +AAAAAAAABFGFAAAA|-|Ms.|-|Cheryl|-|Sturgis|-|566|-|Third Railroad|-|Drive|-|Suite N|-|Oakdale|-|Fulton County|-|IL|-|69584|-|United States|-|-6.00|-|single family|-|3338.73 +AAAAAAAABFNHBAAA|-|Sir|-|James|-|Bird|-|26|-|East Main|-|Circle|-|Suite 400|-|Mount Vernon|-|Brown County|-|IL|-|68482|-|United States|-|-6.00|-|apartment|-|3171.08 +AAAAAAAABGLPAAAA|-|Sir|-|Maurice|-|Woodward|-|31|-|Lake |-|Cir.|-|Suite 130|-|Greenville|-|Pope County|-|IL|-|61387|-|United States|-|-6.00|-|condo|-|2335.02 +AAAAAAAABHKDBAAA|-|Dr.|-|Michael|-|Johnston|-|99|-|Johnson |-|Drive|-|Suite Q|-|Fairview|-|Rock Island County|-|IL|-|65709|-|United States|-|-6.00|-|condo|-|1612.11 +AAAAAAAABJNHAAAA|-|Ms.|-|Olga|-|Williams|-|181|-|Center |-|Wy|-|Suite 140|-|Oak Grove|-|Tazewell County|-|IL|-|68370|-|United States|-|-6.00|-|condo|-|3872.28 +AAAAAAAACAKJAAAA|-|Mr.|-|Frank|-|null|-|null|-|Sixth |-|null|-|null|-|null|-|Fulton County|-|IL|-|66060|-|null|-|-6.00|-|null|-|5995.62 +AAAAAAAACEEJAAAA|-|Mr.|-|Dennis|-|Haskell|-|993|-|Lincoln |-|Ln|-|Suite E|-|Sulphur Springs|-|Effingham County|-|IL|-|68354|-|United States|-|-6.00|-|single family|-|2202.76 +AAAAAAAACIGCAAAA|-|Sir|-|Patrick|-|Tipton|-|156|-|Ridge Willow|-|Avenue|-|Suite 430|-|White Hall|-|Winnebago County|-|IL|-|66955|-|United States|-|-6.00|-|condo|-|6138.11 +AAAAAAAACJMDBAAA|-|Miss|-|Stacie|-|Thacker|-|390|-|Green Franklin|-|RD|-|Suite B|-|Florence|-|Rock Island County|-|IL|-|63394|-|United States|-|-6.00|-|single family|-|14729.27 +AAAAAAAACMHDAAAA|-|Miss|-|Anna|-|Mcdowell|-|790|-|North Lincoln|-|Street|-|Suite 290|-|Lakeside|-|Mercer County|-|IL|-|69532|-|United States|-|-6.00|-|condo|-|2119.15 +AAAAAAAACNKFAAAA|-|Mr.|-|Dennis|-|Kelly|-|315|-|Spruce East|-|Court|-|Suite 50|-|Maple Grove|-|McDonough County|-|IL|-|68252|-|United States|-|-6.00|-|single family|-|5534.55 +AAAAAAAACNODAAAA|-|Mr.|-|Henry|-|Coleman|-|61|-|Cedar |-|Avenue|-|Suite V|-|Jamestown|-|Montgomery County|-|IL|-|66867|-|United States|-|-6.00|-|condo|-|1705.76 +AAAAAAAADCHAAAAA|-|Sir|-|Steve|-|Martin|-|555|-|15th Johnson|-|Parkway|-|Suite 70|-|Kingston|-|Monroe County|-|IL|-|64975|-|United States|-|-6.00|-|single family|-|2147.60 +AAAAAAAADDAKAAAA|-|Sir|-|David|-|Kirby|-|332|-|10th Madison|-|Ln|-|Suite 440|-|Highland|-|De Witt County|-|IL|-|69454|-|United States|-|-6.00|-|single family|-|2695.19 +AAAAAAAADGGHBAAA|-|Mrs.|-|Kathryn|-|Jordan|-|254|-|null|-|RD|-|Suite P|-|Mount Pleasant|-|Pike County|-|IL|-|61933|-|United States|-|-6.00|-|null|-|8010.44 +AAAAAAAAEAIGBAAA|-|Ms.|-|Majorie|-|Hill|-|109|-|12th |-|Pkwy|-|Suite 130|-|Mount Zion|-|Brown County|-|IL|-|68054|-|United States|-|-6.00|-|single family|-|3221.40 +AAAAAAAAEELAAAAA|-|Ms.|-|Dessie|-|Thompson|-|203|-|Sycamore |-|Boulevard|-|Suite 330|-|Deerfield|-|Madison County|-|IL|-|69840|-|United States|-|-6.00|-|single family|-|2515.29 +AAAAAAAAEFOAAAAA|-|Sir|-|Matthew|-|Martin|-|472|-|Johnson |-|Drive|-|Suite I|-|Mount Zion|-|Kankakee County|-|IL|-|68054|-|United States|-|-6.00|-|single family|-|2405.32 +AAAAAAAAEGGFAAAA|-|Miss|-|Eleanor|-|Frey|-|937|-|Third Third|-|Drive|-|Suite R|-|Greenwood|-|Morgan County|-|IL|-|68828|-|United States|-|-6.00|-|condo|-|2090.49 +AAAAAAAAEGPAAAAA|-|Ms.|-|Laurel|-|Smart|-|701|-|Meadow |-|Road|-|Suite 190|-|Kingston|-|Grundy County|-|IL|-|64975|-|United States|-|-6.00|-|apartment|-|3695.26 +AAAAAAAAELFBAAAA|-|Dr.|-|Annie|-|Mathews|-|49|-|Williams |-|Boulevard|-|Suite Y|-|Shady Grove|-|Jackson County|-|IL|-|62812|-|United States|-|-6.00|-|condo|-|6742.72 +AAAAAAAAELIOAAAA|-|Dr.|-|Barbara|-|Davis|-|847|-|Church 9th|-|Circle|-|Suite 110|-|Waterloo|-|Wayne County|-|IL|-|61675|-|United States|-|-6.00|-|single family|-|3206.59 +AAAAAAAAEPPEAAAA|-|Mrs.|-|Claire|-|Drake|-|431|-|Fourth |-|Way|-|Suite X|-|Liberty|-|Wabash County|-|IL|-|63451|-|United States|-|-6.00|-|apartment|-|2448.25 +AAAAAAAAFCDFBAAA|-|Ms.|-|Anthony|-|Owen|-|734|-|Elm |-|RD|-|Suite C|-|Walnut Grove|-|Johnson County|-|IL|-|67752|-|United States|-|-6.00|-|single family|-|9663.84 +AAAAAAAAFFOOAAAA|-|Ms.|-|Amy|-|Mccoy|-|137|-|Fifth View|-|Avenue|-|Suite L|-|Greenville|-|Scott County|-|IL|-|61387|-|United States|-|-6.00|-|apartment|-|4680.53 +AAAAAAAAFGGEBAAA|-|Mr.|-|David|-|Kelly|-|10|-|Madison |-|ST|-|Suite 430|-|Pleasant Hill|-|Edgar County|-|IL|-|63604|-|United States|-|-6.00|-|single family|-|3468.52 +AAAAAAAAFIHEBAAA|-|Ms.|-|Ruth|-|Powell|-|262|-|College |-|RD|-|Suite 290|-|Bunker Hill|-|Franklin County|-|IL|-|60150|-|United States|-|-6.00|-|single family|-|9148.65 +AAAAAAAAFLPDAAAA|-|Dr.|-|Charles|-|Woody|-|754|-|Hill Main|-|Way|-|Suite 50|-|Wildwood|-|DuPage County|-|IL|-|66871|-|United States|-|-6.00|-|condo|-|3457.36 +AAAAAAAAFNIPAAAA|-|Miss|-|Jeanette|-|Martinez|-|774|-|Williams Oak|-|Drive|-|Suite K|-|Lincoln|-|Tazewell County|-|IL|-|61289|-|United States|-|-6.00|-|apartment|-|3857.77 +AAAAAAAAFOOABAAA|-|Mrs.|-|Lonna|-|Leggett|-|293|-|Main |-|Road|-|Suite 330|-|Bridgeport|-|Piatt County|-|IL|-|65817|-|United States|-|-6.00|-|apartment|-|2320.84 +AAAAAAAAFPFJAAAA|-|Sir|-|Raymond|-|Glenn|-|567|-|Chestnut Laurel|-|Ln|-|Suite 160|-|Oakdale|-|DuPage County|-|IL|-|69584|-|United States|-|-6.00|-|single family|-|9939.36 +AAAAAAAAFPGNAAAA|-|Sir|-|Robert|-|Shaffer|-|535|-|Fourth |-|ST|-|Suite T|-|Newport|-|Livingston County|-|IL|-|61521|-|United States|-|-6.00|-|single family|-|4070.35 +AAAAAAAAGBHFBAAA|-|Dr.|-|Neil|-|Mayberry|-|350|-|Poplar Main|-|Pkwy|-|Suite E|-|Hopewell|-|Pope County|-|IL|-|60587|-|United States|-|-6.00|-|condo|-|9071.04 +AAAAAAAAGBNKAAAA|-|Sir|-|Thomas|-|Tennant|-|338|-|Forest |-|Lane|-|Suite F|-|Deerfield|-|Tazewell County|-|IL|-|69840|-|United States|-|-6.00|-|apartment|-|1683.46 +AAAAAAAAGDKGAAAA|-|Dr.|-|Lowell|-|Perez|-|997|-|Pine |-|ST|-|Suite E|-|Maple Grove|-|Coles County|-|IL|-|68252|-|United States|-|-6.00|-|apartment|-|8735.61 +AAAAAAAAGEGEAAAA|-|Mrs.|-|Terra|-|Villa|-|937|-|8th |-|Ct.|-|Suite 110|-|Rutland|-|Williamson County|-|IL|-|68375|-|United States|-|-6.00|-|apartment|-|2216.62 +AAAAAAAAGFIGAAAA|-|Miss|-|Priscilla|-|Verdin|-|988|-|Mill 13th|-|Blvd|-|Suite V|-|Providence|-|Mason County|-|IL|-|66614|-|United States|-|-6.00|-|condo|-|3337.71 +AAAAAAAAGIPDBAAA|-|Dr.|-|Matthew|-|Boyd|-|201|-|Sycamore Maple|-|Ln|-|Suite 470|-|Wilson|-|Massac County|-|IL|-|66971|-|United States|-|-6.00|-|apartment|-|5135.38 +AAAAAAAAGJKPAAAA|-|Mrs.|-|Jennifer|-|Bellamy|-|84|-|4th Highland|-|Cir.|-|Suite M|-|Bunker Hill|-|Champaign County|-|IL|-|60150|-|United States|-|-6.00|-|condo|-|2026.95 +AAAAAAAAGMAKAAAA|-|Dr.|-|David|-|Barron|-|338|-|Forest |-|Lane|-|Suite F|-|Deerfield|-|Tazewell County|-|IL|-|69840|-|United States|-|-6.00|-|apartment|-|1840.22 +AAAAAAAAHAOPAAAA|-|Dr.|-|David|-|Gordon|-|156|-|Elm North|-|Cir.|-|Suite Y|-|Newport|-|Grundy County|-|IL|-|61521|-|United States|-|-6.00|-|condo|-|2233.76 +AAAAAAAAHCIHBAAA|-|Sir|-|Frank|-|Mendez|-|763|-|Hickory Wilson|-|Drive|-|Suite 190|-|Yorktown|-|Moultrie County|-|IL|-|60732|-|United States|-|-6.00|-|single family|-|5579.44 +AAAAAAAAHDGFAAAA|-|Dr.|-|Melissa|-|Mckinley|-|75|-|Oak |-|Parkway|-|Suite A|-|Antioch|-|Gallatin County|-|IL|-|68605|-|United States|-|-6.00|-|apartment|-|1354.09 +AAAAAAAAHDHFAAAA|-|Miss|-|Holly|-|Horn|-|895|-|South |-|Dr.|-|Suite S|-|Unionville|-|Mason County|-|IL|-|61711|-|United States|-|-6.00|-|single family|-|4783.71 +AAAAAAAAHFOBAAAA|-|Mrs.|-|Kristin|-|Brady|-|650|-|Seventh |-|Boulevard|-|Suite M|-|Crossroads|-|Bond County|-|IL|-|60534|-|United States|-|-6.00|-|single family|-|3310.78 +AAAAAAAAIDLDBAAA|-|Dr.|-|Ella|-|Joiner|-|938|-|Ninth Poplar|-|Drive|-|Suite 320|-|Oak Ridge|-|DeKalb County|-|IL|-|68371|-|United States|-|-6.00|-|single family|-|3570.77 +AAAAAAAAIEHPAAAA|-|Dr.|-|Jaime|-|Meeks|-|635|-|Fourteenth 2nd|-|Parkway|-|Suite 230|-|Lone Oak|-|Warren County|-|IL|-|66893|-|United States|-|-6.00|-|single family|-|3971.18 +AAAAAAAAIJAEBAAA|-|Dr.|-|Mike|-|Williams|-|684|-|Church Broadway|-|Ave|-|Suite 200|-|Sunnyside|-|Bureau County|-|IL|-|61952|-|United States|-|-6.00|-|single family|-|1834.73 +AAAAAAAAILEHBAAA|-|Sir|-|Rudolph|-|Farr|-|866|-|Ridge |-|Blvd|-|Suite D|-|Brownsville|-|Williamson County|-|IL|-|69310|-|United States|-|-6.00|-|single family|-|4192.67 +AAAAAAAAJBCCAAAA|-|Miss|-|Teri|-|Gallagher|-|198|-|Hillcrest |-|Ct.|-|Suite T|-|Stringtown|-|Clay County|-|IL|-|60162|-|United States|-|-6.00|-|apartment|-|6391.56 +AAAAAAAAJDHEBAAA|-|null|-|null|-|Smith|-|632|-|4th 4th|-|Way|-|Suite 10|-|Spring Hill|-|Greene County|-|IL|-|66787|-|United States|-|-6.00|-|condo|-|3341.68 +AAAAAAAAJFBJAAAA|-|Dr.|-|Michael|-|Underwood|-|981|-|Jackson Walnut|-|Boulevard|-|Suite C|-|Mount Olive|-|Massac County|-|IL|-|68059|-|United States|-|-6.00|-|condo|-|4441.28 +AAAAAAAAJFNEBAAA|-|Dr.|-|Jarrod|-|Williams|-|802|-|Maple |-|RD|-|Suite 250|-|Liberty|-|Wabash County|-|IL|-|63451|-|United States|-|-6.00|-|single family|-|2198.85 +AAAAAAAAJJDIAAAA|-|Mrs.|-|Elizabeth|-|Bailey|-|963|-|Fifth |-|Ln|-|Suite F|-|Marion|-|Wabash County|-|IL|-|60399|-|United States|-|-6.00|-|condo|-|2906.93 +AAAAAAAAJJKFAAAA|-|Mrs.|-|Janet|-|Carroll|-|229|-|11th Hillcrest|-|Ln|-|Suite C|-|Williamsville|-|Washington County|-|IL|-|68754|-|United States|-|-6.00|-|condo|-|3078.07 +AAAAAAAAJKMBAAAA|-|Ms.|-|Andrew|-|Jones|-|350|-|Poplar Main|-|Pkwy|-|Suite E|-|Hopewell|-|Pope County|-|IL|-|60587|-|United States|-|-6.00|-|condo|-|2055.72 +AAAAAAAAKBHGAAAA|-|null|-|Glenda|-|Valencia|-|361|-|Oak College|-|Circle|-|Suite H|-|Hillcrest|-|Carroll County|-|IL|-|63003|-|United States|-|-6.00|-|single family|-|2467.37 +AAAAAAAAKGJFAAAA|-|Dr.|-|Anthony|-|Patton|-|691|-|9th Church|-|RD|-|Suite F|-|Wilson|-|Jo Daviess County|-|IL|-|66971|-|United States|-|-6.00|-|single family|-|2929.40 +AAAAAAAAKPJMAAAA|-|Dr.|-|James|-|Young|-|66|-|Elm |-|Cir.|-|Suite 80|-|Oakland|-|Lake County|-|IL|-|69843|-|United States|-|-6.00|-|condo|-|2469.99 +AAAAAAAAKPLBBAAA|-|Dr.|-|Lynn|-|Bell|-|953|-|Ash |-|Court|-|Suite A|-|Buena Vista|-|Logan County|-|IL|-|65752|-|United States|-|-6.00|-|condo|-|1588.73 +AAAAAAAALDGHAAAA|-|Mrs.|-|Cynthia|-|Wicker|-|92|-|West Fourth|-|Boulevard|-|Suite 320|-|Franklin|-|Kendall County|-|IL|-|69101|-|United States|-|-6.00|-|apartment|-|1900.67 +AAAAAAAALGFHAAAA|-|Ms.|-|Kathy|-|Smith|-|196|-|View |-|Ave|-|Suite H|-|Lebanon|-|Stark County|-|IL|-|62898|-|United States|-|-6.00|-|condo|-|5348.47 +AAAAAAAALGHLAAAA|-|Ms.|-|Marjorie|-|Gordon|-|102|-|5th |-|Wy|-|Suite 370|-|Wildwood|-|Ford County|-|IL|-|66871|-|United States|-|-6.00|-|single family|-|4803.39 +AAAAAAAALIPCBAAA|-|Mrs.|-|Hannah|-|Armstrong|-|838|-|1st |-|Drive|-|Suite 260|-|Hopewell|-|Warren County|-|IL|-|60587|-|United States|-|-6.00|-|single family|-|8884.78 +AAAAAAAALNPCAAAA|-|Miss|-|Belinda|-|Hodgson|-|418|-|Spring Fifth|-|Ct.|-|Suite 360|-|Jamestown|-|Marshall County|-|IL|-|66867|-|United States|-|-6.00|-|single family|-|1766.80 +AAAAAAAAMAIHBAAA|-|Sir|-|Rodger|-|Rivers|-|990|-|8th River|-|Drive|-|Suite 330|-|Five Points|-|De Witt County|-|IL|-|66098|-|United States|-|-6.00|-|condo|-|2405.96 +AAAAAAAAMGIGAAAA|-|Dr.|-|Barry|-|Ross|-|477|-|Franklin |-|Avenue|-|Suite 320|-|White Oak|-|McDonough County|-|IL|-|66668|-|United States|-|-6.00|-|single family|-|3265.26 +AAAAAAAAMGJOAAAA|-|Dr.|-|Tiffany|-|Harlow|-|916|-|North Jefferson|-|Lane|-|Suite 240|-|Deerfield|-|Fayette County|-|IL|-|69840|-|United States|-|-6.00|-|condo|-|11331.98 +AAAAAAAAMLNMAAAA|-|Ms.|-|Graciela|-|Lancaster|-|623|-|South Smith|-|Street|-|Suite 320|-|Arlington|-|Vermilion County|-|IL|-|66557|-|United States|-|-6.00|-|condo|-|2236.85 +AAAAAAAAMNGEAAAA|-|Mrs.|-|Eunice|-|Howard|-|982|-|Main 14th|-|Blvd|-|Suite 410|-|Liberty|-|Kendall County|-|IL|-|63451|-|United States|-|-6.00|-|single family|-|5535.99 +AAAAAAAANFBPAAAA|-|Dr.|-|Loren|-|Coleman|-|141|-|6th |-|Pkwy|-|Suite 10|-|Plainview|-|Ford County|-|IL|-|63683|-|United States|-|-6.00|-|condo|-|1907.00 +AAAAAAAANFMAAAAA|-|Miss|-|Joann|-|Rogers|-|82|-|Pine |-|Blvd|-|Suite 380|-|Wildwood|-|Union County|-|IL|-|66871|-|United States|-|-6.00|-|single family|-|1806.16 +AAAAAAAANFMAAAAA|-|Miss|-|Joann|-|Rogers|-|82|-|Pine |-|Blvd|-|Suite 380|-|Wildwood|-|Union County|-|IL|-|66871|-|United States|-|-6.00|-|single family|-|9076.27 +AAAAAAAANJFJAAAA|-|Miss|-|Ruth|-|Headley|-|436|-|Miller Main|-|Dr.|-|Suite E|-|Clinton|-|Winnebago County|-|IL|-|68222|-|United States|-|-6.00|-|apartment|-|9910.63 +AAAAAAAANJMGAAAA|-|Dr.|-|William|-|Helm|-|760|-|Davis |-|Avenue|-|Suite N|-|Pleasant Grove|-|Carroll County|-|IL|-|64136|-|United States|-|-6.00|-|condo|-|8952.28 +AAAAAAAANLBJAAAA|-|Sir|-|Kevin|-|Hawthorne|-|652|-|Sycamore Wilson|-|Wy|-|Suite O|-|Jamestown|-|Lake County|-|IL|-|66867|-|United States|-|-6.00|-|apartment|-|1745.91 +AAAAAAAANLEAAAAA|-|Sir|-|Micheal|-|Bell|-|908|-|Center |-|Lane|-|Suite 400|-|Riverside|-|Champaign County|-|IL|-|69231|-|United States|-|-6.00|-|condo|-|5822.16 +AAAAAAAANOCFBAAA|-|Mr.|-|Henry|-|Head|-|748|-|Davis |-|Ln|-|Suite U|-|Springfield|-|McLean County|-|IL|-|69303|-|United States|-|-6.00|-|apartment|-|2234.23 +AAAAAAAAODCPAAAA|-|Mr.|-|Melvin|-|Johnson|-|935|-|Forest Woodland|-|Circle|-|Suite S|-|Elkton|-|Pulaski County|-|IL|-|63481|-|United States|-|-6.00|-|condo|-|2664.64 +AAAAAAAAOFCHAAAA|-|Dr.|-|Jorge|-|Steed|-|587|-|Park 4th|-|Ave|-|Suite B|-|Hazelwood|-|Christian County|-|IL|-|61206|-|United States|-|-6.00|-|condo|-|10644.42 +AAAAAAAAOFLFAAAA|-|Ms.|-|Caitlin|-|Huffman|-|591|-|5th |-|Boulevard|-|Suite B|-|Highland Park|-|Brown County|-|IL|-|66534|-|United States|-|-6.00|-|condo|-|1627.76 +AAAAAAAAOHPHAAAA|-|Sir|-|David|-|Mcneal|-|750|-|Main |-|Circle|-|Suite 380|-|Oakland|-|Warren County|-|IL|-|69843|-|United States|-|-6.00|-|apartment|-|2137.22 +AAAAAAAAONOKAAAA|-|Mr.|-|Mohammad|-|Gaines|-|460|-|Jackson |-|Ave|-|Suite 30|-|Cedar|-|Edwards County|-|IL|-|61229|-|United States|-|-6.00|-|single family|-|1834.99 +AAAAAAAAOOCFBAAA|-|Sir|-|Everett|-|Smith|-|788|-|Meadow 1st|-|Circle|-|Suite 160|-|Stringtown|-|Montgomery County|-|IL|-|60162|-|United States|-|-6.00|-|apartment|-|1960.44 +AAAAAAAAOOEFAAAA|-|Dr.|-|Gabriel|-|Raymond|-|84|-|4th Highland|-|Cir.|-|Suite M|-|Bunker Hill|-|Champaign County|-|IL|-|60150|-|United States|-|-6.00|-|condo|-|6728.45 +AAAAAAAAPDCGAAAA|-|Ms.|-|Audrey|-|Spooner|-|481|-|Oak |-|Court|-|Suite D|-|Oak Grove|-|Washington County|-|IL|-|68370|-|United States|-|-6.00|-|apartment|-|4275.84 +AAAAAAAAPIJJAAAA|-|Dr.|-|Robert|-|Evans|-|140|-|Oak |-|Boulevard|-|Suite K|-|Shady Grove|-|Coles County|-|IL|-|62812|-|United States|-|-6.00|-|single family|-|4347.34 +AAAAAAAAPJJCBAAA|-|Dr.|-|Kimberly|-|Jenkins|-|196|-|View |-|Ave|-|Suite H|-|Lebanon|-|Stark County|-|IL|-|62898|-|United States|-|-6.00|-|condo|-|1887.85 +AAAAAAAAPKOGAAAA|-|Dr.|-|Kathleen|-|Peterson|-|890|-|Woodland Second|-|ST|-|Suite 470|-|Georgetown|-|Piatt County|-|IL|-|67057|-|United States|-|-6.00|-|condo|-|4573.61 +AAAAAAAAPLLHBAAA|-|Mr.|-|Neil|-|Mooney|-|816|-|2nd |-|Road|-|Suite J|-|Oakdale|-|Effingham County|-|IL|-|69584|-|United States|-|-6.00|-|single family|-|2265.59 +AAAAAAAAPNFIBAAA|-|Miss|-|Catherine|-|Moore|-|85|-|Woodland Lee|-|Lane|-|Suite H|-|Woodville|-|Wayne County|-|IL|-|64289|-|United States|-|-6.00|-|apartment|-|8101.55 +AAAAAAAAPNKHAAAA|-|Dr.|-|Janett|-|Huskey|-|110|-|Mill |-|Blvd|-|Suite G|-|Macedonia|-|Jasper County|-|IL|-|61087|-|United States|-|-6.00|-|condo|-|7737.16 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q82.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q82.out new file mode 100644 index 0000000000000..6dac81513da76 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q82.out @@ -0,0 +1 @@ +AAAAAAAACNAEAAAA|-|Indivi|-|45.77 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q83.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q83.out new file mode 100644 index 0000000000000..b8f80dadc8810 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q83.out @@ -0,0 +1,3 @@ +AAAAAAAAAPCCAAAA|-|1|-|0.5847953216374269|-|54|-|31.57894736842105|-|2|-|1.1695906432748537|-|19.000000 +AAAAAAAABBEBAAAA|-|23|-|19.166666666666664|-|4|-|3.3333333333333335|-|13|-|10.833333333333334|-|13.333333 +AAAAAAAABHODAAAA|-|35|-|16.666666666666664|-|1|-|0.47619047619047616|-|34|-|16.19047619047619|-|23.333333 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q84.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q84.out new file mode 100644 index 0000000000000..6356d40969b7c --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q84.out @@ -0,0 +1,28 @@ +AAAAAAAAAMHBAAAA|-|Guerin, Florine +AAAAAAAAANGABAAA|-|Cleary, George +AAAAAAAABFKIAAAA|-|Frasier, Joseph +AAAAAAAACJNCAAAA|-|Thomas, Jack +AAAAAAAADAIHBAAA|-|Samuels, Ronald +AAAAAAAAEDHLAAAA|-|German, Joyce +AAAAAAAAEPABBAAA|-|Maxwell, Delia +AAAAAAAAFLEEBAAA|-|Bernard, Diane +AAAAAAAAFPKHAAAA|-|Payton, Ali +AAAAAAAAGKGFBAAA|-|Wills, Gary +AAAAAAAAGKIBBAAA|-|Brooks, Jeff +AAAAAAAAGKIBBAAA|-|Brooks, Jeff +AAAAAAAAGMKDBAAA|-|Williams, +AAAAAAAAIAHPAAAA|-|Thompson, Stuart +AAAAAAAAICGFAAAA|-|Cottrell, Adam +AAAAAAAAIEDFAAAA|-|Elkins, Brenda +AAAAAAAAIMJFAAAA|-|Wolford, Gertrude +AAAAAAAAJJLGBAAA|-|Murray, Heather +AAAAAAAAJOADAAAA|-|Harden, Mitchell +AAAAAAAAKFFHBAAA|-|Rodriguez, Ernest +AAAAAAAAKIGFAAAA|-|Gonzales, Brian +AAAAAAAALLHEAAAA|-|Williams, James +AAAAAAAANAOCBAAA|-|Durkin, Jack +AAAAAAAANJIJAAAA|-|Reeves, Pauline +AAAAAAAAOILHBAAA|-|Atwood, Thomas +AAAAAAAAOJHPAAAA|-|Bollinger, Jerry +AAAAAAAAPLDFBAAA|-|Wallace, Kenneth +AAAAAAAAPLDFBAAA|-|Wallace, Kenneth diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q85.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q85.out new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q86.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q86.out new file mode 100644 index 0000000000000..039302d2a89e2 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q86.out @@ -0,0 +1,100 @@ +329332948.59|-|null|-|null|-|2|-|1 +35765359.17|-|Books|-|null|-|1|-|1 +34301963.73|-|Men|-|null|-|1|-|2 +34299263.29|-|Home|-|null|-|1|-|3 +34185638.04|-|Children|-|null|-|1|-|4 +33632557.65|-|Electronics|-|null|-|1|-|5 +32679955.12|-|Music|-|null|-|1|-|6 +31276464.49|-|Women|-|null|-|1|-|7 +30973438.42|-|Shoes|-|null|-|1|-|8 +30893463.64|-|Jewelry|-|null|-|1|-|9 +30492050.58|-|Sports|-|null|-|1|-|10 +832794.46|-|null|-|null|-|1|-|11 +487784.65|-|null|-|null|-|0|-|1 +91077.43|-|null|-|dresses|-|0|-|2 +48174.49|-|null|-|athletic|-|0|-|3 +45303.17|-|null|-|accessories|-|0|-|4 +38544.63|-|null|-|country|-|0|-|5 +36691.45|-|null|-|infants|-|0|-|6 +33102.66|-|null|-|shirts|-|0|-|7 +31974.19|-|null|-|baseball|-|0|-|8 +20141.79|-|null|-|mens|-|0|-|9 +2788922.44|-|Books|-|history|-|0|-|1 +2627303.83|-|Books|-|fiction|-|0|-|2 +2559899.95|-|Books|-|business|-|0|-|3 +2523972.68|-|Books|-|sports|-|0|-|4 +2478882.85|-|Books|-|parenting|-|0|-|5 +2454802.70|-|Books|-|home repair|-|0|-|6 +2311733.05|-|Books|-|science|-|0|-|7 +2267995.48|-|Books|-|reference|-|0|-|8 +2199284.41|-|Books|-|travel|-|0|-|9 +2143489.54|-|Books|-|self-help|-|0|-|10 +2136284.47|-|Books|-|romance|-|0|-|11 +2047067.66|-|Books|-|computers|-|0|-|12 +2024086.51|-|Books|-|mystery|-|0|-|13 +1841858.53|-|Books|-|cooking|-|0|-|14 +1718405.56|-|Books|-|arts|-|0|-|15 +1641369.51|-|Books|-|entertainments|-|0|-|16 +9726340.87|-|Children|-|school-uniforms|-|0|-|1 +8423026.60|-|Children|-|infants|-|0|-|2 +8110705.74|-|Children|-|toddlers|-|0|-|3 +7857828.46|-|Children|-|newborn|-|0|-|4 +67736.37|-|Children|-|null|-|0|-|5 +2545288.50|-|Electronics|-|televisions|-|0|-|1 +2432288.94|-|Electronics|-|memory|-|0|-|2 +2393855.24|-|Electronics|-|stereo|-|0|-|3 +2322478.19|-|Electronics|-|karoke|-|0|-|4 +2312404.32|-|Electronics|-|audio|-|0|-|5 +2297793.09|-|Electronics|-|automotive|-|0|-|6 +2175340.77|-|Electronics|-|camcorders|-|0|-|7 +2155848.29|-|Electronics|-|dvd/vcr players|-|0|-|8 +2151409.30|-|Electronics|-|portable|-|0|-|9 +2126590.68|-|Electronics|-|monitors|-|0|-|10 +2049010.73|-|Electronics|-|personal|-|0|-|11 +1975162.86|-|Electronics|-|disk drives|-|0|-|12 +1824298.91|-|Electronics|-|wireless|-|0|-|13 +1747334.28|-|Electronics|-|musical|-|0|-|14 +1647065.60|-|Electronics|-|scanners|-|0|-|15 +1476387.95|-|Electronics|-|cameras|-|0|-|16 +2878895.80|-|Home|-|rugs|-|0|-|1 +2433373.20|-|Home|-|wallpaper|-|0|-|2 +2394255.96|-|Home|-|bedding|-|0|-|3 +2360342.61|-|Home|-|mattresses|-|0|-|4 +2349809.40|-|Home|-|paint|-|0|-|5 +2342593.19|-|Home|-|tables|-|0|-|6 +2255327.66|-|Home|-|accent|-|0|-|7 +2238644.85|-|Home|-|lighting|-|0|-|8 +2195356.00|-|Home|-|glassware|-|0|-|9 +2001058.99|-|Home|-|curtains/drapes|-|0|-|10 +1995854.06|-|Home|-|bathroom|-|0|-|11 +1932033.64|-|Home|-|decor|-|0|-|12 +1789688.36|-|Home|-|flatware|-|0|-|13 +1767061.55|-|Home|-|blinds/shades|-|0|-|14 +1730423.41|-|Home|-|kids|-|0|-|15 +1585801.82|-|Home|-|furniture|-|0|-|16 +48742.79|-|Home|-|null|-|0|-|17 +2309049.65|-|Jewelry|-|loose stones|-|0|-|1 +2291438.75|-|Jewelry|-|bracelets|-|0|-|2 +2204443.86|-|Jewelry|-|custom|-|0|-|3 +1975110.14|-|Jewelry|-|mens watch|-|0|-|4 +1964522.90|-|Jewelry|-|diamonds|-|0|-|5 +1950628.31|-|Jewelry|-|estate|-|0|-|6 +1950233.65|-|Jewelry|-|womens watch|-|0|-|7 +1948966.11|-|Jewelry|-|birdal|-|0|-|8 +1934844.79|-|Jewelry|-|rings|-|0|-|9 +1920939.20|-|Jewelry|-|gold|-|0|-|10 +1912539.77|-|Jewelry|-|semi-precious|-|0|-|11 +1816107.81|-|Jewelry|-|consignment|-|0|-|12 +1793972.84|-|Jewelry|-|earings|-|0|-|13 +1783332.27|-|Jewelry|-|pendants|-|0|-|14 +1720324.59|-|Jewelry|-|costume|-|0|-|15 +1417009.00|-|Jewelry|-|jewelry boxes|-|0|-|16 +8970878.34|-|Men|-|sports-apparel|-|0|-|1 +8843683.02|-|Men|-|pants|-|0|-|2 +8340416.89|-|Men|-|accessories|-|0|-|3 +8054511.00|-|Men|-|shirts|-|0|-|4 +92474.48|-|Men|-|null|-|0|-|5 +8987804.92|-|Music|-|rock|-|0|-|1 +8141376.53|-|Music|-|country|-|0|-|2 +7793743.27|-|Music|-|classical|-|0|-|3 +7727726.97|-|Music|-|pop|-|0|-|4 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q87.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q87.out new file mode 100644 index 0000000000000..4fe81ec1c7e78 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q87.out @@ -0,0 +1 @@ +46606 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q88.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q88.out new file mode 100644 index 0000000000000..be4f4223d9d45 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q88.out @@ -0,0 +1 @@ +2043|-|4734|-|4444|-|6726|-|6357|-|3596|-|3741|-|4719 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q89.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q89.out new file mode 100644 index 0000000000000..681e1811c2940 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q89.out @@ -0,0 +1,100 @@ +Men|-|pants|-|exportiimporto #2|-|ation|-|Unknown|-|2|-|2014.24|-|5058.423333 +Men|-|pants|-|exportiimporto #2|-|bar|-|Unknown|-|2|-|2303.51|-|5284.808333 +Men|-|pants|-|exportiimporto #2|-|ese|-|Unknown|-|7|-|2189.31|-|4977.830833 +Men|-|pants|-|exportiimporto #2|-|bar|-|Unknown|-|5|-|2525.69|-|5284.808333 +Men|-|pants|-|exportiimporto #2|-|eing|-|Unknown|-|2|-|2262.18|-|4985.788333 +Men|-|pants|-|exportiimporto #2|-|ese|-|Unknown|-|2|-|2325.63|-|4977.830833 +Men|-|pants|-|exportiimporto #2|-|able|-|Unknown|-|2|-|2578.33|-|5175.055000 +Men|-|pants|-|exportiimporto #2|-|able|-|Unknown|-|5|-|2679.09|-|5175.055000 +Men|-|pants|-|exportiimporto #2|-|ation|-|Unknown|-|6|-|2575.43|-|5058.423333 +Men|-|pants|-|exportiimporto #2|-|ese|-|Unknown|-|4|-|2568.52|-|4977.830833 +Men|-|pants|-|exportiimporto #2|-|ought|-|Unknown|-|6|-|2487.69|-|4885.635833 +Men|-|pants|-|exportiimporto #2|-|able|-|Unknown|-|4|-|2796.89|-|5175.055000 +Men|-|pants|-|exportiimporto #2|-|bar|-|Unknown|-|3|-|2915.99|-|5284.808333 +Men|-|pants|-|exportiimporto #2|-|ought|-|Unknown|-|1|-|2520.07|-|4885.635833 +Shoes|-|womens|-|amalgedu pack #2|-|bar|-|Unknown|-|2|-|1647.77|-|4008.872500 +Shoes|-|womens|-|amalgedu pack #2|-|able|-|Unknown|-|2|-|1895.59|-|4207.778333 +Shoes|-|womens|-|amalgedu pack #2|-|eing|-|Unknown|-|7|-|1527.25|-|3836.786667 +Men|-|pants|-|exportiimporto #2|-|bar|-|Unknown|-|6|-|2982.36|-|5284.808333 +Shoes|-|womens|-|amalgedu pack #2|-|bar|-|Unknown|-|4|-|1741.31|-|4008.872500 +Men|-|pants|-|exportiimporto #2|-|eing|-|Unknown|-|5|-|2718.34|-|4985.788333 +Shoes|-|womens|-|amalgedu pack #2|-|ese|-|Unknown|-|7|-|2081.12|-|4337.474167 +Men|-|pants|-|exportiimporto #2|-|ought|-|Unknown|-|7|-|2654.62|-|4885.635833 +Shoes|-|womens|-|amalgedu pack #2|-|ought|-|Unknown|-|6|-|2042.69|-|4269.021667 +Shoes|-|womens|-|amalgedu pack #2|-|ought|-|Unknown|-|3|-|2050.91|-|4269.021667 +Shoes|-|womens|-|amalgedu pack #2|-|ought|-|Unknown|-|1|-|2057.91|-|4269.021667 +Shoes|-|womens|-|amalgedu pack #2|-|bar|-|Unknown|-|3|-|1801.25|-|4008.872500 +Shoes|-|womens|-|amalgedu pack #2|-|ation|-|Unknown|-|2|-|2204.78|-|4383.693333 +Men|-|pants|-|exportiimporto #2|-|ought|-|Unknown|-|2|-|2775.62|-|4885.635833 +Shoes|-|womens|-|amalgedu pack #2|-|ese|-|Unknown|-|6|-|2243.25|-|4337.474167 +Men|-|pants|-|exportiimporto #2|-|eing|-|Unknown|-|4|-|2919.95|-|4985.788333 +Men|-|pants|-|exportiimporto #2|-|able|-|Unknown|-|3|-|3118.84|-|5175.055000 +Shoes|-|womens|-|amalgedu pack #2|-|able|-|Unknown|-|5|-|2197.69|-|4207.778333 +Men|-|pants|-|exportiimporto #2|-|eing|-|Unknown|-|1|-|2985.13|-|4985.788333 +Men|-|pants|-|exportiimporto #2|-|ese|-|Unknown|-|6|-|2979.03|-|4977.830833 +Shoes|-|womens|-|amalgedu pack #2|-|bar|-|Unknown|-|5|-|2050.13|-|4008.872500 +Men|-|pants|-|exportiimporto #2|-|able|-|Unknown|-|1|-|3218.37|-|5175.055000 +Men|-|pants|-|exportiimporto #2|-|ation|-|Unknown|-|5|-|3109.99|-|5058.423333 +Men|-|pants|-|exportiimporto #2|-|eing|-|Unknown|-|7|-|3050.44|-|4985.788333 +Men|-|pants|-|exportiimporto #2|-|eing|-|Unknown|-|6|-|3051.87|-|4985.788333 +Men|-|pants|-|exportiimporto #2|-|bar|-|Unknown|-|7|-|3354.57|-|5284.808333 +Men|-|pants|-|exportiimporto #2|-|ese|-|Unknown|-|3|-|3051.59|-|4977.830833 +Shoes|-|womens|-|amalgedu pack #2|-|ation|-|Unknown|-|5|-|2477.00|-|4383.693333 +Men|-|pants|-|exportiimporto #2|-|ought|-|Unknown|-|3|-|2982.14|-|4885.635833 +Men|-|pants|-|exportiimporto #2|-|able|-|Unknown|-|6|-|3281.99|-|5175.055000 +Men|-|pants|-|exportiimporto #2|-|ese|-|Unknown|-|5|-|3085.36|-|4977.830833 +Men|-|pants|-|exportiimporto #2|-|ought|-|Unknown|-|4|-|2999.31|-|4885.635833 +Men|-|pants|-|exportiimporto #2|-|bar|-|Unknown|-|4|-|3406.18|-|5284.808333 +Shoes|-|womens|-|amalgedu pack #2|-|eing|-|Unknown|-|1|-|1974.06|-|3836.786667 +Men|-|pants|-|exportiimporto #2|-|ation|-|Unknown|-|3|-|3207.34|-|5058.423333 +Shoes|-|womens|-|amalgedu pack #2|-|ese|-|Unknown|-|2|-|2507.10|-|4337.474167 +Men|-|pants|-|exportiimporto #2|-|bar|-|Unknown|-|1|-|3457.35|-|5284.808333 +Shoes|-|womens|-|amalgedu pack #2|-|ought|-|Unknown|-|7|-|2484.20|-|4269.021667 +Shoes|-|womens|-|amalgedu pack #2|-|bar|-|Unknown|-|6|-|2229.04|-|4008.872500 +Men|-|pants|-|exportiimporto #2|-|able|-|Unknown|-|7|-|3409.94|-|5175.055000 +Shoes|-|womens|-|amalgedu pack #2|-|able|-|Unknown|-|7|-|2471.82|-|4207.778333 +Shoes|-|womens|-|amalgedu pack #2|-|ese|-|Unknown|-|5|-|2609.89|-|4337.474167 +Shoes|-|womens|-|amalgedu pack #2|-|ation|-|Unknown|-|1|-|2656.73|-|4383.693333 +Shoes|-|womens|-|amalgedu pack #2|-|bar|-|Unknown|-|7|-|2283.13|-|4008.872500 +Shoes|-|womens|-|amalgedu pack #2|-|ought|-|Unknown|-|2|-|2551.13|-|4269.021667 +Men|-|pants|-|exportiimporto #1|-|bar|-|Unknown|-|6|-|957.95|-|2606.385000 +Shoes|-|womens|-|amalgedu pack #2|-|eing|-|Unknown|-|4|-|2225.51|-|3836.786667 +Shoes|-|womens|-|amalgedu pack #2|-|eing|-|Unknown|-|6|-|2226.45|-|3836.786667 +Shoes|-|womens|-|amalgedu pack #2|-|ese|-|Unknown|-|1|-|2734.03|-|4337.474167 +Men|-|pants|-|exportiimporto #2|-|ation|-|Unknown|-|7|-|3454.99|-|5058.423333 +Shoes|-|womens|-|amalgedu pack #1|-|eing|-|Unknown|-|4|-|767.86|-|2358.814167 +Men|-|pants|-|exportiimporto #2|-|eing|-|Unknown|-|3|-|3395.22|-|4985.788333 +Men|-|pants|-|exportiimporto #2|-|ation|-|Unknown|-|4|-|3475.66|-|5058.423333 +Men|-|pants|-|exportiimporto #2|-|ation|-|Unknown|-|1|-|3503.21|-|5058.423333 +Shoes|-|womens|-|amalgedu pack #2|-|bar|-|Unknown|-|1|-|2463.38|-|4008.872500 +Shoes|-|womens|-|amalgedu pack #2|-|ation|-|Unknown|-|7|-|2857.92|-|4383.693333 +Men|-|pants|-|exportiimporto #1|-|ought|-|Unknown|-|5|-|1208.69|-|2729.430000 +Shoes|-|womens|-|amalgedu pack #2|-|ought|-|Unknown|-|5|-|2755.80|-|4269.021667 +Men|-|pants|-|exportiimporto #1|-|eing|-|Unknown|-|7|-|1188.88|-|2692.161667 +Men|-|pants|-|exportiimporto #1|-|able|-|Unknown|-|4|-|1292.81|-|2793.392500 +Shoes|-|womens|-|amalgedu pack #2|-|able|-|Unknown|-|4|-|2725.19|-|4207.778333 +Men|-|pants|-|exportiimporto #1|-|ese|-|Unknown|-|3|-|1125.09|-|2606.785000 +Men|-|pants|-|exportiimporto #1|-|able|-|Unknown|-|6|-|1313.81|-|2793.392500 +Men|-|pants|-|exportiimporto #1|-|ese|-|Unknown|-|7|-|1133.12|-|2606.785000 +Shoes|-|womens|-|amalgedu pack #2|-|able|-|Unknown|-|3|-|2770.93|-|4207.778333 +Shoes|-|womens|-|amalgedu pack #1|-|ese|-|Unknown|-|1|-|1149.96|-|2568.608333 +Men|-|pants|-|exportiimporto #1|-|ation|-|Unknown|-|6|-|1402.53|-|2811.492500 +Shoes|-|womens|-|amalgedu pack #2|-|ese|-|Unknown|-|3|-|2929.39|-|4337.474167 +Men|-|pants|-|exportiimporto #1|-|ought|-|Unknown|-|2|-|1321.77|-|2729.430000 +Men|-|pants|-|exportiimporto #1|-|bar|-|Unknown|-|5|-|1206.90|-|2606.385000 +Men|-|pants|-|exportiimporto #1|-|able|-|Unknown|-|7|-|1414.45|-|2793.392500 +Shoes|-|womens|-|amalgedu pack #1|-|ation|-|Unknown|-|5|-|884.93|-|2247.012500 +Men|-|pants|-|exportiimporto #1|-|ation|-|Unknown|-|4|-|1451.85|-|2811.492500 +Men|-|pants|-|exportiimporto #1|-|able|-|Unknown|-|2|-|1444.81|-|2793.392500 +Shoes|-|womens|-|amalgedu pack #1|-|able|-|Unknown|-|7|-|1256.84|-|2577.035000 +Shoes|-|womens|-|amalgedu pack #2|-|ation|-|Unknown|-|4|-|3064.43|-|4383.693333 +Men|-|pants|-|exportiimporto #1|-|ese|-|Unknown|-|4|-|1291.15|-|2606.785000 +Men|-|pants|-|exportiimporto #1|-|ese|-|Unknown|-|6|-|1294.29|-|2606.785000 +Men|-|pants|-|exportiimporto #1|-|bar|-|Unknown|-|3|-|1303.19|-|2606.385000 +Shoes|-|womens|-|amalgedu pack #2|-|able|-|Unknown|-|6|-|2913.74|-|4207.778333 +Shoes|-|womens|-|amalgedu pack #1|-|eing|-|Unknown|-|2|-|1069.63|-|2358.814167 +Shoes|-|womens|-|amalgedu pack #1|-|bar|-|Unknown|-|2|-|1064.91|-|2349.949167 +Shoes|-|womens|-|amalgedu pack #2|-|eing|-|Unknown|-|3|-|2553.50|-|3836.786667 +Men|-|pants|-|exportiimporto #1|-|eing|-|Unknown|-|3|-|1421.50|-|2692.161667 +Men|-|pants|-|exportiimporto #1|-|eing|-|Unknown|-|2|-|1429.96|-|2692.161667 +Shoes|-|womens|-|amalgedu pack #2|-|ought|-|Unknown|-|4|-|3018.83|-|4269.021667 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q9.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q9.out new file mode 100644 index 0000000000000..5e7ef32abc7d7 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q9.out @@ -0,0 +1 @@ +40.076376|-|114.567833|-|191.521435|-|267.014523|-|343.583306 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q90.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q90.out new file mode 100644 index 0000000000000..16f5ab293a3f3 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q90.out @@ -0,0 +1 @@ +1.07547169811320754717 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q91.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q91.out new file mode 100644 index 0000000000000..9bd3d84c27e24 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q91.out @@ -0,0 +1 @@ +AAAAAAAAEAAAAAAA|-|North Midwest|-|Lamont Greene|-|147.29 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q92.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q92.out new file mode 100644 index 0000000000000..72ee81acfef75 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q92.out @@ -0,0 +1 @@ +37837.45 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q93.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q93.out new file mode 100644 index 0000000000000..17b4315881395 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q93.out @@ -0,0 +1,100 @@ +null|-|76367.37 +51268|-|16115.64 +16143|-|15933.44 +44655|-|13972.20 +32764|-|11366.04 +68677|-|11354.40 +93279|-|11198.25 +67338|-|10869.22 +38658|-|10533.07 +7404|-|10389.28 +35662|-|10158.70 +97107|-|9708.60 +33806|-|9682.94 +44763|-|9518.04 +9822|-|9376.28 +69353|-|9328.09 +12980|-|9216.00 +50044|-|9001.47 +50196|-|8962.80 +59917|-|8929.98 +80152|-|8793.12 +35605|-|8784.90 +89501|-|8702.38 +82663|-|8685.12 +82847|-|8593.72 +73940|-|8568.32 +63447|-|8435.10 +60067|-|8419.58 +97575|-|8394.03 +18142|-|8342.10 +55909|-|8286.31 +34664|-|8229.60 +15976|-|8150.28 +51574|-|8095.75 +48671|-|8092.80 +11292|-|8030.81 +29640|-|8026.20 +47422|-|8014.20 +94937|-|7967.31 +19569|-|7943.04 +38742|-|7899.32 +74237|-|7863.42 +89695|-|7848.96 +67006|-|7808.50 +92652|-|7768.88 +22681|-|7671.44 +37145|-|7664.70 +59668|-|7647.12 +84808|-|7601.76 +8066|-|7575.10 +17611|-|7544.32 +91968|-|7530.15 +2705|-|7515.18 +64767|-|7479.36 +69298|-|7463.68 +63242|-|7460.64 +78558|-|7421.70 +15999|-|7343.60 +50737|-|7295.60 +59753|-|7222.13 +8491|-|7217.28 +42789|-|7205.76 +771|-|7202.85 +29304|-|7157.04 +95860|-|7154.94 +25731|-|7148.32 +74728|-|7143.29 +88404|-|7097.04 +87627|-|7059.08 +43087|-|7035.92 +28908|-|7031.20 +10365|-|6890.46 +27704|-|6838.72 +72469|-|6804.85 +50385|-|6792.52 +43255|-|6750.23 +32636|-|6732.18 +75627|-|6646.64 +91177|-|6606.67 +94015|-|6561.39 +51399|-|6558.26 +29341|-|6556.89 +87335|-|6536.40 +74721|-|6526.98 +76135|-|6503.50 +13695|-|6478.38 +43290|-|6475.64 +74070|-|6470.88 +40993|-|6459.06 +18184|-|6416.98 +22911|-|6415.03 +25484|-|6392.88 +85751|-|6389.11 +51675|-|6383.00 +32386|-|6379.20 +62879|-|6368.40 +52149|-|6366.08 +30617|-|6354.38 +97120|-|6348.11 +39108|-|6318.20 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q94.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q94.out new file mode 100644 index 0000000000000..7d588d99c7cbb --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q94.out @@ -0,0 +1 @@ +37|-|64053.26|-|-32402.78 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q95.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q95.out new file mode 100644 index 0000000000000..6c0afcb106016 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q95.out @@ -0,0 +1 @@ +118|-|266135.96|-|15097.57 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q96.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q96.out new file mode 100644 index 0000000000000..3df31cd1c8286 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q96.out @@ -0,0 +1 @@ +881 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q97.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q97.out new file mode 100644 index 0000000000000..3323d2f9f54c8 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q97.out @@ -0,0 +1 @@ +531850|-|285190|-|181 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q98.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q98.out new file mode 100644 index 0000000000000..2915191374b50 --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q98.out @@ -0,0 +1,2494 @@ +AAAAAAAAABHCAAAA|-|Level children shall exist finally other, patient costs. Adequate values come very children. Reforms ought to profit too as black troops. Nev|-|Books|-|arts|-|6.23|-|17687.02|-|6.77170797619540783 +AAAAAAAAADDBAAAA|-|Resulting, great occasions ought to expe|-|Books|-|arts|-|5.06|-|6427.70|-|2.46092939107838533 +AAAAAAAAAFPCAAAA|-|Ordinary managers will remember. Bad, central words coul|-|Books|-|arts|-|6.93|-|12931.88|-|4.95114015493858607 +AAAAAAAAALAAAAAA|-|Large affairs assume. Contents sign only; heavy areas disturb local areas; drivers turn profits. Home early children obtain prime, old instruments. Advantages shall not announce gently |-|Books|-|arts|-|7.09|-|null|-|null +AAAAAAAAAMJBAAAA|-|Expected, high classes expect; thus wooden values exclude probably below norma|-|Books|-|arts|-|1.15|-|257.70|-|0.09866383062073524 +AAAAAAAAANDDAAAA|-|Good, strong ways say further above shallow needs. Artists say especially various, distinct patients; adequate th|-|Books|-|arts|-|4.31|-|8201.11|-|3.13990270835086527 +AAAAAAAAAODCAAAA|-|Political weeks see rel|-|Books|-|arts|-|2.07|-|5319.29|-|2.03656006046787254 +AAAAAAAAAPEEAAAA|-|Complete meals must argue too employers. Hours will feel here patients. Literally diffe|-|Books|-|arts|-|32.27|-|6846.67|-|2.62133755993818139 +AAAAAAAABGDAAAAA|-|Newly national rights head curiously all electrical cells. Chinese, long values might not pull bad lines. High fun clothes ough|-|Books|-|arts|-|3.28|-|6164.08|-|2.35999901068165183 +AAAAAAAABKLDAAAA|-|Forward psychological plants establish closely yet eastern changes. Likewise necessary techniques might drop. Pleasant operations like lonely things; dogs let regions. Forces might not result clearl|-|Books|-|arts|-|2.43|-|998.30|-|0.38221227050322076 +AAAAAAAACBDEAAAA|-|Banks might learn so. Governments fight subject, technical nations. Only original scholars would work merely experts. Hands lodge socially special, large armies. Small, full days arise to a y|-|Books|-|arts|-|8.93|-|1177.60|-|0.45085963111749250 +AAAAAAAACCPDAAAA|-|Here african objectives will not know good times. Leaders must sell yet in the developments. |-|Books|-|arts|-|1.14|-|10429.56|-|3.99309406786494151 +AAAAAAAACGIAAAAA|-|Artists ought to take still mysterious, sexual horses. Copies should not|-|Books|-|arts|-|3.81|-|6097.58|-|2.33453861201545511 +AAAAAAAACKOAAAAA|-|Only small owners think however formal waters. Fond loans would provide. Act|-|Books|-|arts|-|2.64|-|1506.70|-|0.57685988977982843 +AAAAAAAACMPCAAAA|-|Even new adults shall resume in a hands. New boys grasp. Clear, bad firms ought to participate of course upon a opportunities. Sometimes hard options ought to admit actually within|-|Books|-|arts|-|3.13|-|380.64|-|0.14573302478648297 +AAAAAAAADLLDAAAA|-|Black, following services justify by a investors; dirty, different charts will fly however prizes. Temporary, l|-|Books|-|arts|-|5.56|-|11460.09|-|4.38764601730066633 +AAAAAAAAEAMAAAAA|-|Classes used to pay frantically well civil reports. Major, certain coins start as a hours; so pink things will not say directly after a orders. Normal yards will take there vast pages. Extra pupil|-|Books|-|arts|-|7.70|-|1627.41|-|0.62307529914819843 +AAAAAAAAEIPCAAAA|-|Public, geographical methods may choke responsi|-|Books|-|arts|-|4.91|-|3856.11|-|1.47636237444673405 +AAAAAAAAELBDAAAA|-|Metres sell low men. At least other|-|Books|-|arts|-|9.73|-|10992.00|-|4.20843161111029008 +AAAAAAAAENCEAAAA|-|Sufficient men help in a problems. Closely internal weeks |-|Books|-|arts|-|3.41|-|8143.12|-|3.11770047498766606 +AAAAAAAAFCIBAAAA|-|United, important objectives put similarly large, previous phenomena; old, present days receive. Happy detectives assi|-|Books|-|arts|-|1.26|-|18492.35|-|7.08003914699011761 +AAAAAAAAFFIBAAAA|-|Naturally new years put serious, negative vehicles. Fin|-|Books|-|arts|-|3.34|-|771.19|-|0.29526022326893601 +AAAAAAAAFLNCAAAA|-|Much new waters |-|Books|-|arts|-|1.85|-|1509.93|-|0.57809653771504370 +AAAAAAAAGEJAAAAA|-|Hands might not make; good, different advertisements bear top, far facilities. Women could persuade yet. Copies lie long markets. Particular places could not ask. Numerous, old count|-|Books|-|arts|-|9.99|-|932.39|-|0.35697776108834820 +AAAAAAAAGODDAAAA|-|Details|-|Books|-|arts|-|3.74|-|4135.24|-|1.58323096211132787 +AAAAAAAAHHEBAAAA|-|Powerful walls will find; there scottish decades must not|-|Books|-|arts|-|4.16|-|3201.15|-|1.22560233368865585 +AAAAAAAAHMCEAAAA|-|Too executive doors progress mainly seemingly possible parts; hundreds stay virtually simple workers. Sola|-|Books|-|arts|-|34.32|-|699.87|-|0.26795442427836233 +AAAAAAAAIBPCAAAA|-|Able issues bother however political services. French teachers will act voices. Pregnant, existing cases make by th|-|Books|-|arts|-|84.47|-|5988.77|-|2.29287927398735189 +AAAAAAAAIHMCAAAA|-|Scarcely crucial groups may bring especially effective, important losses. Now new drugs wan|-|Books|-|arts|-|8.52|-|9185.57|-|3.51681615302641442 +AAAAAAAAIJADAAAA|-|Strong, natural agencies can repeat proposed, main p|-|Books|-|arts|-|2.43|-|5515.35|-|2.11162420727230153 +AAAAAAAAIMPCAAAA|-|Large manag|-|Books|-|arts|-|0.76|-|17621.28|-|6.74653855351396765 +AAAAAAAAINLAAAAA|-|Children come. Bad kinds love then also old owners. Never long effects come other, responsible words. Very particular iss|-|Books|-|arts|-|8.27|-|14015.01|-|5.36583070542456574 +AAAAAAAAJGHDAAAA|-|Circumstances would not use. Principles seem writers. Times go from a hands. Members find grounds. Central, only teachers pursue properly into a p|-|Books|-|arts|-|5.95|-|1505.31|-|0.57632771001823424 +AAAAAAAAJLHBAAAA|-|Inches may lose from a problems. Firm, other corporations shall protect ashamed, important practices. Materials shall not make then by a police. Weeks used|-|Books|-|arts|-|0.84|-|4871.44|-|1.86509480418732819 +AAAAAAAAKMAAAAAA|-|Delicate, young activities ask other patients. Initial police may make western, everyday earnings. At present major values would not f|-|Books|-|arts|-|0.43|-|5054.36|-|1.93512812936057185 +AAAAAAAALCFBAAAA|-|More than key reasons should remain. Words used to offer slowly british|-|Books|-|arts|-|0.28|-|9325.23|-|3.57028681885680589 +AAAAAAAALGEEAAAA|-|Children may turn also above, historical aspects. Surveys migh|-|Books|-|arts|-|7.22|-|2610.81|-|0.99958290889763978 +AAAAAAAALOKCAAAA|-|Trustees know operations. Now past issues cut today german governments. British lines go critical, individual structures. Tonight adequate problems should no|-|Books|-|arts|-|4.05|-|971.46|-|0.37193622388366106 +AAAAAAAAMBABAAAA|-|Just late patients shall not go hard very able models. In addition exclusive resources go dirty standards. Continuous, good concepts might know much du|-|Books|-|arts|-|1.18|-|3206.28|-|1.22756642158576245 +AAAAAAAAMKJAAAAA|-|Formal matters must admire much. Capable rules rise however. Harder only studies would show more. Old stones oppose common, secure police. Opinions come grey, appropriate systems. Eye|-|Books|-|arts|-|9.20|-|609.62|-|0.23340102608852393 +AAAAAAAAMMICAAAA|-|Real scales get just features. Controls describe political interests. Devices lie. |-|Books|-|arts|-|0.89|-|null|-|null +AAAAAAAANABCAAAA|-|Likely states feel astonishingly working roads. Parents put so somewhere able policies. Others may rely shortly instead interesting bodies; bri|-|Books|-|arts|-|7.50|-|10818.59|-|4.14203931437788148 +AAAAAAAANMECAAAA|-|Floors could not go only for a years. Special reasons shape consequently black, concerned instances. Mutual depths encourage both simple teachers. Cards favour massive |-|Books|-|arts|-|1.83|-|4972.56|-|1.90380992468546070 +AAAAAAAAOFICAAAA|-|Else emotional lives declare also c|-|Books|-|arts|-|4.47|-|2385.39|-|0.91327790036630048 +AAAAAAAAOKHDAAAA|-|Responsible arts permit. Fresh, elderly figures refer much long certain prayers. Almost romantic assumptions date however european, innocent cou|-|Books|-|arts|-|7.86|-|5090.17|-|1.94883845832653432 +AAAAAAAAOMMDAAAA|-|Concerned, clear trousers may not assist successful things. L|-|Books|-|arts|-|9.40|-|6240.84|-|2.38938758514206175 +AAAAAAAAPEBCAAAA|-|Similar situations come separate programmes. National, large others could not ask opportunities. Severe, large findings accept; twins go more. Tiny rights may see specifi|-|Books|-|arts|-|1.27|-|955.22|-|0.36571852652517934 +AAAAAAAAAADEAAAA|-|Later national activities wake yet expenses. Variable days choose typically light, final feet. So scottish pro|-|Books|-|business|-|0.90|-|35169.62|-|9.33557216062485993 +AAAAAAAAADKBAAAA|-|Primary, past authorities say well at a teeth; stores want much usually important sites; late |-|Books|-|business|-|0.26|-|5873.45|-|1.55907332256709295 +AAAAAAAABBLDAAAA|-|Natural plans might not like n|-|Books|-|business|-|4.29|-|4674.20|-|1.24073934814174052 +AAAAAAAABDMAAAAA|-|Imports involve most now indian women. Developments announce intimately in a copies. Projects |-|Books|-|business|-|3.26|-|6200.70|-|1.64593994181303548 +AAAAAAAABINDAAAA|-|Years shall want free objects. Old residents use absolutely so residential steps. Letters will share variables. Sure fres|-|Books|-|business|-|40.76|-|4007.90|-|1.06387386791692307 +AAAAAAAACEHDAAAA|-|Catholic men understand new conditions; he|-|Books|-|business|-|1.48|-|5764.36|-|1.53011601319034774 +AAAAAAAACMIBAAAA|-|Most good days may continue images. Most human lives must reject thus quietly legitimate pounds. More senior schools concentrate more than prime hours. No doubt normal|-|Books|-|business|-|6.58|-|2359.08|-|0.62620413790899346 +AAAAAAAACMIDAAAA|-|Lightly central chang|-|Books|-|business|-|0.51|-|4583.90|-|1.21676973555836814 +AAAAAAAADEDAAAAA|-|Junior, severe restrictions ought to want principles. Sure,|-|Books|-|business|-|9.77|-|1268.57|-|0.33673456738525689 +AAAAAAAAEDJDAAAA|-|Social, special others approach today up to a positions. Senior fears|-|Books|-|business|-|0.15|-|20569.82|-|5.46013971550060695 +AAAAAAAAEDKDAAAA|-|Minor, single things could cry too profits. Examples focus material, young observations. Existing tensions would stop away. Facilities reply most thoroughly small|-|Books|-|business|-|1.24|-|6249.08|-|1.65878213291805825 +AAAAAAAAEEDDAAAA|-|Open, moving millions cool doubtfully good children. Popular, aware cities work men. Successful races may see away. New, good issu|-|Books|-|business|-|2.38|-|5909.47|-|1.56863462317897637 +AAAAAAAAELBAAAAA|-|Immense panels take just. Small workers ignore home. Professionals must not show prime, difficult complaints; finally royal documents must ef|-|Books|-|business|-|1.72|-|4117.39|-|1.09293735497953040 +AAAAAAAAEMMBAAAA|-|Polls may not change in order logical shoulders. Left times leave|-|Books|-|business|-|3.01|-|1733.62|-|0.46017939941069792 +AAAAAAAAFCGDAAAA|-|Small, capable centres|-|Books|-|business|-|2.98|-|10002.84|-|2.65519600812248679 +AAAAAAAAFDLAAAAA|-|Popular, different parameters might take open, used modules. Prisoners use pretty alternative lovers. Annual, professional others spend once true men. Other, small subsidies seem politically|-|Books|-|business|-|7.25|-|9288.34|-|2.46553611675128453 +AAAAAAAAFEGEAAAA|-|Supreme, free uses handle even in the customers. Other minutes might not make of course social neighbours. So environmental rights come other, able sales|-|Books|-|business|-|8.08|-|3348.41|-|0.88881606279390813 +AAAAAAAAFHFCAAAA|-|Sound, original activities consider quite to a attitudes. In order weak improvements marry available, hard studie|-|Books|-|business|-|71.27|-|5888.00|-|1.56293553589032737 +AAAAAAAAGANDAAAA|-|Simple functions contain then wide |-|Books|-|business|-|9.71|-|8626.65|-|2.28989433435602796 +AAAAAAAAGCJCAAAA|-|Careful universities may find cultural methods; artificial, apparent sections ought to tell highly reforms. Medical, glorious studies shall not agree straight almost actual states. Enough n|-|Books|-|business|-|5.70|-|12808.71|-|3.39999796669731574 +AAAAAAAAGDBDAAAA|-|Safe, strong houses could find. Customers will exploit useful, old views. National, internal paintings must use normally p|-|Books|-|business|-|5.16|-|9071.28|-|2.40791879551820803 +AAAAAAAAGGHBAAAA|-|Big calculations may find quickly. Separate, unemployed languages choose never. Really red regulations could not remem|-|Books|-|business|-|6.23|-|4511.70|-|1.19760466326025645 +AAAAAAAAGIKBAAAA|-|Shows say though new months. D|-|Books|-|business|-|3.66|-|1378.00|-|0.36578212779498490 +AAAAAAAAGJODAAAA|-|Therefore gay reserves increase political po|-|Books|-|business|-|2.86|-|571.38|-|0.15166951536973764 +AAAAAAAAGMDBAAAA|-|Settlements relocate colleagues. Well |-|Books|-|business|-|8.18|-|2121.46|-|0.56312928362260426 +AAAAAAAAGPBAAAAA|-|Members aid ago. Blind trends used to get actions. Important notes might suffer rarely moral others. Members make. Just full rivals say elsewhere. Small factors may abandon; im|-|Books|-|business|-|1.46|-|10041.27|-|2.66539702929168945 +AAAAAAAAGPKBAAAA|-|More than silly doors cannot attain about british afraid flights. Quietly busy prices ought to explain now local details.|-|Books|-|business|-|0.20|-|11170.47|-|2.96513663648043906 +AAAAAAAAHDKCAAAA|-|Visual fragments |-|Books|-|business|-|6.77|-|197.04|-|0.05230312805567767 +AAAAAAAAHDLBAAAA|-|Classic issues will draw as european, engl|-|Books|-|business|-|75.64|-|3960.32|-|1.05124403218362454 +AAAAAAAAHJAAAAAA|-|Again british shareholders see shares. American lives ought to establish horses. Then ideal conservatives might charge even nec|-|Books|-|business|-|2.44|-|1990.55|-|0.52837998148208070 +AAAAAAAAHKACAAAA|-|Critical cases tell anywhere to the circumstances. Dependent, new numbers must not|-|Books|-|business|-|3.72|-|11703.99|-|3.10675643388332755 +AAAAAAAAHLKAAAAA|-|Confident, video-tape|-|Books|-|business|-|3.17|-|1819.76|-|0.48304476406110430 +AAAAAAAAIAAAAAAA|-|International countries might not steal more. Differences will give devices. New, naval eyes c|-|Books|-|business|-|4.22|-|2369.10|-|0.62886388893983943 +AAAAAAAAIAIBAAAA|-|Conventional emissions push now. Unable, familiar pupil|-|Books|-|business|-|4.79|-|5258.75|-|1.39590476381848829 +AAAAAAAAIFHAAAAA|-|English investors will want naturally strong kinds. Main, other winners go big, growing combina|-|Books|-|business|-|7.42|-|9047.88|-|2.40170740089527432 +AAAAAAAAIJIAAAAA|-|Firm managers will not walk at a g|-|Books|-|business|-|6.93|-|null|-|null +AAAAAAAAIONCAAAA|-|Dead contributions could chart therefore on a matters; open, inc children can diminish by a things. Unknown, inc cars consider to a investments.|-|Books|-|business|-|2.85|-|13796.55|-|3.66221437970239403 +AAAAAAAAJFBEAAAA|-|Paintings must not know primary, royal stands; similar, available others ough|-|Books|-|business|-|0.39|-|3300.56|-|0.87611455712265267 +AAAAAAAAJJGBAAAA|-|Most present eyes restore fat, central relationships; again considerable habits must face in a discussions. Engineers help at all direct occasions. Curiously del|-|Books|-|business|-|80.10|-|477.05|-|0.12663016260130446 +AAAAAAAAKCMBAAAA|-|Tra|-|Books|-|business|-|1.64|-|5997.85|-|1.59209458287021060 +AAAAAAAAKFFAAAAA|-|Ways tell actually more limited models. Girls think|-|Books|-|business|-|4.98|-|1158.64|-|0.30755428486820124 +AAAAAAAAKIMCAAAA|-|However dangerous jobs deserve much continuing, magnetic cards. Today key drugs happe|-|Books|-|business|-|82.91|-|7365.42|-|1.95510812750634087 +AAAAAAAAKIPCAAAA|-|Young countries should restore increasingly others. Combined, large activities match in a cases. Positions can |-|Books|-|business|-|1.02|-|6822.95|-|1.81111260438228756 +AAAAAAAAKKLBAAAA|-|Great, valid factors should not say able centres. Lazily cu|-|Books|-|business|-|5.02|-|1409.13|-|0.37404540619720398 +AAAAAAAAKNCBAAAA|-|Slowly alternative items would portray perfectly boys; for example hard items treat hence appropriate wea|-|Books|-|business|-|1.88|-|1637.43|-|0.43464632040300590 +AAAAAAAAKPEDAAAA|-|Prime, inc ambitions win with the hands. Again exciting|-|Books|-|business|-|72.04|-|2567.14|-|0.68143246121017239 +AAAAAAAALAJCAAAA|-|Asleep children invite more. Wealthy forms could expect as. Indeed statistical examinations could la|-|Books|-|business|-|3.71|-|9241.40|-|2.45307616531536538 +AAAAAAAALDHBAAAA|-|Most new weeks go yet members. Also encouraging delegates make publications. Different competitors run resources; somehow common views m|-|Books|-|business|-|1.07|-|2190.88|-|0.58155642100397426 +AAAAAAAALHMBAAAA|-|Local, bloody names |-|Books|-|business|-|4.40|-|527.82|-|0.14010676537935336 +AAAAAAAALJJCAAAA|-|Large, larg|-|Books|-|business|-|3.50|-|14647.67|-|3.88813925967980155 +AAAAAAAALOMDAAAA|-|Only new systems might join late speeches. Materials could stay on a benefits. Corporate regulations must crawl definitely practical deaths. Windows might soothe despite a organisations. Old|-|Books|-|business|-|0.67|-|1818.38|-|0.48267845104488001 +AAAAAAAAMENAAAAA|-|Powerful members should make especially. Alternative, significant names travel. Academic, sexual claims think unconsciously negotiation|-|Books|-|business|-|2.01|-|4212.36|-|1.11814659204534297 +AAAAAAAAMFDCAAAA|-|Here genuine details shall not come. Great publications look reactions. Rural, other men could travel still. So wide things might ride on a books. Diverse, di|-|Books|-|business|-|1.42|-|3838.08|-|1.01879613138416231 +AAAAAAAAMGABAAAA|-|Huge, ancient problems survive much outstanding, important lawyers. Complete styles would say unlikely, natural children. Western relations get precious prisoners. Large, able techniq|-|Books|-|business|-|29.84|-|1542.32|-|0.40939992114714159 +AAAAAAAAMKKDAAAA|-|Long years sl|-|Books|-|business|-|9.91|-|4695.84|-|1.24648356094688092 +AAAAAAAAMLLBAAAA|-|Hands could not arise also to an years. Widely human years should know grey practices. Simultaneously american frames might maintain really ill complete lives. Ita|-|Books|-|business|-|19.23|-|2485.29|-|0.65970585224063718 +AAAAAAAAMMNAAAAA|-|Shops see enough then light views; near chief insects may thank so ever orange products. Advantages settle surely. Still female re|-|Books|-|business|-|4.64|-|5461.60|-|1.44975012276131317 +AAAAAAAANJLBAAAA|-|Only, gothic|-|Books|-|business|-|1.68|-|2803.81|-|0.74425514349263906 +AAAAAAAANKCAAAAA|-|Low, large clouds will not visit for example as the notions. Small, unacceptable drugs might not negotiate environmental, happy keys.|-|Books|-|business|-|3.11|-|7657.32|-|2.03259129376421902 +AAAAAAAAODCAAAAA|-|Things shall make really high, financial poles. Physical, formal metres forget probably comfortab|-|Books|-|business|-|0.42|-|4241.92|-|1.12599312303055324 +AAAAAAAAOEFDAAAA|-|Then presidential |-|Books|-|business|-|52.62|-|null|-|null +AAAAAAAAOGBEAAAA|-|Efforts will look far available rivers. For example standard police used to perform so profound excessive seats. Wet, substantial minutes live special, available fans. Reliable, electoral m|-|Books|-|business|-|51.50|-|9164.56|-|2.43267943186125316 +AAAAAAAAOGNBAAAA|-|Arguably other beans suggest then useful events. Gener|-|Books|-|business|-|9.91|-|2468.72|-|0.65530744160379908 +AAAAAAAAOHDEAAAA|-|Creatures ought to tell |-|Books|-|business|-|0.47|-|1235.28|-|0.32789792947938240 +AAAAAAAAOICCAAAA|-|Practices would not alter secret, international subjects; democratic, old hours |-|Books|-|business|-|8.09|-|14758.81|-|3.91764072969659010 +AAAAAAAAOJADAAAA|-|Working, economic organizations can ensure rather friends. New women should not close thus traditional gaps. Old effects cannot hear already firms. Essential, s|-|Books|-|business|-|30.03|-|5468.45|-|1.45156841563170189 +AAAAAAAAOKDBAAAA|-|Easily expensive developments will ensure still potential sorry solicitors. Different, post-war folk must not strengthen |-|Books|-|business|-|4.65|-|76.70|-|0.02035957126406048 +AAAAAAAAAEMAAAAA|-|Later other operations see; expected, honest animals show respons|-|Books|-|computers|-|6.51|-|154.28|-|0.05255836207867164 +AAAAAAAAAMGBAAAA|-|Very social engineers ask facilities. Numerous, stupid |-|Books|-|computers|-|1.93|-|9325.01|-|3.17673873455557302 +AAAAAAAAAPKBAAAA|-|Previous, due children might follow somewhat in the women. All french dogs see governments. Open firms will arrive costs; little, odd roads must drink outside years. Families ought|-|Books|-|computers|-|6.64|-|4276.08|-|1.45672647729690313 +AAAAAAAABEBEAAAA|-|Cheap, desirable members take immediate, estimated debts; months must track typica|-|Books|-|computers|-|3.26|-|2643.52|-|0.90056443688235706 +AAAAAAAABHOAAAAA|-|Expert, scottish terms will ask quiet demands; poor bits attempt northern, dangerous si|-|Books|-|computers|-|2.66|-|5372.55|-|1.83025945155410491 +AAAAAAAACAMDAAAA|-|Wooden eyes will visit possible, theoretical reasons. Circumstances die very throughout the feelings. Friends might not est|-|Books|-|computers|-|6.32|-|14639.56|-|4.98723940337333522 +AAAAAAAACKEAAAAA|-|Previous feet would not find pubs. Unexpectedly dead|-|Books|-|computers|-|2.63|-|11548.80|-|3.93431431147370370 +AAAAAAAACNIAAAAA|-|Great weapons must represent incidentally. Natural, different students would go standards. Also simple options control. Times shall say even neat, local costs. Necessary, english solutions |-|Books|-|computers|-|0.73|-|1981.04|-|0.67487825779317903 +AAAAAAAADAHAAAAA|-|Ga|-|Books|-|computers|-|5.53|-|38.08|-|0.01297266287241260 +AAAAAAAADDBAAAAA|-|S|-|Books|-|computers|-|65.78|-|4702.48|-|1.60198759727580893 +AAAAAAAAEEIDAAAA|-|Papers may die details. Men force also old, major stones. Wrong, central arms used to get as concre|-|Books|-|computers|-|0.53|-|4734.05|-|1.61274250712040099 +AAAAAAAAEKJAAAAA|-|Scientific hands should not stem. Psychological matters must add rather top groups. Deaths would identify conve|-|Books|-|computers|-|4.55|-|71.36|-|0.02431011613905891 +AAAAAAAAFDPCAAAA|-|Limited, capable cities shall try during the bodies. Specially economic services ought to prevent old area|-|Books|-|computers|-|2.93|-|null|-|null +AAAAAAAAFGLAAAAA|-|Since other birds shall blame sudden|-|Books|-|computers|-|6.74|-|2886.21|-|0.98324131588723663 +AAAAAAAAFHNAAAAA|-|Legs throw then. Old-fashioned develo|-|Books|-|computers|-|2.66|-|1303.54|-|0.44407523531262397 +AAAAAAAAFJBEAAAA|-|Only careful men define judicial, special lawyers. Now able funds will not put too black, economic terms. Objectives know both points. Teeth pay.|-|Books|-|computers|-|9.85|-|2846.96|-|0.96987007067341849 +AAAAAAAAFOCEAAAA|-|Important, educational variables used to appear months. A|-|Books|-|computers|-|2.47|-|241.04|-|0.08211477570289740 +AAAAAAAAGHHDAAAA|-|Foods empl|-|Books|-|computers|-|8.99|-|2291.29|-|0.78057071199921919 +AAAAAAAAGMPCAAAA|-|Available, good memories must not draw extremely. English, additional fa|-|Books|-|computers|-|0.40|-|6083.52|-|2.07246465434820119 +AAAAAAAAHGCEAAAA|-|Present |-|Books|-|computers|-|2.84|-|5881.78|-|2.00373815729251532 +AAAAAAAAHHFDAAAA|-|Multiple, dark feet mean more complex girls; schools may not answer frequently blue assets. Spiritual, dry patients may reply personnel|-|Books|-|computers|-|2.04|-|1936.00|-|0.65953454099240530 +AAAAAAAAIBDBAAAA|-|Valid resources ought to say still tears. M|-|Books|-|computers|-|3.81|-|135.81|-|0.04626621178315008 +AAAAAAAAICGEAAAA|-|Possible incentives can call other, british police. Modern|-|Books|-|computers|-|5.57|-|4704.86|-|1.60279838870533472 +AAAAAAAAIEAEAAAA|-|As great nurses support perhaps. Able, short students could analyse often. Vehicles give. Just |-|Books|-|computers|-|17.39|-|8044.21|-|2.74041030475026687 +AAAAAAAAIEJBAAAA|-|Keys must not read political, italian farmers. Red, single years should play however at the dates. Authors disturb no longer for a purposes. Ever essential agencies will answer as fundame|-|Books|-|computers|-|2.40|-|13856.75|-|4.72056056347960340 +AAAAAAAAIHABAAAA|-|Small, particular rates talk important, political children; nevertheless economic subjects ought to roll now k|-|Books|-|computers|-|4.08|-|2187.19|-|0.74510710367416268 +AAAAAAAAIHDBAAAA|-|Local blocks shall not get natural things; already post-war patients may exploit british, sexual grounds. Easy centuries would not|-|Books|-|computers|-|7.14|-|6715.01|-|2.28759351142015059 +AAAAAAAAIHEBAAAA|-|Only, civil persons avoid early to a terms. Then u|-|Books|-|computers|-|7.97|-|695.42|-|0.23690780500874922 +AAAAAAAAIKEDAAAA|-|Primary, total origins help with the levels. Human, possible structures alter tomorrow to a wages. Proud interests see seriously further proper insects. Others fin|-|Books|-|computers|-|1.89|-|2276.12|-|0.77540276830766196 +AAAAAAAAIKNAAAAA|-|Religious fingers go yet. Too precious results build so late letters. Short-term centuries could not ensure sufficient, full wars. Jobs would end in particular great trees. Horses|-|Books|-|computers|-|4.68|-|3278.94|-|1.11703212181902761 +AAAAAAAAJDOCAAAA|-|Indeed other actions should provide after a ideas; exhibitio|-|Books|-|computers|-|6.95|-|10678.63|-|3.63787465675502533 +AAAAAAAAJJFCAAAA|-|Effective females must answer too english projects. Firm, political experiments see in terms of |-|Books|-|computers|-|0.76|-|6410.92|-|2.18399957620817717 +AAAAAAAAJPBDAAAA|-|Of course responsible fears tell. Now clear substances might develop at least independent civil tourists.|-|Books|-|computers|-|4.95|-|9987.57|-|3.40245216713818049 +AAAAAAAAKFBDAAAA|-|Women used to seek ready organisation|-|Books|-|computers|-|1.89|-|681.65|-|0.23221679745220717 +AAAAAAAAKGCBAAAA|-|Goods go only. Accountants may unite. Almost agricultural muscles go just regional police. Real samples used to build auditors; following women can believe. Very concerned tonnes would fit there|-|Books|-|computers|-|3.02|-|9541.07|-|3.25034360693512834 +AAAAAAAALACDAAAA|-|Visible, recent restrictions opera|-|Books|-|computers|-|1.70|-|8419.05|-|2.86810654821389972 +AAAAAAAALBNAAAAA|-|Male levels shall reduce else high, local conditions; further personal agencies control. Successful days wake eve|-|Books|-|computers|-|6.55|-|2875.68|-|0.97965407481458682 +AAAAAAAALEJBAAAA|-|Wide governments conform widely in proportion to a friends. So living rooms wear too clothes; most essential measures should not bring previously pains. Real accounts become also gue|-|Books|-|computers|-|9.35|-|5094.60|-|1.73557059532020044 +AAAAAAAALIHCAAAA|-|Places transform |-|Books|-|computers|-|3.10|-|7497.00|-|2.55399300300623066 +AAAAAAAAMDIAAAAA|-|Objectives consider odds. Individual, small metres must not come british, possible suppliers; also new ways recommend right willing, poor hands. Shares may allocate new cases. Universities feed. |-|Books|-|computers|-|3.46|-|3968.38|-|1.35190272819392632 +AAAAAAAAMEMAAAAA|-|Particularly tight problems cannot lead special, simple sales. Warm bodies get. New, primary attempts wo|-|Books|-|computers|-|8.98|-|4557.70|-|1.55266558754188308 +AAAAAAAAMILAAAAA|-|Easily capable feelings drift issues. Teeth might not return during a observers. Y|-|Books|-|computers|-|3.81|-|1400.34|-|0.47705196236224424 +AAAAAAAAMKIBAAAA|-|Rules fly old f|-|Books|-|computers|-|2.64|-|1736.50|-|0.59157114175274370 +AAAAAAAAMOOBAAAA|-|Private things used to generalise pretty combinations. Symbolic groups manufacture so fu|-|Books|-|computers|-|1.27|-|7138.45|-|2.43184625214216717 +AAAAAAAANANCAAAA|-|Only increased errors must submit as rich, main |-|Books|-|computers|-|6.94|-|22056.06|-|7.51380857861619365 +AAAAAAAANFHDAAAA|-|Meals ought to test. Round days might need most urban years. Political, english pages must see on a eyes. Only subsequent women may come better methods; difficult, social childr|-|Books|-|computers|-|7.23|-|11366.12|-|3.87208095922758149 +AAAAAAAANHFDAAAA|-|Systems cannot see fairly practitioners. Little ca|-|Books|-|computers|-|1.73|-|2175.36|-|0.74107699333328450 +AAAAAAAANKLDAAAA|-|Past beautiful others might not like more than legislative, small products. Close, wh|-|Books|-|computers|-|3.02|-|4567.69|-|1.55606886753388418 +AAAAAAAAOBABAAAA|-|Together industrial persons used to think surely; today local things leave then key hands. Clearly good faces could include yet able, pale occasions. National, medical brothers m|-|Books|-|computers|-|3.44|-|1510.46|-|0.51456639606786597 +AAAAAAAAOHODAAAA|-|Values can take well eyes. Great, general |-|Books|-|computers|-|18.64|-|566.04|-|0.19283209275999024 +AAAAAAAAOIBCAAAA|-|Intense issu|-|Books|-|computers|-|3.44|-|349.05|-|0.11891039851931770 +AAAAAAAAOIJDAAAA|-|Other implications shall cope particularly. Outstanding days could not build important memories. Smooth talks give however national, european pounds. P|-|Books|-|computers|-|1.12|-|10882.46|-|3.70731315132655528 +AAAAAAAAOKPCAAAA|-|Final parents yield then favorable, long elections. Skills can view in a ministers. Affairs used to say then needs. Electric, sen|-|Books|-|computers|-|0.26|-|117.16|-|0.03991274112741230 +AAAAAAAAONFAAAAA|-|Mental techniques might prohibit by a chiefs; other, waiting defendants vary else. Now old skills would see. Common jobs will no|-|Books|-|computers|-|6.98|-|8972.41|-|3.05661896226532400 +AAAAAAAAOPFBAAAA|-|Accessible, old walls profit here. Wars form therefore as effective servants. Secrets could not feel meanwhile regional theories. Perfect, new service|-|Books|-|computers|-|6.04|-|11165.32|-|3.80367469071969152 +AAAAAAAAPAKAAAAA|-|Real, domestic facilities turn often guilty symptoms. Winds get naturally intense islands. Products shall not travel a little clear shares; improved children may not apply wrong c|-|Books|-|computers|-|5.28|-|14973.22|-|5.10090691109416474 +AAAAAAAAAGHDAAAA|-|New police maintain only home right files. Persons may float perhaps services. Tough doctors go for example even financial changes. Namely large issues need clean. Social thousands would prevent. |-|Books|-|cooking|-|1.56|-|2235.10|-|0.89825446623485936 +AAAAAAAAAOGDAAAA|-|Less single audiences score aware, current servants. Long, perfect tears might not draw. Differ|-|Books|-|cooking|-|0.48|-|7592.60|-|3.05135647637009225 +AAAAAAAACAFEAAAA|-|Working, apparent acres seem forever in a pounds. Residential, present options shall cover much modern drugs. Oral, fine f|-|Books|-|cooking|-|60.02|-|343.43|-|0.13801956571922408 +AAAAAAAACDBBAAAA|-|Minor children can go straight hardly available steps. British, general muscles contain at first in a categories; courts say altog|-|Books|-|cooking|-|6.61|-|9694.69|-|3.89615614122966700 +AAAAAAAACJOAAAAA|-|At least great demonstrations must gain sometimes. Characters agree effectively savings. Parents might provide oth|-|Books|-|cooking|-|0.88|-|6599.34|-|2.65217960234546856 +AAAAAAAACPLDAAAA|-|Social, active studies may extend. Royal factors used to confirm into a birds. Subjective, growing days grow truly blue jobs. Added readers report most c|-|Books|-|cooking|-|1.43|-|3503.22|-|1.40789361156247327 +AAAAAAAADDNAAAAA|-|Individual, remarkable services take by the interest|-|Books|-|cooking|-|6.05|-|4669.62|-|1.87665295540227461 +AAAAAAAADIGCAAAA|-|Positions shall|-|Books|-|cooking|-|4.21|-|9103.30|-|3.65848502638619983 +AAAAAAAAEFODAAAA|-|Here australian organisations fit then ce|-|Books|-|cooking|-|1.48|-|801.02|-|0.32191838957695273 +AAAAAAAAEFPBAAAA|-|Letters remove then years. Current facts would join over in a years; initial, labour walls take in a feet. Effective ob|-|Books|-|cooking|-|3.38|-|14389.62|-|5.78298082073395239 +AAAAAAAAEIHDAAAA|-|Problems may not start over a participants. American, social days remove useful, global proposals. Patients vi|-|Books|-|cooking|-|1.31|-|1710.95|-|0.68760613798243149 +AAAAAAAAEJCEAAAA|-|Regular, available sectors will think animals. Again naval women apply even subject groups. Afraid trades would sing far. Genes allow in the women. Dutch su|-|Books|-|cooking|-|1.80|-|7305.67|-|2.93604344608206568 +AAAAAAAAELLCAAAA|-|Just worthwhile managers should register even; otherwise wid|-|Books|-|cooking|-|8.44|-|548.20|-|0.22031367652004380 +AAAAAAAAFDIAAAAA|-|Great pp. will not r|-|Books|-|cooking|-|1.91|-|4575.25|-|1.83872701294843197 +AAAAAAAAFPEBAAAA|-|New, general students raise therefore to a women; united letters would start black positio|-|Books|-|cooking|-|4.03|-|3276.24|-|1.31667362196648724 +AAAAAAAAGFBCAAAA|-|Living, popular approaches can stay for the sentences. Very prospe|-|Books|-|cooking|-|6.06|-|530.58|-|0.21323245255017300 +AAAAAAAAGLPDAAAA|-|As specific ears worry also labour components. Duly proper articles would attend more easy shapes; years wait head convention|-|Books|-|cooking|-|7.56|-|9128.13|-|3.66846384540844114 +AAAAAAAAGMJBAAAA|-|Badly unacceptable centres enable then understandably political delegates; very genes mean clearly in a serva|-|Books|-|cooking|-|2.49|-|3018.19|-|1.21296704731125685 +AAAAAAAAGPPBAAAA|-|More black members would run more central poor phases. Personal responsibiliti|-|Books|-|cooking|-|9.69|-|11132.94|-|4.47416808076807087 +AAAAAAAAHBGCAAAA|-|Dramatic months deal broadly in a films. Almost new occasions may get together sources. Under dry orders wor|-|Books|-|cooking|-|3.92|-|159.12|-|0.06394803394357784 +AAAAAAAAHCGEAAAA|-|Thus certain stars appear totally even local guests. Urban friends might not take properly various vehicles|-|Books|-|cooking|-|4.55|-|345.06|-|0.13867463921927456 +AAAAAAAAIDECAAAA|-|Average items take new export|-|Books|-|cooking|-|0.16|-|7046.87|-|2.83203545723969549 +AAAAAAAAIIDBAAAA|-|Constraints come above almost com|-|Books|-|cooking|-|1.69|-|3421.47|-|1.37503946516423617 +AAAAAAAAIIGDAAAA|-|Conditions explain tightly real, necessary feet. Narrowly good parents make. Current programmes see rules. Provincial hours used to get so words. New, import|-|Books|-|cooking|-|3.53|-|9283.96|-|3.73108967578443243 +AAAAAAAAIIOCAAAA|-|Conveniently other workers relate also likely, sensitive boys. Costs like complete, other forms. Fortunately closed parents should make very gothic acute month|-|Books|-|cooking|-|78.03|-|5764.45|-|2.31664934807728292 +AAAAAAAAILBAAAAA|-|New, right years may solve yesterday various advantages. Considerations will keep then furthe|-|Books|-|cooking|-|6.85|-|4856.16|-|1.95162069202768316 +AAAAAAAAIMBEAAAA|-|Holes buy then markets. Practical themes ought to escape above australian children.|-|Books|-|cooking|-|5.08|-|310.80|-|0.12490603915072896 +AAAAAAAAJHGDAAAA|-|Guests agree around trying, young costs. Here annual banks appeas|-|Books|-|cooking|-|58.88|-|13414.00|-|5.39089320839085656 +AAAAAAAAJIHBAAAA|-|Wonderful qualities suffer of course light leaders. True clubs used to see early living operat|-|Books|-|cooking|-|9.91|-|3903.79|-|1.56887691948592082 +AAAAAAAAKBMCAAAA|-|Slowly small debts might not see together real students. Circumstances think approximately in a observations. Blues cannot breathe from the millions. Very other su|-|Books|-|cooking|-|2.44|-|2939.02|-|1.18114976571678062 +AAAAAAAAKJHDAAAA|-|Simple changes ought to vote almost sudden techniques. Partial, golden faces mean in a officials; vertically minor |-|Books|-|cooking|-|9.01|-|2401.19|-|0.96500364269092298 +AAAAAAAAKLEBAAAA|-|Electoral, appropriate explanations encourage all for |-|Books|-|cooking|-|6.03|-|954.78|-|0.38371231679643820 +AAAAAAAAKOFDAAAA|-|Severe parts find only on every years. Sure, clinical men need prayers. About aware weapons ought to make rather in a things. Ahead little shareholders shall lead availa|-|Books|-|cooking|-|6.89|-|550.50|-|0.22123801336060582 +AAAAAAAALCJDAAAA|-|Yet religious animals ensure also. Rough, real heads resist dead. Civil, evolutionary votes dissuade rapidly left cars. Buyers |-|Books|-|cooking|-|2.20|-|3283.05|-|1.31941046278571654 +AAAAAAAALLNCAAAA|-|Here comprehensive years should tend sensibly particular front sales. Official, coherent tears regulate animals. Rewards cannot w|-|Books|-|cooking|-|2.50|-|95.04|-|0.03819520579435418 +AAAAAAAAMBJBAAAA|-|Full, extensive police say seemingly prisoners. Only good police prove further funny days. Medical, whole households can use. Small police wonder later in a boys. Able causes shall buy as|-|Books|-|cooking|-|7.96|-|8031.71|-|3.22782845465669647 +AAAAAAAAMCFDAAAA|-|Extremely turkish teeth mu|-|Books|-|cooking|-|6.80|-|15131.26|-|6.08103524440109081 +AAAAAAAAMDNBAAAA|-|Historical, new notes should say levels; largely low prisons present at once enough useful winners. Yet worthwhile sons give different, social beaches. Minutes want guns. Industrial|-|Books|-|cooking|-|2.31|-|6089.79|-|2.44739880360269527 +AAAAAAAAMGIAAAAA|-|Shows investigate less circles. Already electoral companies should not consider other processes. British forests shall imitate. Foreign, recent dollars belong far various organisations. Other, splen|-|Books|-|cooking|-|9.63|-|7583.56|-|3.04772343070110065 +AAAAAAAAMHAAAAAA|-|Cheaply financial tales allow unfortunately safe, red meals. Who|-|Books|-|cooking|-|14.75|-|2622.90|-|1.05410569526527342 +AAAAAAAAMIACAAAA|-|Available concepts get lab|-|Books|-|cooking|-|8.01|-|5237.07|-|2.10470292939223969 +AAAAAAAAMPBAAAAA|-|Regions validate reasonab|-|Books|-|cooking|-|4.13|-|6362.13|-|2.55684832323689580 +AAAAAAAAMPNBAAAA|-|Cases move so very natural tories. Therefore political cells win there already eastern events. Extra questions encourage skilled efforts. Serious, physical clothes would |-|Books|-|cooking|-|1.32|-|261.42|-|0.10506092906944519 +AAAAAAAANHBBAAAA|-|Sound, new offices might equip hot, new reports; calculations fight great scientists. Professional, little issues learn of c|-|Books|-|cooking|-|66.16|-|3559.14|-|1.43036705335561601 +AAAAAAAAOHHBAAAA|-|Ago comfortable c|-|Books|-|cooking|-|4.89|-|1051.05|-|0.42240184185770164 +AAAAAAAAOJIBAAAA|-|Eyes work much applications. Suitable, low times attack accordingly new, s|-|Books|-|cooking|-|5.67|-|11284.10|-|4.53491710547213840 +AAAAAAAAOMJAAAAA|-|So young privileges find awkward shareholders. Particular, metropolitan examinations should not get in a pp.. Obviously national conditions fear shortly very great p|-|Books|-|cooking|-|3.60|-|4140.25|-|1.66390678440735380 +AAAAAAAAPAFCAAAA|-|Half general features used to defend as ready medical pounds. Turkish, trying rooms secure with a ci|-|Books|-|cooking|-|7.08|-|11126.00|-|4.47137899482307068 +AAAAAAAAPHHCAAAA|-|African, elected carers would examine proba|-|Books|-|cooking|-|6.20|-|7459.31|-|2.99778914703160878 +AAAAAAAAAGKDAAAA|-|Organic, mental leaders justify video-taped, economic results. At once particular competitors shall rule. Ingredients |-|Books|-|entertainments|-|4.18|-|6181.34|-|2.54754636271108317 +AAAAAAAAAJJCAAAA|-|Really brief concentrations can defend at least parts. Foundations pay downstairs perfect, grey institutions. Others would stand to|-|Books|-|entertainments|-|0.22|-|104.61|-|0.04311343899594690 +AAAAAAAABAJDAAAA|-|Rare, radical beds say over readers; han|-|Books|-|entertainments|-|7.10|-|14445.55|-|5.95351628609024701 +AAAAAAAACFDDAAAA|-|Following, small conditions expand responsible, important parents. New, re|-|Books|-|entertainments|-|3.89|-|369.20|-|0.15216023016254273 +AAAAAAAACFKCAAAA|-|Russians check too major, long mechanisms; far brown countries shall not increase; useful policies shall believe. Full, criminal boys shall spend. Very other goals would establish afte|-|Books|-|entertainments|-|61.96|-|4746.71|-|1.95628517365883863 +AAAAAAAACKDEAAAA|-|Rates extend at the motives. Final, different eyes sleep repeatedly lines. Steps might not make new savings. Now clear things get powerful, different sentences. Old, |-|Books|-|entertainments|-|3.27|-|1618.02|-|0.66684262082231147 +AAAAAAAACLBCAAAA|-|On|-|Books|-|entertainments|-|5.63|-|4073.25|-|1.67872875815161753 +AAAAAAAACMMCAAAA|-|Accurately economic workers play clearly. Deliberately other stands recapture social, cultural prices. Full paths used to make twice alw|-|Books|-|entertainments|-|1.58|-|2986.15|-|1.23069683450670906 +AAAAAAAACMOBAAAA|-|Thousands leave in a cas|-|Books|-|entertainments|-|2.13|-|7231.72|-|2.98044469033332487 +AAAAAAAACOOBAAAA|-|Hitherto certain kinds evade also by a months. Poor points might make even just selective passengers. Old, general qualities could overcome over; recent variables might s|-|Books|-|entertainments|-|4.92|-|4284.72|-|1.76588293982137081 +AAAAAAAAEIIDAAAA|-|Also difficult acres researc|-|Books|-|entertainments|-|4.84|-|9344.84|-|3.85133533378151637 +AAAAAAAAEKADAAAA|-|Social influences embrace only ce|-|Books|-|entertainments|-|76.35|-|10036.39|-|4.13634727085872772 +AAAAAAAAEMCEAAAA|-|Much |-|Books|-|entertainments|-|3.10|-|1509.00|-|0.62191166661775998 +AAAAAAAAFAKBAAAA|-|Doors cannot happen here severe, old rates. Inevitable, int|-|Books|-|entertainments|-|2.29|-|73.30|-|0.03020949314982227 +AAAAAAAAFGJCAAAA|-|Limitations respond. Bare rivers will not create yesterday. Well local persons may unders|-|Books|-|entertainments|-|8.95|-|6758.01|-|2.78521223467162899 +AAAAAAAAGJEAAAAA|-|Troops can score so small women. Lengths used to lose very to the sides. Teachers must describe well stat|-|Books|-|entertainments|-|9.89|-|921.39|-|0.37973703810797738 +AAAAAAAAGKHCAAAA|-|Also bare years should fight enough out of an sports. Very initial hours shall not regard also hard local obligatio|-|Books|-|entertainments|-|0.16|-|636.82|-|0.26245579028198934 +AAAAAAAAGOMDAAAA|-|Past, interior years fetch accidents. Away internal feet would not organise so square collective rocks. M|-|Books|-|entertainments|-|1.35|-|1041.17|-|0.42910256456753689 +AAAAAAAAHFABAAAA|-|Prisons take angry, logical sums. Now old grounds cannot help so increased problems. Blue, negative designs would freeze. Small payments ask alike to a hundreds. Exte|-|Books|-|entertainments|-|2.62|-|3222.09|-|1.32793595884189415 +AAAAAAAAHGMAAAAA|-|High, official employees shall not start too left circumstances. Patients used to touch obviously popular, senior members. British, impossible theories make only. Young, international wo|-|Books|-|entertainments|-|4.85|-|12452.49|-|5.13210656689263752 +AAAAAAAAHPPDAAAA|-|Now old tears give. Other kids coincide up a animals; specific procedures remove future, french levels. Coming, strong values a|-|Books|-|entertainments|-|5.08|-|928.65|-|0.38272913797520398 +AAAAAAAAICABAAAA|-|Then attractive degrees understand enough; human, old products might substantiate systematic, net persons. Therefore direct police will not give internationally silly common parti|-|Books|-|entertainments|-|82.90|-|10018.99|-|4.12917612241661438 +AAAAAAAAIMKCAAAA|-|Actual, british years understand shares. Chinese, naked e|-|Books|-|entertainments|-|5.19|-|1649.38|-|0.67976717341683298 +AAAAAAAAKAICAAAA|-|Superb, small issues ought to go on a views. New, alone members use enough ec|-|Books|-|entertainments|-|67.71|-|7791.62|-|3.21119905888155802 +AAAAAAAAKBLBAAAA|-|Stages will not maintain thirdly |-|Books|-|entertainments|-|2.26|-|3136.96|-|1.29285090902137068 +AAAAAAAAKIDEAAAA|-|Years leave. Brave, healthy workers avoid again. Clearly certain groups mean usually normally legal cars. Glad years would not melt big, bad tanks; still, red|-|Books|-|entertainments|-|5.27|-|5647.45|-|2.32751162467890565 +AAAAAAAALMJCAAAA|-|Never able feet go on the provisions. Services play brown studies. Cruel,|-|Books|-|entertainments|-|9.79|-|2375.75|-|0.97912965007762974 +AAAAAAAAMBHAAAAA|-|Hands can ensure. Dead schools concentrate by a years. Increased authorities should not stop natural, following guards. Principal years might secure. Long, criti|-|Books|-|entertainments|-|4.68|-|16367.15|-|6.74547484047903931 +AAAAAAAAMBOCAAAA|-|Common interests would |-|Books|-|entertainments|-|5.31|-|17289.52|-|7.12561577085559549 +AAAAAAAAMGDCAAAA|-|Just huge conditions must show old suggestions; large, ready lines avoid too rates. Reasonable standards can allocate today hard vari|-|Books|-|entertainments|-|2.02|-|4437.16|-|1.82870879433377064 +AAAAAAAAMIKCAAAA|-|Total, christian things go exciting, light mammals. Proteins can|-|Books|-|entertainments|-|0.82|-|1309.93|-|0.53986795855043230 +AAAAAAAAMLPAAAAA|-|Particularly british players continue vital, dark bones. Styles used to fight also. Foreign, local resources seek well rebels. Solid characters pay always on |-|Books|-|entertainments|-|6.28|-|7620.47|-|3.14066215911904667 +AAAAAAAAMNECAAAA|-|Cases accommodate far; lonely streets get always social, appropriate costs. Times shall not lay anyway papers; yellow matte|-|Books|-|entertainments|-|2.40|-|10613.30|-|4.37411205521157855 +AAAAAAAAMNNDAAAA|-|Particular, large services must not know songs. Aware, great goals may play for a rates. Ev|-|Books|-|entertainments|-|2.45|-|10778.04|-|4.44200716982961022 +AAAAAAAANAECAAAA|-|Full mines shall not slow also well increased animals. Sharply great hours happen in terms |-|Books|-|entertainments|-|0.41|-|16159.17|-|6.65975900984738807 +AAAAAAAAOAFDAAAA|-|Governments could cry soviet articles. Supporters know though old schools. Widespread difficulties arise even. Homes should not expect in a years. Southern countries set in addition furth|-|Books|-|entertainments|-|6.94|-|21508.66|-|8.86447089947962190 +AAAAAAAAOEEBAAAA|-|Chosen, detailed kinds think initially in a powers. Coherent i|-|Books|-|entertainments|-|4.31|-|null|-|null +AAAAAAAAOGGDAAAA|-|Double prisoners show hard. Men take. Other, complete troops could not get for a differences. Please essential men simplify. Ministe|-|Books|-|entertainments|-|69.95|-|466.20|-|0.19213732205248489 +AAAAAAAAOOHAAAAA|-|Minor statements ques|-|Books|-|entertainments|-|8.43|-|1185.60|-|0.48862721798675695 +AAAAAAAAPCKBAAAA|-|Men call tonight particularly mental lines. Recent markets must dress children. Multiple relations should seem relatively about a arts. Funny, real proteins shall keep citie|-|Books|-|entertainments|-|5.20|-|29.10|-|0.01199312756698265 +AAAAAAAAPEGAAAAA|-|Dirty trials should get. Balls shall win later national programmes. Elements ought to explain apart poss|-|Books|-|entertainments|-|1.62|-|4357.78|-|1.79599352057888807 +AAAAAAAAPFIAAAAA|-|Subsequent, |-|Books|-|entertainments|-|1.29|-|3977.07|-|1.63908961693538416 +AAAAAAAAPNPAAAAA|-|Countries turn more actually scientific patients. Good writers could not drag perhaps. Suddenly left months cannot announce more overall loans; beds transform far |-|Books|-|entertainments|-|1.32|-|2954.24|-|1.21754560767982190 +AAAAAAAAACDDAAAA|-|Christ|-|Books|-|fiction|-|9.27|-|17458.98|-|3.68774070989903196 +AAAAAAAAADBEAAAA|-|Tools must mean only. Educational, united investors may not prove from the changes|-|Books|-|fiction|-|8.80|-|8819.72|-|1.86292901955960143 +AAAAAAAAAFDAAAAA|-|Also essential miles save sides. Active, perfect places show lastly then|-|Books|-|fiction|-|2.18|-|2128.22|-|0.44952932723568718 +AAAAAAAAANCCAAAA|-|Able letters ought to stimulate awa|-|Books|-|fiction|-|5.88|-|521.76|-|0.11020778950413592 +AAAAAAAABGFEAAAA|-|Married circumstances face human, compulsory hours. Years make sometimes national problems. Difficulties should invest far running, medical centuries; perf|-|Books|-|fiction|-|2.71|-|9995.05|-|2.11118592165615170 +AAAAAAAABJAAAAAA|-|Other horses apply able schools; possible enquiries would not describe easily r|-|Books|-|fiction|-|3.83|-|4493.84|-|0.94920302971723811 +AAAAAAAABKFAAAAA|-|Firm, local examinations may not sponsor most rural charges. Countries shall help beautiful, different terms|-|Books|-|fiction|-|7.72|-|4966.73|-|1.04908834399700435 +AAAAAAAABOJBAAAA|-|As joint men would so|-|Books|-|fiction|-|2.13|-|7769.21|-|1.64103699074944001 +AAAAAAAABPGDAAAA|-|Pictures get with a conditions; still gross eyes go that. Personal beings contact thereafter in a systems. New, medium goals might not tell; as official years mu|-|Books|-|fiction|-|5.52|-|451.40|-|0.09534612883733317 +AAAAAAAACKACAAAA|-|Legal, serious solutions would work there blue jobs. Too divine weapons may represent yet severe letters. Systematic, i|-|Books|-|fiction|-|7.78|-|2191.27|-|0.46284694669336077 +AAAAAAAACMCEAAAA|-|Too swi|-|Books|-|fiction|-|7.45|-|7812.88|-|1.65026110560616650 +AAAAAAAACNGBAAAA|-|European, liable prizes might make at least superior centres. Both minor accounts ought to pr|-|Books|-|fiction|-|6.11|-|6249.73|-|1.32008764239819720 +AAAAAAAACOABAAAA|-|Plants try on a loans. Wrong lips could use. Anywhere parental demands benefit small trials. Above solid feelings recognise inevitably to the par|-|Books|-|fiction|-|7.19|-|2775.96|-|0.58634700887745543 +AAAAAAAADCODAAAA|-|Private, quiet populations shall receive more somewhat proposed machines. Heads protect abroad parent|-|Books|-|fiction|-|74.86|-|1590.48|-|0.33594619183252471 +AAAAAAAADDBDAAAA|-|Circumstances should include parties. Good investigations fall as deposits. Characters might force at all convenient, special years; |-|Books|-|fiction|-|5.18|-|8366.89|-|1.76728084162116638 +AAAAAAAADNMAAAAA|-|Old, official cases look enough; actual emotions go statistical, wild limits. Mental cities hear above mod|-|Books|-|fiction|-|2.55|-|2467.37|-|0.52116565775226127 +AAAAAAAADPHDAAAA|-|Times should not get on a lists; different students undermine suddenly groups. Even actual modules may stay for a |-|Books|-|fiction|-|8.31|-|1713.69|-|0.36197099585123942 +AAAAAAAAECOCAAAA|-|Years provide hardly interesting books. Positions must work ra|-|Books|-|fiction|-|1.82|-|2035.39|-|0.42992148244178014 +AAAAAAAAEECAAAAA|-|Educational, political doors will not appear strictly accurately due product|-|Books|-|fiction|-|6.44|-|15981.61|-|3.37568596829422269 +AAAAAAAAEEGAAAAA|-|Years go as to a efforts. Good, superior technologies should help now full, unpleasant decisions. Rules listen children. Exactly similar ages might correspond somewhat; national, quiet tri|-|Books|-|fiction|-|14.99|-|1651.12|-|0.34875476350442521 +AAAAAAAAEOKBAAAA|-|Fierce, public customers shall not become then groups; poor, leading addresses advance exactly bright pp.. Quite right talks ensure hardl|-|Books|-|fiction|-|1.72|-|546.14|-|0.11535740984320145 +AAAAAAAAFHDBAAAA|-|Good, bad cats could not finance libraries. Concerned names get at |-|Books|-|fiction|-|0.13|-|3782.75|-|0.79900436167350917 +AAAAAAAAFMHBAAAA|-|Years take critics. Again academic areas look high under a w|-|Books|-|fiction|-|90.57|-|338.73|-|0.07154761679457214 +AAAAAAAAGCPAAAAA|-|Planes overcome only black ministers. Please medical terms correct lately then likely agreements. Recent patients must |-|Books|-|fiction|-|4.40|-|null|-|null +AAAAAAAAGFOAAAAA|-|Houses used to keep accordingly others. American, relevant arrangements pretend. Rather handsome practices used to enable so services. Dynamic, great spirits shall authorise moves; inst|-|Books|-|fiction|-|5.23|-|9897.14|-|2.09050506327231632 +AAAAAAAAGHAEAAAA|-|Shortly economic records cause nevertheless by a requirements. Privately silent forms take. Pink leaves aba|-|Books|-|fiction|-|0.41|-|72.67|-|0.01534958613781347 +AAAAAAAAGJBEAAAA|-|Necessary, different views may allow both in a days. Sure feet like today; targets shall answer readily locations. As additional c|-|Books|-|fiction|-|9.63|-|14308.30|-|3.02224416314402783 +AAAAAAAAGJGBAAAA|-|Accounts accept|-|Books|-|fiction|-|1.31|-|7609.64|-|1.60733211308312797 +AAAAAAAAGMABAAAA|-|Different contents need sure, modern resources. As distinct agencies should dr|-|Books|-|fiction|-|9.01|-|5397.49|-|1.14007482706738458 +AAAAAAAAHDHCAAAA|-|Difficult decisions retain concerns. Accordingly parliamentary cases worry only inadequate, good scores. Responsible adults exist still well silly|-|Books|-|fiction|-|2.74|-|765.00|-|0.16158570793212201 +AAAAAAAAHPGDAAAA|-|Far right commun|-|Books|-|fiction|-|1.20|-|3588.89|-|0.75805664227518084 +AAAAAAAAIACDAAAA|-|Modern pains must not support high charges. British, old reasons make more adequate emissions; precisely strong detectives announce at a years. Horses must s|-|Books|-|fiction|-|1.51|-|2921.87|-|0.61716657834722787 +AAAAAAAAIBACAAAA|-|Publications must mean so naturally average reasons. Common tools need detailed stairs. Slig|-|Books|-|fiction|-|4.26|-|28995.29|-|6.12447642006167040 +AAAAAAAAIBFAAAAA|-|Natural a|-|Books|-|fiction|-|1.23|-|12669.45|-|2.67608110766094528 +AAAAAAAAIGECAAAA|-|Families could begin sudden, common costs; cars undergo thus most running penalties. National officers deliver muc|-|Books|-|fiction|-|2.63|-|2381.82|-|0.50309551747305469 +AAAAAAAAILCEAAAA|-|Almost young |-|Books|-|fiction|-|2.28|-|5445.96|-|1.15031281303270478 +AAAAAAAAIMLAAAAA|-|Again perfect sons used to put always. Europea|-|Books|-|fiction|-|7.10|-|77.33|-|0.01633388600573986 +AAAAAAAAIMOAAAAA|-|Different, expensive years used to learn humans. Normally parliamentary cards benefit. Certain consequences used to encourage. More new proposals could not prom|-|Books|-|fiction|-|8.04|-|8590.66|-|1.81454624536491925 +AAAAAAAAJHGAAAAA|-|Large hearts used to say annually. For example separate criteria should admit gay ministers. Growing, ordinary|-|Books|-|fiction|-|1.92|-|7354.85|-|1.55351456730008827 +AAAAAAAAJHIBAAAA|-|Plans mi|-|Books|-|fiction|-|4.76|-|8275.67|-|1.74801306609493348 +AAAAAAAAJJBAAAAA|-|Citizens can b|-|Books|-|fiction|-|4.61|-|14512.80|-|3.06543929683307221 +AAAAAAAAJKFEAAAA|-|Personal, sympathetic text|-|Books|-|fiction|-|0.15|-|7168.18|-|1.51408554233317427 +AAAAAAAAJLODAAAA|-|Social, private books ought to demand merely social companies. Alive, swiss police will rest again victorian, married commentators. Standard, european territories attend to a comments. Books atte|-|Books|-|fiction|-|2.81|-|9187.51|-|1.94061478102411797 +AAAAAAAAJOKBAAAA|-|Favourably present words can make small, economic cases. About eastern years give less views. Only possible workers may accept even requirements. Negative goods imp|-|Books|-|fiction|-|4.00|-|1525.60|-|0.32224203401469978 +AAAAAAAAKAOCAAAA|-|Forward appropriate women may not make positions|-|Books|-|fiction|-|58.18|-|217.63|-|0.04596849361734341 +AAAAAAAAKEFEAAAA|-|Political, new places shall retain quite successful, environmental soldiers. Speakers will|-|Books|-|fiction|-|4.26|-|6516.06|-|1.37634270330481427 +AAAAAAAAKIKBAAAA|-|Natural guests m|-|Books|-|fiction|-|1.13|-|3270.39|-|0.69078206975703593 +AAAAAAAAKNCDAAAA|-|Possible, british studies work changes. Points may fight later so modern factors. Ca|-|Books|-|fiction|-|8.57|-|17397.85|-|3.67482863888479585 +AAAAAAAAKPPAAAAA|-|Very, hard principles agree once differences. Long, economic services submit yet. Fundamental interests cover legal voters; hours as|-|Books|-|fiction|-|4.10|-|1348.16|-|0.28476259870035242 +AAAAAAAALDNBAAAA|-|Enough little accountants light only important, great systems. Determined sk|-|Books|-|fiction|-|0.36|-|5107.70|-|1.07886447111751577 +AAAAAAAALGFAAAAA|-|Primary, good features assess then early, bad c|-|Books|-|fiction|-|4.63|-|1000.22|-|0.21126961671616611 +AAAAAAAALHNDAAAA|-|Mass attitudes may like occupational state|-|Books|-|fiction|-|6.40|-|13581.57|-|2.86874196507146439 +AAAAAAAALIOBAAAA|-|Additional officers shall not apply so poin|-|Books|-|fiction|-|9.09|-|11472.51|-|2.42325967334424709 +AAAAAAAAMAMCAAAA|-|Fellow, |-|Books|-|fiction|-|2.49|-|1559.88|-|0.32948276351523983 +AAAAAAAAMBPAAAAA|-|Better high children|-|Books|-|fiction|-|9.22|-|15562.11|-|3.28707785786608520 +AAAAAAAAMCMDAAAA|-|Dramatic, potential suggest|-|Books|-|fiction|-|3.77|-|9289.42|-|1.96214053199844810 +AAAAAAAAMDDEAAAA|-|New minutes make welsh, specialist discussions. Private holders take as usual. Facilities would know much small, eastern hours. Basic, other rules might give at least plants. In|-|Books|-|fiction|-|2.06|-|11921.66|-|2.51813055009942696 +AAAAAAAAMFKCAAAA|-|Sales used to tal|-|Books|-|fiction|-|3.83|-|2394.22|-|0.50571468450358843 +AAAAAAAANGMDAAAA|-|Eastern changes |-|Books|-|fiction|-|2.32|-|10140.75|-|2.14196113426492317 +AAAAAAAANGNCAAAA|-|Important enterprises could flow without a countries; ugly, previous things see even de|-|Books|-|fiction|-|0.82|-|7032.00|-|1.48532117408978031 +AAAAAAAANIEDAAAA|-|Excellent, relevant concentrations seem exciting, local children. Units should not reinforce current lips; pure feet shall show always into a minutes. Commonly primit|-|Books|-|fiction|-|2.70|-|279.20|-|0.05897350281653394 +AAAAAAAANLEDAAAA|-|Conservative, available|-|Books|-|fiction|-|2.01|-|30.84|-|0.00651412187271457 +AAAAAAAANOAEAAAA|-|Black women treat really users. Expert, hard authorities should produce good indians; little, other details could waste. Ideas shall build. Low day|-|Books|-|fiction|-|0.72|-|4992.83|-|1.05460126814998263 +AAAAAAAANOBAAAAA|-|Houses appear again scientific tests. Naked pieces shall not believe experiences. Coming, good measu|-|Books|-|fiction|-|1.86|-|12097.04|-|2.55517486572966952 +AAAAAAAAOBGCAAAA|-|Single years would not want again with a authorities. Necessary, english settings could cost enough super|-|Books|-|fiction|-|3.06|-|19833.19|-|4.18922881921867037 +AAAAAAAAOBOCAAAA|-|Small aspects can allow obvious, redundant colours. Past, sound individuals give both; soft, religious months improve; customers use once for a fore|-|Books|-|fiction|-|9.74|-|6377.40|-|1.34705450165531356 +AAAAAAAAOCGBAAAA|-|Political, necessary levels make on a ministers; regional, early connections might join periodically willing friends. There low days could make of course. Environmen|-|Books|-|fiction|-|4.63|-|4960.36|-|1.04774285254664145 +AAAAAAAAOFPAAAAA|-|Large ladies would not bac|-|Books|-|fiction|-|4.78|-|1757.46|-|0.37121623302272829 +AAAAAAAAOGOAAAAA|-|Conservative, gastric customers catch more. Big months accommodate probably servants. Letters should get. Jobs shall challenge royal, international pages. Satisfactory, impo|-|Books|-|fiction|-|0.48|-|10559.27|-|2.23036224600838945 +AAAAAAAAONJCAAAA|-|Miles kiss silently difficult streets. Less social rules see never |-|Books|-|fiction|-|4.51|-|5039.53|-|1.06446538914400890 +AAAAAAAAPFODAAAA|-|Rates should not turn exactly enormous flowers. Happy practitioners should believe suddenly natural organisms; al|-|Books|-|fiction|-|2.51|-|15555.24|-|3.28562675484191046 +AAAAAAAAPJKAAAAA|-|Constitutional, good pupils might not begin below level devices. External savings fit hardly. Parents shall dry. Actually literary companies improve a|-|Books|-|fiction|-|4.22|-|1637.10|-|0.34579341497474109 +AAAAAAAAPPHDAAAA|-|Eyes come no longer. Commercia|-|Books|-|fiction|-|0.20|-|7646.33|-|1.61508189036944111 +AAAAAAAAAALDAAAA|-|Christian items make especially. Economic cuts would look years. More american years will not seem. Scientific, c|-|Books|-|history|-|76.10|-|9426.79|-|2.33105484770061180 +AAAAAAAAACNBAAAA|-|English wages may study. Rows manage appropriate arms. So right cells understand human, for|-|Books|-|history|-|9.05|-|5651.73|-|1.39755872512222917 +AAAAAAAAAIKBAAAA|-|Able, only thoughts summon best currently critical points; original lads coul|-|Books|-|history|-|0.52|-|679.32|-|0.16798212107620724 +AAAAAAAAAKMBAAAA|-|Modern, absent successes say really to a |-|Books|-|history|-|0.97|-|1277.78|-|0.31596919665070377 +AAAAAAAAALHBAAAA|-|Places take |-|Books|-|history|-|2.48|-|2264.89|-|0.56006157069465202 +AAAAAAAAANCBAAAA|-|Specialist values used to examine. Suitable, terrible birds behave together in a shareholders. Imperial, realistic branches handle small, com|-|Books|-|history|-|3.77|-|802.44|-|0.19842721138254686 +AAAAAAAAANLBAAAA|-|Railways shall change much essentia|-|Books|-|history|-|1.69|-|7972.47|-|1.97143087325035315 +AAAAAAAABAJAAAAA|-|All female calls see ever fresh, widespread lawyers. Results could not want initially |-|Books|-|history|-|1.77|-|12038.12|-|2.97678403605062688 +AAAAAAAABJCEAAAA|-|Regular, elderly circumstances should not stop sole, different sites. New group|-|Books|-|history|-|2.98|-|3603.57|-|0.89109010782339414 +AAAAAAAABKDCAAAA|-|Also quiet users fall. Other, current sources would c|-|Books|-|history|-|0.43|-|3353.85|-|0.82933939346911270 +AAAAAAAABLLCAAAA|-|Similarly legislative games could expect others. Central, special miles get all to a problems. Rights pass different, glad eyes. Most local tanks|-|Books|-|history|-|9.29|-|4409.23|-|1.09031356019673384 +AAAAAAAACBODAAAA|-|Wheels understand with the events. Economic, major sessions can run. Old, high systems result steps. Waiting workers migh|-|Books|-|history|-|4.90|-|2948.63|-|0.72913666853461836 +AAAAAAAACEKBAAAA|-|Real sports can see successfully civil talks. Available, high workers ought to get at the goals. Small words change. Fun tests would look areas. Much special fires coul|-|Books|-|history|-|4.96|-|7885.86|-|1.95001396883651239 +AAAAAAAACGFAAAAA|-|Results use. True models last hastily. Strictly political kings breach also professional, good photographs. Economic masters make large f|-|Books|-|history|-|4.36|-|3103.85|-|0.76751944076780579 +AAAAAAAACIBAAAAA|-|Initially middle societies may not close effectively. Parts persuade plans; stars harm; professional, other rates represent this. Features get o|-|Books|-|history|-|9.02|-|6551.27|-|1.61999680613396364 +AAAAAAAADANAAAAA|-|Wildly sexual powers achieve local, comfortable songs; artistic, very shares might start. Miners used to sleep very italian partners. Book|-|Books|-|history|-|4.58|-|149.80|-|0.03704251565862310 +AAAAAAAADJPBAAAA|-|Architects influence around enough visual interests. Days think already other issues. Regardless lucky rules mean to a shoulders. Women accept only.|-|Books|-|history|-|1.44|-|7403.23|-|1.83066931374758537 +AAAAAAAADNIBAAAA|-|Never possible applications will not contribute still bad, golden resources; force|-|Books|-|history|-|5.60|-|7846.13|-|1.94018954195322069 +AAAAAAAAEAHCAAAA|-|Urban stories shall not ask other, good goods. In short stable photographs would inspect senior customers. Busily local seats will appear. Figures inform average, firm office|-|Books|-|history|-|9.78|-|3142.64|-|0.77711142462894057 +AAAAAAAAEDDBAAAA|-|Mo|-|Books|-|history|-|2.59|-|2291.06|-|0.56653288334342482 +AAAAAAAAEFFCAAAA|-|Enormous women may sign good, black characteristics. Lovely lips explain never|-|Books|-|history|-|4.81|-|2986.04|-|0.73838740625684192 +AAAAAAAAEGFEAAAA|-|Ultimately senior elections marry at l|-|Books|-|history|-|2.27|-|1545.16|-|0.38208687246380553 +AAAAAAAAEGIBAAAA|-|Terms shall not express for a operations; obvious doors mu|-|Books|-|history|-|0.68|-|2669.27|-|0.66005658058806997 +AAAAAAAAEIBEAAAA|-|Differences will not see areas; as black guidelines ought to evoke ever material integ|-|Books|-|history|-|3.72|-|3893.08|-|0.96268008584961560 +AAAAAAAAEIICAAAA|-|Services can comply; other copies used to reduce. Questions think in the directions. Competitors would not eat else. Public, aware workers fill fully only afraid times. C|-|Books|-|history|-|0.86|-|5085.00|-|1.25741783794458252 +AAAAAAAAEJFEAAAA|-|Defensively happy clothes shall not want labour|-|Books|-|history|-|0.74|-|18254.24|-|4.51390501359321848 +AAAAAAAAEKACAAAA|-|Before other troops see also domestic plans. Single concerns hear deep monetary officers. Main, classic members look on a producers; german |-|Books|-|history|-|0.89|-|1438.34|-|0.35567244307359111 +AAAAAAAAELMBAAAA|-|Reports would make just doors. Again severe resources must prove really dry secret men. Effects move very due vehicles. |-|Books|-|history|-|8.33|-|1918.73|-|0.47446319138631442 +AAAAAAAAEMHCAAAA|-|Open figures may not take further; well|-|Books|-|history|-|1.12|-|14029.42|-|3.46919232330707667 +AAAAAAAAEMLBAAAA|-|Regions get only as traditional earnings. Currently magnificent members offer unique words. Internal, nationa|-|Books|-|history|-|4.04|-|13275.02|-|3.28264443403561294 +AAAAAAAAENCDAAAA|-|Cases survi|-|Books|-|history|-|59.08|-|7463.45|-|1.84556050395427618 +AAAAAAAAFLAAAAAA|-|Origins help still already common hands. Probably official increases could inform more recent, |-|Books|-|history|-|34.26|-|13339.17|-|3.29850743389876829 +AAAAAAAAGDLCAAAA|-|Specially manufacturing audiences mind strictly main models. Sessions spend natural, professional methods. Proper views may help very complete, massiv|-|Books|-|history|-|1.31|-|871.38|-|0.21547468153945926 +AAAAAAAAGFHBAAAA|-|Burning, goo|-|Books|-|history|-|2.29|-|9152.66|-|2.26326803316457475 +AAAAAAAAGINCAAAA|-|Sometimes eastern prices play dealers; visible, personal students start overall|-|Books|-|history|-|1.92|-|5219.51|-|1.29067944529599369 +AAAAAAAAGNCCAAAA|-|Authorities die in particular to a ingredients. Alone, public houses assist vaguely in a others. Rights would halt only to a sales. Boring ideas join unexpec|-|Books|-|history|-|5.50|-|21350.33|-|5.27950556302917570 +AAAAAAAAGNJAAAAA|-|Norma|-|Books|-|history|-|9.93|-|9762.19|-|2.41399249624468515 +AAAAAAAAGPICAAAA|-|National, useful recordings ought to work well; other issues accept in a members. Too coherent functions used to like of course lo|-|Books|-|history|-|1.19|-|2070.72|-|0.51204724983060097 +AAAAAAAAHIICAAAA|-|Then sp|-|Books|-|history|-|1.91|-|15144.71|-|3.74498102350003900 +AAAAAAAAHKBEAAAA|-|Parliamentary pieces shine never tragic patterns. Great human eyes would not get groups. Plant|-|Books|-|history|-|6.03|-|10823.68|-|2.67647754261632623 +AAAAAAAAHOEDAAAA|-|Tropical, different relations would not work eyes. Level customs might aff|-|Books|-|history|-|0.31|-|2.94|-|0.00072700264376737 +AAAAAAAAHONAAAAA|-|Ready, imperial shops see impossible assumptions. Clinical holders ask. Other rules would not avoid at a panels. Unusual, particular rights cannot go yet golden substance|-|Books|-|history|-|4.56|-|7032.14|-|1.73890624875587345 +AAAAAAAAIBHDAAAA|-|Cold, old days stem thereby difficult, nuclear men; likely contents shall threaten often outer years. All real or|-|Books|-|history|-|5.62|-|5557.94|-|1.37436635166680687 +AAAAAAAAIHKBAAAA|-|For example only cases could worry even posts. Results come sometimes components.|-|Books|-|history|-|6.71|-|11961.58|-|2.95785723933159476 +AAAAAAAAIJHBAAAA|-|Male, major regulations could get. Books may not bring. Upper, musical girls take well special, curious parents. Criminal, equal knees stop just a|-|Books|-|history|-|4.05|-|16256.70|-|4.01995370031734407 +AAAAAAAAILFBAAAA|-|Designs would throw especially linear, horizontal characters. Fundament|-|Books|-|history|-|2.45|-|1823.06|-|0.45080593188657829 +AAAAAAAAIOEAAAAA|-|Video-taped stairs soften men. Working leads address substantial blocks. Dry cases|-|Books|-|history|-|5.71|-|3714.20|-|0.91844667329277648 +AAAAAAAAJENCAAAA|-|Opponents bring also waiting, other things. There massive characters contact|-|Books|-|history|-|58.48|-|1992.39|-|0.49267782225022749 +AAAAAAAAJGICAAAA|-|Boys form so go|-|Books|-|history|-|4.24|-|53.64|-|0.01326408905159241 +AAAAAAAAKDICAAAA|-|Conserva|-|Books|-|history|-|3.23|-|245.79|-|0.06077890469781690 +AAAAAAAAKHFAAAAA|-|Yet local mountains shall not escape alternatively. International publishers arrive only lovely elections. Competitive passengers address possible, primary schools; attractive ye|-|Books|-|history|-|3.55|-|548.31|-|0.13558599306261436 +AAAAAAAAKKGAAAAA|-|Original, physical pupil|-|Books|-|history|-|3.57|-|4918.80|-|1.21631993338875368 +AAAAAAAAKKMCAAAA|-|Talks arise glad studies. Boldly electronic |-|Books|-|history|-|1.87|-|10456.08|-|2.58557748416432456 +AAAAAAAALGCAAAAA|-|Popular, current dogs shall not nominate respectively. More labour connections take further feet; holy, neighbouring months can leave. Attempts should investigate |-|Books|-|history|-|0.64|-|4324.99|-|1.06948270893450146 +AAAAAAAALKABAAAA|-|Green discussions might offer most. Grateful feet ought to go still |-|Books|-|history|-|47.36|-|4152.71|-|1.02688134312897685 +AAAAAAAAMCBCAAAA|-|Parliamentary, irish achievements come specifically probably normal efforts. Boxes prove activities. Particular spirits display above, hot legs. Willing, warm police w|-|Books|-|history|-|5.08|-|14539.33|-|3.59528277163477029 +AAAAAAAAMCPCAAAA|-|Administrative shops feel other sales. Inherent, n|-|Books|-|history|-|2.62|-|1640.46|-|0.40565263843354372 +AAAAAAAAMFFEAAAA|-|Arguments should not grab likely, bizarre jeans; woods come however by a men. So full children help stub|-|Books|-|history|-|0.75|-|61.25|-|0.01514588841182019 +AAAAAAAAMFJDAAAA|-|Other trees complete already wide isolated republics. True, right friends can appeal before a minutes; too powerful structures look major patterns. Fundame|-|Books|-|history|-|4.04|-|10831.95|-|2.67852254665168547 +AAAAAAAAMGFDAAAA|-|Great, dead procedures put exactly. Speak|-|Books|-|history|-|0.13|-|10723.86|-|2.65179407190174841 +AAAAAAAAMNFBAAAA|-|Mostly sheer workers may put as political only tasks. National players|-|Books|-|history|-|1.30|-|2037.16|-|0.50374853937997753 +AAAAAAAANCDEAAAA|-|Soon sure forests cope; guilty, e|-|Books|-|history|-|6.82|-|6726.32|-|1.66328313701541874 +AAAAAAAANHACAAAA|-|Grey words need. English, swiss measures help separat|-|Books|-|history|-|3.59|-|4911.27|-|1.21445791641339032 +AAAAAAAANHIAAAAA|-|Parliamentary, monetary charges shall evaluate by a observations. Urgent, suitable problems give just at the rises; earlier big others stay always guilty terms. S|-|Books|-|history|-|1.16|-|5606.91|-|1.38647564400193887 +AAAAAAAANJJDAAAA|-|Lovely years help. Possible, good years must imagine even necessar|-|Books|-|history|-|35.72|-|553.90|-|0.13696828720501559 +AAAAAAAAONEEAAAA|-|Whole hands happen to the flowers. Available, new others might not make widely more vast players; roy|-|Books|-|history|-|8.15|-|13594.32|-|3.36160087762572213 +AAAAAAAAPINBAAAA|-|Major, front faces wonder very desirable teachers. Prospective, national plans take industrial, separate locations. Capitalist children save head, economic features. Techniques l|-|Books|-|history|-|1.92|-|5860.88|-|1.44927729755214253 +AAAAAAAAPONBAAAA|-|Trends work to a co|-|Books|-|history|-|4.91|-|1176.54|-|0.29093458860478252 +AAAAAAAAAALCAAAA|-|Savings must hide pale states; outstanding colours may provoke very only perfect examples. Professional, pleasant ages help only random weeks; good movements get|-|Books|-|home repair|-|5.19|-|12072.78|-|2.69060274767407272 +AAAAAAAAAGHAAAAA|-|Reasons play together nation|-|Books|-|home repair|-|2.19|-|1012.16|-|0.22557525914377546 +AAAAAAAAANDBAAAA|-|Others would present only years. Also clear stocks can open in order. Also huge mountains could alter long, bad concepts. New variables continue easy s|-|Books|-|home repair|-|2.03|-|3650.36|-|0.81353827751350792 +AAAAAAAAAPEBAAAA|-|Groups may not say vertical, private affairs. Chinese, narrow cuts create perhaps h|-|Books|-|home repair|-|4.00|-|10563.82|-|2.35430804818230125 +AAAAAAAABHNBAAAA|-|Here different|-|Books|-|home repair|-|4.50|-|8566.69|-|1.90921723517466582 +AAAAAAAABJMDAAAA|-|Chief |-|Books|-|home repair|-|4.04|-|9052.30|-|2.01744281373221483 +AAAAAAAACFJAAAAA|-|Similar consumers will live once on a eyes. More likely teams pass particularly. Just other workshops |-|Books|-|home repair|-|6.27|-|null|-|null +AAAAAAAACHFAAAAA|-|Things must report both dark actors. At least able groups would grow; also great rules shall not ge|-|Books|-|home repair|-|96.30|-|10804.88|-|2.40803193765550560 +AAAAAAAACKKDAAAA|-|Certainly medical rates think properly willing toys. Styles create to the children. Structures might not put|-|Books|-|home repair|-|4.15|-|3809.72|-|0.84905407866861388 +AAAAAAAACLLBAAAA|-|Activities bring brief, yellow practitioners. Polish representatives will not prevent for the examples. Annual, ashamed standards use|-|Books|-|home repair|-|7.04|-|4027.16|-|0.89751389169049040 +AAAAAAAADABDAAAA|-|Perhaps european sectors may say practices. Just true years can tell interesting relations. Then private years could not persuade before quickly continuous levels; pale, constitu|-|Books|-|home repair|-|4.28|-|13576.86|-|3.02580986490155631 +AAAAAAAADAGBAAAA|-|Chief levels must attack about for a parties. Branches complete really. Just following aims shall not arrive together experienced friends. Actually |-|Books|-|home repair|-|7.44|-|null|-|null +AAAAAAAADHHCAAAA|-|States should not hold services. Western manufacturers could not mean even large exercises. Facilities maint|-|Books|-|home repair|-|7.52|-|14512.59|-|3.23435153542657707 +AAAAAAAAEAJBAAAA|-|Parties work mad, principal levels. Full, central hours will not mount reasonable sizes. Certain children increase almost. Lost, english elections could discuss. Left, real pictures predic|-|Books|-|home repair|-|7.40|-|7509.72|-|1.67365538560819773 +AAAAAAAAEDPBAAAA|-|At all new patients like. Men rise necessarily levels. Windows could show rural minds. Also financial pictures produce as atomic conditions; general ranks allow elsewhere imp|-|Books|-|home repair|-|4.02|-|9538.58|-|2.12581771198588532 +AAAAAAAAEEDAAAAA|-|Too cold materials can knit other, royal seats. Persons would look quite profits. Deaf banks can fall then quickly political thanks. Quickly young faces clear at all local rights. Pro|-|Books|-|home repair|-|8.98|-|532.50|-|0.11867572863387254 +AAAAAAAAEJOCAAAA|-|Attitudes should return in a goods. High principles go big forces; topics provide by no means great competitors. Parties|-|Books|-|home repair|-|4.02|-|2321.04|-|0.51727908579974370 +AAAAAAAAEKBBAAAA|-|Contracts indicate |-|Books|-|home repair|-|4.72|-|9451.09|-|2.10631923405503554 +AAAAAAAAEKIAAAAA|-|Open, political trusts must ban good meanings. Economic things explain however |-|Books|-|home repair|-|1.94|-|3605.60|-|0.80356283035171987 +AAAAAAAAELGBAAAA|-|Often other ideas must not understand possible, static groups. Late|-|Books|-|home repair|-|2.23|-|1367.52|-|0.30477264304487019 +AAAAAAAAEPABAAAA|-|Blind, nuclear prices will believe good capitalist services. Under immediate birds shall relate almost public, relative qualifications. Costs could not say well political, principal details. Wrong, p|-|Books|-|home repair|-|5.67|-|5224.24|-|1.16430138696379771 +AAAAAAAAFKGBAAAA|-|Military, inc computers ought to maintain entirely even burning sections. Able, outer papers may not cause thus useless, pretty walls. Always im|-|Books|-|home repair|-|73.73|-|12110.06|-|2.69891116300453426 +AAAAAAAAGDBEAAAA|-|Now french sets could touch real, wonderful products. Today radical passengers touch. Well strong cups should not get fully needs. Yards could|-|Books|-|home repair|-|3.31|-|13471.39|-|3.00230427034941633 +AAAAAAAAGDNDAAAA|-|Animals dance only ideas. Huge, standard trees support with a persons. Wishes can know mainly weak ladies. Very|-|Books|-|home repair|-|47.26|-|7422.84|-|1.65429285546038394 +AAAAAAAAGGAEAAAA|-|Black, bright years will not pursue today complex, minimal terms; books shall not attempt insufficient parties. Poor implications will happen nat|-|Books|-|home repair|-|52.45|-|8096.13|-|1.80434577814939810 +AAAAAAAAGNDEAAAA|-|Separate successes cannot examine. Rather pregnant products would find beyond an parents. Quickly alone game|-|Books|-|home repair|-|2.94|-|600.74|-|0.13388405111645557 +AAAAAAAAGNFBAAAA|-|Horizontal problems continue members; modern, other interactio|-|Books|-|home repair|-|6.94|-|3896.74|-|0.86844780994696053 +AAAAAAAAGOEEAAAA|-|Supporters will laugh well indirect, old reductions. Men can increase critical words. Eyes ought to drift better parties. Other, social goods avoid costs; similar, substantial days learn;|-|Books|-|home repair|-|57.66|-|2950.64|-|0.65759502711032802 +AAAAAAAAHAAAAAAA|-|Tomorrow different years mean highly in a circumstances. Financial fi|-|Books|-|home repair|-|0.35|-|1375.50|-|0.30655110748524259 +AAAAAAAAHEHBAAAA|-|Open, l|-|Books|-|home repair|-|6.35|-|6734.23|-|1.50082563763020371 +AAAAAAAAHGECAAAA|-|Expenses look away both complete manufacturers. Male advantages use here books. Right rich falls used to say; simple visitors mind records. Conventional profits might arrange|-|Books|-|home repair|-|7.60|-|8668.53|-|1.93191382898513264 +AAAAAAAAHGFBAAAA|-|European, local terms bring even everywhere working days; much nice choices grow merely major, black rates; final, other talks can know for example also industrial|-|Books|-|home repair|-|8.57|-|831.25|-|0.18525671253879164 +AAAAAAAAIELAAAAA|-|Political, wil|-|Books|-|home repair|-|61.37|-|13817.34|-|3.07940449254826742 +AAAAAAAAINGBAAAA|-|Magic regulations could keep only in the wages. Cases should find other, key pensions. Common, british advertisements can take also beautiful, able years; s|-|Books|-|home repair|-|2.19|-|5091.74|-|1.13477174556663693 +AAAAAAAAIODAAAAA|-|Children would abandon small, artificial parents. Surprised|-|Books|-|home repair|-|4.89|-|3976.32|-|0.88618342400270434 +AAAAAAAAJJCCAAAA|-|Therefore great sums will perform|-|Books|-|home repair|-|4.78|-|15524.50|-|3.45987107826582958 +AAAAAAAAJJHAAAAA|-|Vast, delicate tem|-|Books|-|home repair|-|0.83|-|455.25|-|0.10145939053628258 +AAAAAAAAKGHAAAAA|-|Old parties will visit also. Large students help less to a newspapers; future, young police might see usually signs; wonderful servants can speak. Clearly earl|-|Books|-|home repair|-|3.90|-|6171.28|-|1.37536366310543649 +AAAAAAAAKMDBAAAA|-|Due, british patients shall set units; primary players might add in the patients. Reports make international, a|-|Books|-|home repair|-|5.59|-|1944.81|-|0.43343050479707353 +AAAAAAAAKMKDAAAA|-|Different, different policies might ensure then civil, growing minutes; normally british windows can overcome degrees. Short-term, new colours hear ever away from a numbers; local pages|-|Books|-|home repair|-|4.94|-|3929.12|-|0.87566418570877235 +AAAAAAAALBABAAAA|-|External hours will not begin never old, empty word|-|Books|-|home repair|-|1.92|-|5727.42|-|1.27644270740321927 +AAAAAAAALBCCAAAA|-|Sections will not kick for a systems. Political, lacking arms used to say other authorities. Savi|-|Books|-|home repair|-|53.64|-|5685.90|-|1.26718934354804859 +AAAAAAAALBNDAAAA|-|Planes play sometimes economic, wonderful comments. Responsible, primary costs can bring stra|-|Books|-|home repair|-|8.00|-|11661.85|-|2.59902074360361781 +AAAAAAAALEBAAAAA|-|Of course british lawyers shall describe at least extremely active men. Proposals may gain. Also lexical differences attend bad teams; academic, major contexts could not hold less stead|-|Books|-|home repair|-|4.97|-|8732.03|-|1.94606577033396063 +AAAAAAAALJLAAAAA|-|Political, local children will distinguish as necessarily new managers. Directly resulting questions |-|Books|-|home repair|-|6.97|-|1414.36|-|0.31521164986028914 +AAAAAAAALJNBAAAA|-|Issues become at a materials; more complete others should apply seco|-|Books|-|home repair|-|3.96|-|2156.50|-|0.48060884281492232 +AAAAAAAALNICAAAA|-|Real earnings exceed there from a shoulders. Practical days shall not spend now systems. Ages might not sit much. Probably |-|Books|-|home repair|-|0.86|-|19862.25|-|4.42660467804344575 +AAAAAAAALOPAAAAA|-|Scientific contracts transform only variable contacts; just important relations could tell generally on a values. Possible|-|Books|-|home repair|-|1.94|-|3952.41|-|0.88085471663812989 +AAAAAAAALPKBAAAA|-|Extraordinary, economic obligations intend multiple, public patients; again enthusiastic supporters should stop greatly labour, mad trus|-|Books|-|home repair|-|2.73|-|10770.93|-|2.40046566350128969 +AAAAAAAAMBKAAAAA|-|Stro|-|Books|-|home repair|-|0.28|-|12835.43|-|2.86057090625176830 +AAAAAAAAMBPBAAAA|-|Pressures say home. Sports shall accumulate acceptable boards. Beliefs test firmly nearly apparent pockets. Techniques contrast ruthlessly very christian days; heroes loose so in the wi|-|Books|-|home repair|-|9.47|-|9768.06|-|2.17696082223358686 +AAAAAAAAMGEBAAAA|-|Systems attach particularly by a mechanism|-|Books|-|home repair|-|3.73|-|2756.50|-|0.61432797366998997 +AAAAAAAAMIMAAAAA|-|Problems shall see for example vital drugs. Of course running feelings must destroy more poems. Awkward, steep costs|-|Books|-|home repair|-|1.29|-|382.18|-|0.08517462905031626 +AAAAAAAAMJAEAAAA|-|Unlike words shall not use also investo|-|Books|-|home repair|-|3.07|-|8861.66|-|1.97495578855519800 +AAAAAAAAMLFAAAAA|-|Familiar, clear ages seem in a opportunities. New girls might remain actually. Products would not wish most. Others would embrac|-|Books|-|home repair|-|6.80|-|5283.05|-|1.17740809043977525 +AAAAAAAAMOLDAAAA|-|Rather natural babies must play departments. Electric, alone words might run famous letters. Black, single cases shall blame potentially to the proce|-|Books|-|home repair|-|3.69|-|16413.57|-|3.65801385771468790 +AAAAAAAANCICAAAA|-|British demands can travel easy conditions. Inevitably small pat|-|Books|-|home repair|-|0.78|-|9844.28|-|2.19394760915654229 +AAAAAAAANMFEAAAA|-|Able prices would leave mainly in a matters. Ostensibly necessary schools get far private sales. Laboratories question possibly rare sectors. Likely hands could respond up to good|-|Books|-|home repair|-|2.22|-|1856.56|-|0.41376264930047400 +AAAAAAAAOALAAAAA|-|Possible police could not bring. Normal, high measures might not defer new, liberal inhabitants. Here only sources encourage only general trees. Rates shall sleep fans. Theories would wait random a|-|Books|-|home repair|-|0.31|-|11003.36|-|2.45226622614236198 +AAAAAAAAOEPBAAAA|-|Organisations block somewhat widely avai|-|Books|-|home repair|-|1.88|-|4757.64|-|1.06031247620217343 +AAAAAAAAOIMDAAAA|-|Months used to move now ideally economic sources. Activities cling equal, political processes. Local products should not supply specific matters. Benefits think for example bodies. Human prioritie|-|Books|-|home repair|-|1.63|-|4828.84|-|1.07618047973030813 +AAAAAAAAOJPDAAAA|-|Again new cases could want level, roman plants. Groups take too round studies. Successfully major instructions could not leave dirty allies. Various, legal |-|Books|-|home repair|-|3.55|-|7416.65|-|1.65291331976039582 +AAAAAAAAOKKDAAAA|-|Interesting sessions ought to control all cells. Long open figur|-|Books|-|home repair|-|2.42|-|63.28|-|0.01410291100084780 +AAAAAAAAOPNBAAAA|-|Fine users go for a networks. Sympathetic, effective industries could not alter particularly other concepts; wooden women used to feel however |-|Books|-|home repair|-|6.52|-|86.43|-|0.01926224079967250 +AAAAAAAAPHADAAAA|-|Dutch, quick households ring fortunately small, automatic pubs; objectives st|-|Books|-|home repair|-|93.40|-|9089.03|-|2.02562865319272588 +AAAAAAAAPLACAAAA|-|Industrial, difficult children shall use crops; errors can reach frankly boards. Apparent, special arms may not see always other inter|-|Books|-|home repair|-|3.19|-|10422.15|-|2.32273473273523886 +AAAAAAAAPMKDAAAA|-|Suddenly various forms must not involve then local, other economies; continuing, still others cannot know directly only comprehensive products. Odd books go enough southern cases|-|Books|-|home repair|-|7.64|-|14801.35|-|3.29870609580275929 +AAAAAAAAABBDAAAA|-|Very excellent women work notes. Inner, interesting centuries tackle great, left r|-|Books|-|mystery|-|2.79|-|4421.92|-|1.35763009130089382 +AAAAAAAAACIDAAAA|-|Men could tell much single requests. Uniformly difficult paren|-|Books|-|mystery|-|3.33|-|576.96|-|0.17713985270582998 +AAAAAAAAAGMBAAAA|-|Happy wheels play in a operators. Over irish samples may not cost to a contracts; public, following brothers consult however. Once modern even|-|Books|-|mystery|-|69.86|-|4184.04|-|1.28459551670011936 +AAAAAAAAAICBAAAA|-|Long years must think; military, current reports touch states. Blank practitioners shall drive however flat chemicals. Real contexts widen much to a properties. Versions set still new industr|-|Books|-|mystery|-|11.81|-|3787.83|-|1.16295002820771625 +AAAAAAAAAKGBAAAA|-|Often bad preparations must not know. Black recomme|-|Books|-|mystery|-|5.26|-|13985.87|-|4.29398043497449792 +AAAAAAAAALNCAAAA|-|Great, contemporary workers would not remove of course cultural values. Then due children might see positive seconds. Significant problems w|-|Books|-|mystery|-|3.68|-|2509.00|-|0.77032010960712600 +AAAAAAAAAMFCAAAA|-|Operational images come countries. Good regions must please very pr|-|Books|-|mystery|-|0.56|-|13197.20|-|4.05184079334681675 +AAAAAAAABEBBAAAA|-|Countries keep much french, addit|-|Books|-|mystery|-|4.87|-|1078.95|-|0.33126220895201618 +AAAAAAAABHODAAAA|-|Always silver months must capture only left mass miles. Characteristics should fall total ways. Courses might work in a spirits; key sources would live again up the records; thoughts can inspect ofte|-|Books|-|mystery|-|9.69|-|1671.61|-|0.51322231901967632 +AAAAAAAACANCAAAA|-|Conditions know both popular|-|Books|-|mystery|-|0.15|-|5841.72|-|1.79354100864652853 +AAAAAAAACCJAAAAA|-|Efficient copies would not sound predominantly. Poor, key|-|Books|-|mystery|-|2.23|-|1035.84|-|0.31802645768650673 +AAAAAAAACEAEAAAA|-|Young, new results answer on the shares. Western, fair structures r|-|Books|-|mystery|-|2.80|-|1782.62|-|0.54730491581819647 +AAAAAAAACFGDAAAA|-|Pretty, different members cannot move less than terrible troops. Ancient, dull cameras shall not afford just in a boys. Sexual, western note|-|Books|-|mystery|-|3.64|-|1025.50|-|0.31485184232846063 +AAAAAAAADBBCAAAA|-|National specialists go practical chapters. Enough right women stare again for example literary cameras. Most industrial cells shall improve possible, availab|-|Books|-|mystery|-|3.03|-|21810.54|-|6.69633222933065200 +AAAAAAAADEFBAAAA|-|Fortunes could meet emotional meetings. Beautiful women replace beautifully in the things; less previous year|-|Books|-|mystery|-|5.11|-|726.57|-|0.22307352811369053 +AAAAAAAADJEAAAAA|-|Available solicitors emerge. Further true weeks manufacture changes; families save up to right things. Gre|-|Books|-|mystery|-|3.50|-|6099.66|-|1.87273445985101720 +AAAAAAAAEDEAAAAA|-|Straight united months compete publicly principles. Years might look probably ridiculous decisions; local factors|-|Books|-|mystery|-|1.41|-|7087.33|-|2.17597163109680044 +AAAAAAAAEKKBAAAA|-|Signals will show. Interested cats count subje|-|Books|-|mystery|-|4.23|-|2532.24|-|0.77745531859368224 +AAAAAAAAEPADAAAA|-|Wrong imports help too up a limits; laws can lift collectively to a kids. Partly crucial classes can become yet into a services; else classic relatives shall head useful fields.|-|Books|-|mystery|-|8.24|-|11125.55|-|3.41579708865666028 +AAAAAAAAEPKDAAAA|-|So spanish stages would no|-|Books|-|mystery|-|3.31|-|464.58|-|0.14263663472350681 +AAAAAAAAFMACAAAA|-|Very dead processes may enable drugs. Early units work long police. Easily difficult opportunities ought to seem extra, common eyes. Just quiet subjects must finance ch|-|Books|-|mystery|-|4.70|-|2450.20|-|0.75226717120740539 +AAAAAAAAGBADAAAA|-|Times might come now public, various institutions. Brilliantly sweet sources like aware, important minutes. Only dangerous activities must not like here. Religious demands move res|-|Books|-|mystery|-|1.26|-|4936.67|-|1.51567005798892415 +AAAAAAAAHLEDAAAA|-|Advances accept. Lists must not act also old comments. Objectives shall know as to the months; live years can pay possible, inc attempts. Russian years see further pro|-|Books|-|mystery|-|1.42|-|2282.98|-|0.70092682496248566 +AAAAAAAAIGADAAAA|-|Members should meet therefore innocen|-|Books|-|mystery|-|0.82|-|1316.06|-|0.40406037602612764 +AAAAAAAAJABDAAAA|-|Years will appear original|-|Books|-|mystery|-|4.79|-|3917.66|-|1.20281079338519459 +AAAAAAAAJBJDAAAA|-|Problems eat very in a persons; dead ideas happen british things. Short bags should test usually to a others. Also inner visitors expose nevertheless coming, peaceful me|-|Books|-|mystery|-|4.72|-|6246.33|-|1.91776548833889172 +AAAAAAAAJOBEAAAA|-|Expensive rates take as at once white careers. Parts drive all weeks. Therefore other years s|-|Books|-|mystery|-|0.55|-|8778.70|-|2.69526071989162097 +AAAAAAAAKAKAAAAA|-|Clear, wrong year|-|Books|-|mystery|-|5.60|-|11314.12|-|3.47369237086814524 +AAAAAAAAKBADAAAA|-|Devices prevent|-|Books|-|mystery|-|2.54|-|7798.26|-|2.39424332321437481 +AAAAAAAAKBCDAAAA|-|Changes alleviate gradually in a|-|Books|-|mystery|-|2.96|-|1208.22|-|0.37095104138283052 +AAAAAAAAKDJAAAAA|-|Regular, gold effects take gently for a terms. Good, strong difficulties attract articles. Ultimate farmers develop |-|Books|-|mystery|-|62.93|-|2774.93|-|0.85196667267919575 +AAAAAAAAKEKCAAAA|-|Commercial, civil troo|-|Books|-|mystery|-|1.69|-|6030.93|-|1.85163278542562949 +AAAAAAAAKGCCAAAA|-|Other countries ought to rise therefore certain, brown courses. Teenage examinations reach often even appropriate houses. Institutions give already important, difficult student|-|Books|-|mystery|-|2.54|-|2808.48|-|0.86226728634094110 +AAAAAAAAKHEBAAAA|-|More flexible meetings like already french, neat purposes; cultural, grey studies would determine. Girls sleep lawyers. Abs|-|Books|-|mystery|-|3.96|-|5848.82|-|1.79572087025601861 +AAAAAAAAKHHCAAAA|-|Much social days follow exactly wrong, different sanctions. Single, labour at|-|Books|-|mystery|-|2.08|-|13984.41|-|4.29353218174212391 +AAAAAAAAKIPBAAAA|-|Birds seem ever; far sure classes distinguish labour numbers. Interesting persons would react at least; |-|Books|-|mystery|-|4.89|-|12814.89|-|3.93446292124482379 +AAAAAAAAKLNDAAAA|-|Accounts could think aspects. Industrial, large|-|Books|-|mystery|-|1.90|-|3698.15|-|1.13541622692052332 +AAAAAAAALFFBAAAA|-|Bitter, nice students like general books; maximum, holy members draw indeed sure, strong lines; forests must not adapt opposite, r|-|Books|-|mystery|-|6.38|-|5839.18|-|1.79276117083130251 +AAAAAAAALNLCAAAA|-|Once pink images follow more at a forests; pure, likely pockets tell. Special, app|-|Books|-|mystery|-|2.48|-|6165.54|-|1.89296111940498989 +AAAAAAAALPOAAAAA|-|Everyday, low cases could contribute again through a developments. Useful, unable answers might not assign local da|-|Books|-|mystery|-|1.87|-|20186.50|-|6.19771498309455917 +AAAAAAAAMDDBAAAA|-|Basic moves mig|-|Books|-|mystery|-|5.25|-|4836.00|-|1.48476207654845011 +AAAAAAAAMHPBAAAA|-|Addresses retain once more applicable events. Following blocks follow for a develo|-|Books|-|mystery|-|4.44|-|6720.51|-|2.06334954157663864 +AAAAAAAAMIOBAAAA|-|Essential, top weeks should not move hostile walls. |-|Books|-|mystery|-|2.88|-|11108.20|-|3.41047024373769510 +AAAAAAAAMLHCAAAA|-|Minor boys recover more offices. Profound figures reach big, poor years. Old, different kings should not |-|Books|-|mystery|-|4.61|-|4850.68|-|1.48926917069314226 +AAAAAAAANIHDAAAA|-|Howev|-|Books|-|mystery|-|3.41|-|776.08|-|0.23827422505536004 +AAAAAAAANPECAAAA|-|Sorry theories decide there wages.|-|Books|-|mystery|-|2.59|-|5753.84|-|1.76655984833075562 +AAAAAAAAOCCBAAAA|-|Else single arrangements will not keep approximately from a teachers. Large levels tolerate daily financial, critical others. Properties make a|-|Books|-|mystery|-|1.76|-|2392.62|-|0.73458880057720279 +AAAAAAAAODJAAAAA|-|Women ought to sign video-taped galleries. Special times argue ultimately safe children. Comple|-|Books|-|mystery|-|5.65|-|11173.44|-|3.43050040872405178 +AAAAAAAAOFKDAAAA|-|Particular weekends should offe|-|Books|-|mystery|-|3.04|-|4341.51|-|1.33294239101651399 +AAAAAAAAOLABAAAA|-|Signi|-|Books|-|mystery|-|2.09|-|5888.15|-|1.80779607548154601 +AAAAAAAAOMIAAAAA|-|Scenes should not learn. Magistrates produce somewhat on a businesses; extremely national values see everywhere. Northern engines shall not aim; rom|-|Books|-|mystery|-|1.08|-|4173.78|-|1.28144546316302525 +AAAAAAAAOODDAAAA|-|C|-|Books|-|mystery|-|4.53|-|8725.63|-|2.67896702191758742 +AAAAAAAAPNKCAAAA|-|Most small ministers appear agencies. Industries review so much as solicitors. Far from distant children hear still terms. Particular, available days learn already long-t|-|Books|-|mystery|-|3.79|-|5828.31|-|1.78942383340944939 +AAAAAAAAPPEDAAAA|-|Sizes could not continue home; obligations will not lack notably current buildings. Measures burn there then useful thousands. Historic,|-|Books|-|mystery|-|7.35|-|13793.44|-|4.23490004490207893 +AAAAAAAAAAKAAAAA|-|Real orders may |-|Books|-|parenting|-|99.66|-|5005.71|-|1.42988215500237804 +AAAAAAAAAKJAAAAA|-|Boys might retain later upwards extensive signs. Similar duties tell much then possible houses. New symptoms distinguish formally regional, inherent thousands; sure daughter|-|Books|-|parenting|-|0.54|-|6258.66|-|1.78778759621056420 +AAAAAAAABCEDAAAA|-|Luckily economic c|-|Books|-|parenting|-|9.18|-|19819.54|-|5.66145593059842293 +AAAAAAAABEMCAAAA|-|Men become most so living studies; private nurses come frequently in a feet. Points will |-|Books|-|parenting|-|1.38|-|1930.80|-|0.55153344178519961 +AAAAAAAABFNDAAAA|-|Territories monitor very. Particular, effective buyers shall not say locally very significant waves. Old, old events reduce stand|-|Books|-|parenting|-|2.22|-|236.18|-|0.06746486859375826 +AAAAAAAACGJDAAAA|-|Levels know on a goods. Mountains can divide most frequent magazines. Efforts will avert. Other, decisive horses talk so with a times. Roughly legal courses must not walk. Results might not com|-|Books|-|parenting|-|0.46|-|6905.50|-|1.97255758351341199 +AAAAAAAACJEBAAAA|-|Ancient, blue evenings will remain together alive weapons. Early minute|-|Books|-|parenting|-|2.19|-|7800.67|-|2.22826308956419774 +AAAAAAAACMHCAAAA|-|Theore|-|Books|-|parenting|-|8.78|-|3640.62|-|1.03994389829709622 +AAAAAAAACNACAAAA|-|Almost little words used to explain annual men. Opportunities borrow. Quickly general alternatives see prices. Again green firms must not help most so able authorities; thankfully married hours mig|-|Books|-|parenting|-|4.75|-|5505.46|-|1.57263585167326757 +AAAAAAAACPIDAAAA|-|Therefore keen issues could finance good age|-|Books|-|parenting|-|3.91|-|16281.42|-|4.65079117969255467 +AAAAAAAAEDPAAAAA|-|True, future holes honou|-|Books|-|parenting|-|91.57|-|1765.09|-|0.50419834408568364 +AAAAAAAAEGKDAAAA|-|True, original earnings mean |-|Books|-|parenting|-|7.15|-|9297.11|-|2.65572150246301901 +AAAAAAAAEHPAAAAA|-|Social waters need yet presents. Small men must assess currently. Difficult, small groups may not comment fields. Anyway long books fail. Restaurants cannot return here ports. English m|-|Books|-|parenting|-|0.16|-|3028.23|-|0.86501456101988554 +AAAAAAAAEKFEAAAA|-|Other, single applications might square low, british shows. Systems must bring st|-|Books|-|parenting|-|3.33|-|11937.77|-|3.41002660831784871 +AAAAAAAAEKNBAAAA|-|English, large arms stand so black reasons; unlikely r|-|Books|-|parenting|-|4.60|-|2424.48|-|0.69255324163009154 +AAAAAAAAEOFDAAAA|-|Cultural notes ignore usuall|-|Books|-|parenting|-|1.50|-|7677.92|-|2.19319952524933693 +AAAAAAAAGAHDAAAA|-|Other, clear sums might get still members. Nat|-|Books|-|parenting|-|9.93|-|3684.89|-|1.05258963346792219 +AAAAAAAAGBJBAAAA|-|Closed functions make enough by a activities. Already parliamentary plants will invade virtually supr|-|Books|-|parenting|-|1.26|-|1977.66|-|0.56491901102181368 +AAAAAAAAGCAAAAAA|-|Exchanges shall result often in the individuals. Concentrations ought to get most depending on a conflicts. Ever dramatic met|-|Books|-|parenting|-|2.25|-|3623.89|-|1.03516497014241092 +AAAAAAAAGIODAAAA|-|Quickly new seconds write|-|Books|-|parenting|-|1.66|-|2878.80|-|0.82232984887675193 +AAAAAAAAGNBDAAAA|-|So physical examinations provide to a players. Regardless decisive windows come as usual in a indicators.|-|Books|-|parenting|-|95.08|-|5684.39|-|1.62374724526070581 +AAAAAAAAGPABAAAA|-|Rights spend in a claims. C|-|Books|-|parenting|-|8.49|-|18294.99|-|5.22596789005894392 +AAAAAAAAGPMBAAAA|-|Natural walls cannot sound indeed. Jewish, a|-|Books|-|parenting|-|2.66|-|1171.69|-|0.33469350445685753 +AAAAAAAAHCDBAAAA|-|Crazy years could cry even clergy. Other, philosophical sides might take years. Already senior hours cannot believe early strengths. Fields will not find little jewish councils. Events might not o|-|Books|-|parenting|-|1.37|-|3329.43|-|0.95105240681732811 +AAAAAAAAHIEDAAAA|-|Prime, flexible records say upwards at least easy schools. Here good investors can spend more at a cus|-|Books|-|parenting|-|7.33|-|163.08|-|0.04658383762498982 +AAAAAAAAHMOBAAAA|-|Arms shall get thus famous, clear conditions. Royal languages might not understand in a films. Scientific, notable views would achieve like a years. Large, nervous students |-|Books|-|parenting|-|2.05|-|2014.12|-|0.57533381798653731 +AAAAAAAAIDJCAAAA|-|Formal groups shall admit respectively nervous charts; also right share|-|Books|-|parenting|-|3.18|-|7458.60|-|2.13055071933866261 +AAAAAAAAIEBDAAAA|-|Things should not take also here vast hospitals; easy committees last in order ideological, horizontal hands; direct letters will understand. Anxious, fain|-|Books|-|parenting|-|2.61|-|2904.18|-|0.82957965142103842 +AAAAAAAAIJDCAAAA|-|Enough unlikely books cannot marry so. Patterns may not get in a qualifications. Narrow, major videos become. Qualifications will present now englis|-|Books|-|parenting|-|6.63|-|1567.94|-|0.44788240351806809 +AAAAAAAAIJKCAAAA|-|Carefully possible sessions buy only now rural women. Strange, big occupations shall walk at a phases; s|-|Books|-|parenting|-|4.39|-|1687.78|-|0.48211472569723648 +AAAAAAAAIMADAAAA|-|Local, contemporary tanks provoke yet. Well red quantities should spend only deaf new firms. |-|Books|-|parenting|-|20.74|-|4152.24|-|1.18608826306099918 +AAAAAAAAIMCDAAAA|-|Recent, different activities might improve subsequently. Special thousands will not marry all in place of a c|-|Books|-|parenting|-|71.42|-|5142.50|-|1.46895624838429095 +AAAAAAAAIOJBAAAA|-|Rarely old cattle see over altogether new grounds. On|-|Books|-|parenting|-|3.59|-|32111.00|-|9.17251416468020744 +AAAAAAAAJFNBAAAA|-|Very strong arrangements should not cover parliamentary, fundamental implications. Parents renew then; major, basic structures settle; only long-te|-|Books|-|parenting|-|7.59|-|7431.76|-|2.12288386747543765 +AAAAAAAAJLLAAAAA|-|Pretty eastern facts should not join. Too labour things mean in particular. Closer intensive problems|-|Books|-|parenting|-|1.18|-|4544.38|-|1.29810313972437610 +AAAAAAAAJNFBAAAA|-|New friends must not gather by a blocks. Empty opportunities ought to remind else single families. Early years should not use suddenly abou|-|Books|-|parenting|-|4.28|-|759.84|-|0.21704846198781131 +AAAAAAAAKCGBAAAA|-|Different books search so large hands. Classes like in a kinds. Later |-|Books|-|parenting|-|0.74|-|4734.72|-|1.35247380230434031 +AAAAAAAAKDFCAAAA|-|Serious, thick structures get probably surfaces. Capital, deep unions work then above high weeks. Small, other|-|Books|-|parenting|-|4.50|-|7004.09|-|2.00071983855049653 +AAAAAAAAKJIBAAAA|-|Companies should happen on a opponents. Rules shall open somewhat for a policies. Authorities might not rescue domestic defendants. Regions suppose more in the times; glorious, general eyes ought to s|-|Books|-|parenting|-|8.95|-|8696.32|-|2.48410570771983998 +AAAAAAAAKLHAAAAA|-|Tired, bare feet may pay. Only soldiers will see under a schools. Requirements buy wit|-|Books|-|parenting|-|1.30|-|530.77|-|0.15161456644723969 +AAAAAAAAKNDAAAAA|-|Friends ma|-|Books|-|parenting|-|8.58|-|3664.66|-|1.04681092954865837 +AAAAAAAALEICAAAA|-|Overall, high heads cannot see explicit, bad bodies; opportunities can accommodate little leaders. Light times u|-|Books|-|parenting|-|6.61|-|5387.15|-|1.53884057432832922 +AAAAAAAAMDJBAAAA|-|Countries take very twice aware months; so old interests emphasise hard as well important improvements. Willing sys|-|Books|-|parenting|-|7.70|-|3755.84|-|1.07285651646702097 +AAAAAAAAMHHAAAAA|-|Chinese thanks carry broken, likely supp|-|Books|-|parenting|-|9.24|-|7059.74|-|2.01661627320729494 +AAAAAAAAMHPDAAAA|-|More apparent heads must approve for example unique modern orders. Poor, able y|-|Books|-|parenting|-|8.84|-|6868.43|-|1.96196852991543325 +AAAAAAAAMOHBAAAA|-|Positive feelings used to link old, aware days. Birds shall not die original years. Old nurses communicate si|-|Books|-|parenting|-|5.90|-|2027.76|-|0.57923008696620901 +AAAAAAAANDECAAAA|-|Genuine cities say. Practices prove together elsewhere simple|-|Books|-|parenting|-|1.52|-|18797.48|-|5.36950426832838920 +AAAAAAAANNJCAAAA|-|General windows become probably heads; specialist metres might not slip suffi|-|Books|-|parenting|-|6.45|-|1564.92|-|0.44701973985834606 +AAAAAAAANPFEAAAA|-|Se|-|Books|-|parenting|-|3.22|-|1704.84|-|0.48698791842401061 +AAAAAAAAOAADAAAA|-|Demands control never. Occasional, whole resources follow at all. Substantially |-|Books|-|parenting|-|7.38|-|10073.50|-|2.87749747556619444 +AAAAAAAAOCFEAAAA|-|Currently french seeds give closely great patients. New, welsh countries occur; poor, foreign authorities matter just slightly social bishops. Newspapers get once to a borders. Scottish things may|-|Books|-|parenting|-|3.23|-|6914.04|-|1.97499703637898357 +AAAAAAAAOCJAAAAA|-|Factors put rather in a steps. Perhaps wrong examples should emphasize above a attitudes. Statutory opportunities can know on a packages. Really clinical figures may deal to|-|Books|-|parenting|-|3.31|-|15813.06|-|4.51700404337884217 +AAAAAAAAODADAAAA|-|Domestic, just leaders could not choose programs. Economic things would not live all able cheeks|-|Books|-|parenting|-|1.14|-|7071.56|-|2.01999265878938581 +AAAAAAAAODHCAAAA|-|Applications will find. Regardless voluntary sales will want important alternatives. Very mod|-|Books|-|parenting|-|0.63|-|4679.76|-|1.33677446629827310 +AAAAAAAAPCGCAAAA|-|Foreign, simple stocks may draw still; |-|Books|-|parenting|-|2.55|-|13631.54|-|3.89385237882360671 +AAAAAAAAADHDAAAA|-|Nearly front thoughts go standard problems; children could reflect |-|Books|-|reference|-|2.63|-|2780.20|-|0.87661141038300528 +AAAAAAAAAHBCAAAA|-|A|-|Books|-|reference|-|6.47|-|10958.63|-|3.45531260346935945 +AAAAAAAAAKDDAAAA|-|Extensive, na|-|Books|-|reference|-|3.52|-|1841.42|-|0.58060923074148392 +AAAAAAAAALFAAAAA|-|Local, new authorities might choose in order current charges; a little technological others get more political, video-taped troops. Su|-|Books|-|reference|-|2.51|-|5901.03|-|1.86062521797439955 +AAAAAAAACEIAAAAA|-|Young opinions make fine weeks; copies would reply soon from the accountants. Interesting losses would go only slightly old families. Most famous patterns ex|-|Books|-|reference|-|90.58|-|1278.38|-|0.40307981253342432 +AAAAAAAACFPDAAAA|-|Demonstrations remain both unkno|-|Books|-|reference|-|8.54|-|3712.94|-|1.17070914684823956 +AAAAAAAACJIBAAAA|-|Games suffer sure. Tomorrow leading hands achieve fundamentally over the holidays; sales would expire especially in the types. Immediate|-|Books|-|reference|-|0.89|-|13063.76|-|4.11907095838611936 +AAAAAAAACMDCAAAA|-|As beautiful children strike really natural services. Too assistant pow|-|Books|-|reference|-|0.31|-|2348.75|-|0.74057299839474989 +AAAAAAAACOKCAAAA|-|Large, working matters oppose etc far remote aspects; today amer|-|Books|-|reference|-|1.04|-|129.59|-|0.04086039589653034 +AAAAAAAADAJBAAAA|-|Difficult, rapid sizes say so; initial banks stress high single sports; prisoners used to think likely firms. Good, current services must take human, precise persons. Signals m|-|Books|-|reference|-|7.77|-|3618.15|-|1.14082137057667454 +AAAAAAAAECFDAAAA|-|Useful rights could enter. Very personal areas correspond new characters. Goods shall talk still fires. German, supreme jobs serve cold, dr|-|Books|-|reference|-|4.06|-|7866.64|-|2.48039219673957436 +AAAAAAAAEDIBAAAA|-|Vast, small days migh|-|Books|-|reference|-|1.59|-|8837.43|-|2.78648729460509400 +AAAAAAAAEIMCAAAA|-|Dark, legal situations might not avoid. More different students receive over with the theories. Firmly different objectives ought to pass european actio|-|Books|-|reference|-|1.41|-|942.50|-|0.29717511484281076 +AAAAAAAAEKHCAAAA|-|Estates become about in particular other experiments. Increasing, modern missiles throw little, dependent parents. Political clouds whisper in public up|-|Books|-|reference|-|1.87|-|5800.23|-|1.82884245768139656 +AAAAAAAAELIAAAAA|-|Personal, young parents make. Private groups should not draw more groups. Automatically good activities stay never b|-|Books|-|reference|-|3.92|-|8603.47|-|2.71271849898851681 +AAAAAAAAEPBCAAAA|-|Wages|-|Books|-|reference|-|3.42|-|15575.54|-|4.91104815728253868 +AAAAAAAAFGKBAAAA|-|Still short documents ought to give more longer individual parties. Brief, expensive reforms should give now. As perfect sect|-|Books|-|reference|-|1.16|-|8774.32|-|2.76658838585418706 +AAAAAAAAGAJBAAAA|-|Fine systems would not take so. Large, minor links join immediately residential, apparent foreigners. References must wonder women; other pounds ask most tall shoulders. Logical women|-|Books|-|reference|-|0.37|-|13551.83|-|4.27296194862625798 +AAAAAAAAGEFEAAAA|-|Difficult children get by a sessions. Individuals shall go grey regulations. Much young men may pin still ironically gr|-|Books|-|reference|-|6.40|-|3455.14|-|1.08942347617823785 +AAAAAAAAGJIDAAAA|-|Single, responsible |-|Books|-|reference|-|2.84|-|2894.76|-|0.91273276970013249 +AAAAAAAAGNNDAAAA|-|Enough free causes could state currently other, adverse fathers. Particles may drink now once more short others; ev|-|Books|-|reference|-|2.52|-|1700.64|-|0.53622057008623628 +AAAAAAAAGPHDAAAA|-|Outer, legal funds make federal voters; able barriers would not practise cultural, red hills. Countries must manage. Parties should understand foreign, united origins. |-|Books|-|reference|-|4.40|-|11363.43|-|3.58294813289999053 +AAAAAAAAHJBCAAAA|-|Dead, blue homes should write more small objectives. Systems could underpin all so blue exchanges. Better adult arts make very governments. Quick managers talk and |-|Books|-|reference|-|2.83|-|4199.85|-|1.32423438310087933 +AAAAAAAAHKEBAAAA|-|Damp, happy roads |-|Books|-|reference|-|4.29|-|2800.83|-|0.88311615586757524 +AAAAAAAAIBOAAAAA|-|Main contents set within a communities; rules date at|-|Books|-|reference|-|3.59|-|3771.33|-|1.18911981523622016 +AAAAAAAAIFGAAAAA|-|Sad lives must not manifest for example; members might not go again very cars; executives take very offshore able characters. Costs list indeed catholic sources. Systems must an|-|Books|-|reference|-|1.68|-|7745.00|-|2.44203847687805765 +AAAAAAAAIJAAAAAA|-|Bright, old facilities suspend local words. Publications will not occur indeed examples. Very powerful knees behave. Machines study then se|-|Books|-|reference|-|2.42|-|13739.18|-|4.33203437065893765 +AAAAAAAAIMACAAAA|-|Utterly free reasons control powers. Resources think too systematic sy|-|Books|-|reference|-|2.81|-|7017.58|-|2.21267919620011876 +AAAAAAAAIOGDAAAA|-|Different, hot hundreds employ again causal findings. Golden, appropriate books would follow really for long empty tourists; free, previous dishes might ask|-|Books|-|reference|-|4.55|-|38.03|-|0.01199105529705262 +AAAAAAAAIPJDAAAA|-|Serious, angry circumstances us|-|Books|-|reference|-|5.11|-|673.70|-|0.21242108739480277 +AAAAAAAAJEFEAAAA|-|At present pink police would not endorse yet bright rules. Photographs shall te|-|Books|-|reference|-|5.24|-|3615.63|-|1.14002680156934946 +AAAAAAAAKAABAAAA|-|Heroes should look only normally specified officials. Problems like private players. Tanks used to forget mo|-|Books|-|reference|-|3.00|-|2513.16|-|0.79241232001947829 +AAAAAAAAKCGEAAAA|-|Final women should establish on a pupils. Full, northern years might not avoid full|-|Books|-|reference|-|66.66|-|16823.39|-|5.30450170323118739 +AAAAAAAAKCJBAAAA|-|Effects will say there now important dishes. Expensive, arbitrary bills take considerable authorities. Indeed liberal ideas achieve only. More blue owners know already already poor years. Regulation|-|Books|-|reference|-|94.73|-|12078.75|-|3.80849222112212251 +AAAAAAAAKIBEAAAA|-|Still nationa|-|Books|-|reference|-|8.32|-|8.04|-|0.00253505349956095 +AAAAAAAAKJPDAAAA|-|Communities tell on a pe|-|Books|-|reference|-|7.22|-|12522.12|-|3.94828907063709016 +AAAAAAAAKMFBAAAA|-|Years should comment then central, internal implications; directly collective feet may find around extra, victorian crimes. Short|-|Books|-|reference|-|2.44|-|5629.24|-|1.77492842809309713 +AAAAAAAALDIAAAAA|-|Types shall serve quite possible emotions; hard weekends appear months. There difficult colours form probably. Rules know however green manufac|-|Books|-|reference|-|4.01|-|10379.55|-|3.27272569046864342 +AAAAAAAALHBAAAAA|-|Also real addresses give in a advantages. Perfect, interested humans could fall never at a years. Sophisticated interp|-|Books|-|reference|-|8.60|-|1809.09|-|0.57041541486576182 +AAAAAAAAMAKBAAAA|-|However old days hold perhaps new, gentle bones. Rules achieve also. Fine, vocational proble|-|Books|-|reference|-|9.65|-|2818.11|-|0.88856462906066147 +AAAAAAAAMEBAAAAA|-|Then wels|-|Books|-|reference|-|7.76|-|7278.84|-|2.29505582272938427 +AAAAAAAAMHMBAAAA|-|Left rates recommend far courts. Local levels see clearly famous words; that is good associations might lay. F|-|Books|-|reference|-|52.20|-|7608.92|-|2.39913175048250361 +AAAAAAAAMIGAAAAA|-|Thus|-|Books|-|reference|-|1.16|-|null|-|null +AAAAAAAAMKPAAAAA|-|Sometimes just attempts result at least with a things. Trying symptoms should identify to a shops. Modern, pure courses relate vaguely new, actu|-|Books|-|reference|-|8.02|-|2716.95|-|0.85666835890946917 +AAAAAAAAMNCEAAAA|-|Disciplinary researchers infer seldom supreme, american boys. Top, mysterious researchers might feel everywhere st|-|Books|-|reference|-|4.64|-|1139.52|-|0.35929653778851959 +AAAAAAAAMPFAAAAA|-|Trees exist often. Wet, serious conditions might doubt somewhere overall, real countries; clear societies no top affairs. Approac|-|Books|-|reference|-|8.80|-|6380.54|-|2.01181719603092601 +AAAAAAAANCABAAAA|-|Years decide pot|-|Books|-|reference|-|4.03|-|9213.76|-|2.90514608608392156 +AAAAAAAANINDAAAA|-|Structures drop home revolutionary, formal hands. Ears|-|Books|-|reference|-|3.42|-|7901.54|-|2.49139634688070338 +AAAAAAAAOAJAAAAA|-|Trousers wriggle also long words. Enough scottish pools should maintain with a things. American items create delicately political years. Objectives encoura|-|Books|-|reference|-|0.95|-|8298.90|-|2.61668600590875567 +AAAAAAAAOCJDAAAA|-|Around distinct arts try only lines. Grey channels would interfere so columns. Outside important countries ought to present above a areas. More little matters provide men. Rather invisi|-|Books|-|reference|-|0.96|-|3135.80|-|0.98873392586109918 +AAAAAAAAOMGCAAAA|-|Open, other customers show never under a pen|-|Books|-|reference|-|7.76|-|943.95|-|0.29763230732718432 +AAAAAAAAPDEAAAAA|-|Particularly natural children put hardly. Parties weep into a days. Heavy hands will not take mad, lonely children. Ye|-|Books|-|reference|-|4.55|-|10644.27|-|3.35619327285717272 +AAAAAAAAPEKCAAAA|-|Little, num|-|Books|-|reference|-|4.79|-|2753.08|-|0.86806033439941162 +AAAAAAAAPFFAAAAA|-|Democratic, fresh operations shall not explain fully decisions; contra|-|Books|-|reference|-|1.68|-|3269.76|-|1.03097220531398293 +AAAAAAAAPOIDAAAA|-|As progressive minutes apply as firms. Involved,|-|Books|-|reference|-|4.35|-|2685.88|-|0.84687182753740962 +AAAAAAAAADMBAAAA|-|Only fashionable cities could read only places; local, soviet years might not seem already on a years. Women might include roads. Most unable schools add less new rates. Co|-|Books|-|romance|-|4.36|-|763.56|-|0.24906969910014780 +AAAAAAAAAFPAAAAA|-|Vague products might not feel indeed individual programs. Perhaps expensive years shoul|-|Books|-|romance|-|2.64|-|1143.36|-|0.37295868191516710 +AAAAAAAAAGBEAAAA|-|Ideas shall balance messages. Apparent activ|-|Books|-|romance|-|1.46|-|2136.11|-|0.69678908657448887 +AAAAAAAAAKDAAAAA|-|Personal, independent trends add good payments; mass, right factors cannot escape sure traditional, free companies; kno|-|Books|-|romance|-|24.21|-|4237.42|-|1.38222657598741199 +AAAAAAAAAPJCAAAA|-|Contracts could not find blue theories. Big, slight colours use t|-|Books|-|romance|-|1.16|-|1385.64|-|0.45198928422275761 +AAAAAAAABCBDAAAA|-|New, small beds will come instead in a stories. Female, other systems could not|-|Books|-|romance|-|4.36|-|5474.60|-|1.78578890289390377 +AAAAAAAACDAAAAAA|-|Good, essential purposes will override fully also other investments. Primary exceptions clean regularly in the strings. Only, sheer|-|Books|-|romance|-|5.63|-|2889.81|-|0.94264249981219304 +AAAAAAAACDCEAAAA|-|Tough speeches might not think fine questions. |-|Books|-|romance|-|3.10|-|12945.59|-|4.22279088214925139 +AAAAAAAACIFEAAAA|-|Ago little surfaces will require over forces. Facilities improve above ago subsequent mice. Both large children should not achieve highest stars. Possible others used to kn|-|Books|-|romance|-|0.98|-|7311.12|-|2.38485313332949945 +AAAAAAAACKHAAAAA|-|Personal, other facts save; particular, typical interests used to lead already possible chairs. Traditions mus|-|Books|-|romance|-|85.09|-|17867.14|-|5.82817746291085809 +AAAAAAAACLMBAAAA|-|Central, critical votes win; full schools might not mature really architects. Therefore wrong mountains reflect yet personal, public attempts. Most far eyes restr|-|Books|-|romance|-|1.38|-|9802.84|-|3.19764053791043649 +AAAAAAAACLMDAAAA|-|Streets may not belong then. Wrong studies remind more surely specific members. Detailed customers progress from a childre|-|Books|-|romance|-|4.21|-|3493.49|-|1.13956009103328533 +AAAAAAAACOAAAAAA|-|Poor, friendly years used to dry from a trees. Policemen start. Well rough acts destroy about initial g|-|Books|-|romance|-|8.86|-|1070.22|-|0.34910075615663495 +AAAAAAAAEDBAAAAA|-|Softly social men get only with a miles. Only afraid difficulties should emerge t|-|Books|-|romance|-|1.45|-|2464.62|-|0.80394751138902807 +AAAAAAAAEEFBAAAA|-|Privileges cut perhaps reasons. Ideas finish times. Women envy general programmes. Hands shall unveil never to a facilities; official proposals conform. Scot|-|Books|-|romance|-|3.42|-|8216.69|-|2.68024582992717461 +AAAAAAAAEHCBAAAA|-|Perhaps surprised deals get. Patterns could look strongly in a types. New, personal sorts will talk of course somehow large years; high pounds form very. Hardly|-|Books|-|romance|-|85.15|-|417.04|-|0.13603649655917759 +AAAAAAAAEJHAAAAA|-|Soft fields discuss from the principles. Though technical rivals st|-|Books|-|romance|-|4.11|-|621.54|-|0.20274343964941310 +AAAAAAAAEKJCAAAA|-|Then new styles advertise then eastern, huge reactions. Approximately economi|-|Books|-|romance|-|5.58|-|2844.95|-|0.92800937772403674 +AAAAAAAAFLJDAAAA|-|More simple principl|-|Books|-|romance|-|6.44|-|10049.19|-|3.27799875517341701 +AAAAAAAAFOECAAAA|-|Late, dark looks would not make citizens. Safe, great curtains use as by the children. Signs would prove neither romantic moveme|-|Books|-|romance|-|4.68|-|1076.10|-|0.35101878464255468 +AAAAAAAAGBHDAAAA|-|Times can share at best adequate eyes. Upper, other passengers introduce instead gastric, unusual walls. Developments will not avoid yet. National, final circumstances would not like for |-|Books|-|romance|-|4.61|-|10044.34|-|3.27641670786785397 +AAAAAAAAGKHAAAAA|-|Good, right governments would not let as a nights; lines could help alone quite written miles. Fixed, great implications dr|-|Books|-|romance|-|7.41|-|5832.53|-|1.90254399404445631 +AAAAAAAAGOOBAAAA|-|Opportunities feed early. Concerns kn|-|Books|-|romance|-|1.01|-|5307.94|-|1.73142519074026733 +AAAAAAAAGPBBAAAA|-|Heavy, dirty times say really corp|-|Books|-|romance|-|4.04|-|4265.25|-|1.39130459176345725 +AAAAAAAAGPHAAAAA|-|Large, english terms include notoriously with a models; little, broad methods turn components. Good, international friends would allow. Possible c|-|Books|-|romance|-|3.11|-|4094.52|-|1.33561326465443080 +AAAAAAAAHHLAAAAA|-|Cultural, harsh conditions describe|-|Books|-|romance|-|4.72|-|2605.46|-|0.84988886036129589 +AAAAAAAAIAADAAAA|-|Minutes hold all clear policies. Strong pupils used to exert thus comprehensive police. Bitter, heavy types tell at least industrial seconds. Very live areas may know things. Glorious factors could n|-|Books|-|romance|-|5.85|-|6415.39|-|2.09267019868785323 +AAAAAAAAIDDAAAAA|-|Plans would not claim; most particular horses will not tell simply cases; more british enquiries could not smile blue men. Old, dangerous play|-|Books|-|romance|-|4.99|-|1704.12|-|0.55587596997032830 +AAAAAAAAIGACAAAA|-|Poor, select stations cling. Too particular functions might understand elsewhere just spiritual officials. Clear pounds should make foreign, united societies; technical eyes can invest grey clubs. |-|Books|-|romance|-|0.85|-|6322.16|-|2.06225900893576200 +AAAAAAAAIGGDAAAA|-|As moral structures may get other, recent arms. So urgent unions know. Arts should conclude nearby early lines. Parties used to become industrial eyes. Good, estima|-|Books|-|romance|-|97.38|-|15594.66|-|5.08690512044778528 +AAAAAAAAIKCDAAAA|-|Warm cheeks could mark all very things. Naked groups should matter decisions. Institutions will ente|-|Books|-|romance|-|3.93|-|510.13|-|0.16640201896636597 +AAAAAAAAJDMBAAAA|-|Large thoughts make|-|Books|-|romance|-|0.85|-|4756.55|-|1.55156435284038979 +AAAAAAAAJEHCAAAA|-|R|-|Books|-|romance|-|1.68|-|744.33|-|0.24279696308242052 +AAAAAAAAJGBAAAAA|-|Specially clinical muscles can pass causal, following changes. Dishes could use at present areas; even c|-|Books|-|romance|-|5.00|-|613.37|-|0.20007842387901102 +AAAAAAAAJLBBAAAA|-|Stages choose physically to a families|-|Books|-|romance|-|6.13|-|11670.54|-|3.80687553844653850 +AAAAAAAAKCCDAAAA|-|Tory, immediate preparations renew always blind wages. Systems might want really for a prices. Terms happen b|-|Books|-|romance|-|8.48|-|2455.65|-|0.80102153936203828 +AAAAAAAAKEJAAAAA|-|Allegations take adverse, new prices. Always common homes mak|-|Books|-|romance|-|0.14|-|10206.10|-|3.32918206294989063 +AAAAAAAAKMEAAAAA|-|Free, unique movements give definitely exciting homes. More than mental awards show ever too great women. New patients |-|Books|-|romance|-|4.36|-|524.02|-|0.17093287197137023 +AAAAAAAAKOIAAAAA|-|Trials drag added, flexible years. Able positions switch most. Dreadful, united jobs hide commercially young members; yet military years make particularly on a features. Ne|-|Books|-|romance|-|0.78|-|1562.95|-|0.50982697654221804 +AAAAAAAAKPHDAAAA|-|Future, contemporary words stay ago interes|-|Books|-|romance|-|17.72|-|7674.03|-|2.50323267717731055 +AAAAAAAALCADAAAA|-|Senior fans cook frequently. Fin|-|Books|-|romance|-|4.36|-|2552.38|-|0.83257441273670078 +AAAAAAAALMLAAAAA|-|Mammals take at all. Profound weeks must know parts. Too low earnings can share directly new gaps. Equal block|-|Books|-|romance|-|4.99|-|15325.28|-|4.99903462494828581 +AAAAAAAAMDCDAAAA|-|Poor teachers |-|Books|-|romance|-|4.06|-|23.80|-|0.00776344863348462 +AAAAAAAAMFNBAAAA|-|So large styles make never wrong systems. Very old tables should not get tender, |-|Books|-|romance|-|7.34|-|9811.98|-|3.20062196314195117 +AAAAAAAAMMLDAAAA|-|Plants put. Bodies incur families. Partners shall analyse at l|-|Books|-|romance|-|1.44|-|16450.52|-|5.36608264765174109 +AAAAAAAAMNMAAAAA|-|Private days form now educational priorities. Major teachers would take approximately high elements; banks can hal|-|Books|-|romance|-|0.76|-|7443.48|-|2.42802834598193746 +AAAAAAAAMOJDAAAA|-|Social thousands choose especially blue claims. Social, right professionals can go tons. General projects must ma|-|Books|-|romance|-|15.18|-|1765.82|-|0.57600222125965607 +AAAAAAAANDMDAAAA|-|At all chemical branches make as existing things. Directly civil students must not afford much beautiful companies. Past police offer well perhaps chan|-|Books|-|romance|-|36.28|-|519.35|-|0.16940953982353942 +AAAAAAAANIKAAAAA|-|Minor democrats can wonder impatiently real backs. Early,|-|Books|-|romance|-|2.77|-|198.52|-|0.06475629507224231 +AAAAAAAANMGDAAAA|-|Surely local universities may know perhaps primitive computers. About bad sides will provide carefully about a workshops. National, sheer references ought to develop already also long-t|-|Books|-|romance|-|5.58|-|9616.92|-|3.13699430387945074 +AAAAAAAANNDCAAAA|-|Financial things will die only pai|-|Books|-|romance|-|1.33|-|445.08|-|0.14518301335257712 +AAAAAAAAOKPBAAAA|-|Red conditions could drive only maybe valid americans. Workers tell for a services. Deeply gastric characters kiss soon in order above parti|-|Books|-|romance|-|8.08|-|4764.34|-|1.55410541438891270 +AAAAAAAAOLOBAAAA|-|Homes ought to talk british, social hotels. Animals combine available, considerable failures. Appropriate children will afford wooden readers. New schools may expect points. Sure prof|-|Books|-|romance|-|3.95|-|7576.02|-|2.47126227379210770 +AAAAAAAAPDEDAAAA|-|Also genuine men identify. Gradual, useful things used to see below patterns; superb, hidden ways would fail even huge yea|-|Books|-|romance|-|2.08|-|11173.32|-|3.64468470107085683 +AAAAAAAAPENCAAAA|-|Gains keep still. Possible, final clothes kill perhaps in the conclusions. Methods would proceed for a hopes. Other, particular ways find perhaps in a demands. Adverse, other men admit eviden|-|Books|-|romance|-|1.93|-|5444.02|-|1.77581384998583823 +AAAAAAAAPLHBAAAA|-|Racial minutes used to come enough teenag|-|Books|-|romance|-|3.47|-|14338.89|-|4.67727882252883640 +AAAAAAAAADGBAAAA|-|Previous, metropolitan rights should not laugh sufficiently. Never average materials face yet. At least physical ambitions adapt at least reports. Ideas may not oppose with a techniques.|-|Books|-|science|-|0.43|-|21163.31|-|6.54489721974438813 +AAAAAAAAAIMDAAAA|-|Social, ethnic orders come aims; central rights|-|Books|-|science|-|2.32|-|4046.98|-|1.25155602551591145 +AAAAAAAAAMEAAAAA|-|Nations could not understand thoroughly. |-|Books|-|science|-|33.27|-|9699.54|-|2.99964856058903274 +AAAAAAAABEGCAAAA|-|Obvious relationships put originally. Pounds give well central, british leaves. Differences ought to ask also central states. Tests grant for a chapters. Soon active heads should want |-|Books|-|science|-|4.26|-|8929.73|-|2.76157959459404295 +AAAAAAAABEHBAAAA|-|Gently independent fears call now statutory sciences. Friendly, quiet needs stumble too. So famous cattle teach too only services; public forces collect pure friends. Arms might make im|-|Books|-|science|-|4.68|-|6948.28|-|2.14880273709573489 +AAAAAAAACEEEAAAA|-|Normally real lives extend unfairly alive numbers; co|-|Books|-|science|-|30.87|-|2710.44|-|0.83822196151187973 +AAAAAAAACFLCAAAA|-|Much red years would not repeat by the others. Particularly environ|-|Books|-|science|-|1.82|-|5114.22|-|1.58160723720255218 +AAAAAAAACHKBAAAA|-|Again visual pages see no longer. Too social pictures shall not play otherwise. Certain, likely unions might deter further popular thoughts. Males may s|-|Books|-|science|-|4.82|-|373.75|-|0.11558472355597801 +AAAAAAAACIHDAAAA|-|European, great children look extraordinary customers. Agencies could not drop current, new forests. Always lucky ph|-|Books|-|science|-|1.15|-|3850.46|-|1.19078088204241098 +AAAAAAAACLKAAAAA|-|Brief, loose systems could learn necessary, level lines. Individual beings must use apparently documents. French, old blocks reduce free, active stands.|-|Books|-|science|-|3.48|-|2862.96|-|0.88538980642628178 +AAAAAAAADNCBAAAA|-|Regular teachers serve together events. Other arms would not use. Dou|-|Books|-|science|-|3.59|-|3749.85|-|1.15966655685989072 +AAAAAAAAEADAAAAA|-|So well-known seats must produce enough with a cases. Ever corporate references shall reach keen arts. Current parents get mysterious shoulders. Models|-|Books|-|science|-|2.41|-|5844.16|-|1.80734613516228621 +AAAAAAAAEAJAAAAA|-|At least special indians must suppress especially regulations. Most national activities will find also. Previous, fat terms hear eggs. Guilty, public years know inside benef|-|Books|-|science|-|6.17|-|4257.99|-|1.31681229981035137 +AAAAAAAAECHAAAAA|-|No longer present seats can try exactly peasants. More creative degrees might consume again towns. Special, atlantic assumptions shall become. Members might not play internal|-|Books|-|science|-|1.97|-|1109.26|-|0.34304618181057972 +AAAAAAAAEDPDAAAA|-|Clothes forget only main, scottish wives. Upper rates must abolish proposals. Acute skills tell only. Active schemes would not put both coming words. Scottish, sensitive bands ought|-|Books|-|science|-|8.77|-|6069.12|-|1.87691654161353120 +AAAAAAAAEFBAAAAA|-|Likely, leading savings pay then pressures. Mental, soviet men must not show plain especially english consequences. More ordinary prizes|-|Books|-|science|-|9.07|-|5242.70|-|1.62134054899511956 +AAAAAAAAEHEBAAAA|-|Sometimes other consequences may make often main thanks. Forward, foreign attacks receive financial parameters. Stars stop in the departments. Smooth parents might get|-|Books|-|science|-|2.37|-|13879.59|-|4.29235738654265387 +AAAAAAAAEJFBAAAA|-|Then european points allow also short, new wives. Closely competiti|-|Books|-|science|-|6.48|-|4276.40|-|1.32250571723019232 +AAAAAAAAEOLAAAAA|-|Terrible, beautiful results can apply more too darling schemes. Obvious versions can maintain too unknown, social homes; important, soviet material|-|Books|-|science|-|1.32|-|9985.59|-|3.08811146406244414 +AAAAAAAAFCPAAAAA|-|Domestic copies cannot get additional victims. Pieces should not determine now british, gold depths. Local, available stocks punc|-|Books|-|science|-|3.99|-|670.10|-|0.20723297191936018 +AAAAAAAAFPOAAAAA|-|Complaints can involve very vital adults. A little practical initiatives remain traditionally important months. Clear new transactions create perhaps new, personal princip|-|Books|-|science|-|1.15|-|4522.14|-|1.39850247968275697 +AAAAAAAAGDJBAAAA|-|Citizens offset fairly women; at least sure coins share previous babies; coloured tasks shall add internal relations; developing|-|Books|-|science|-|26.71|-|12502.01|-|3.86633142406440854 +AAAAAAAAGGABAAAA|-|Main elements write generally however secondary periods. Documents persuade empty, labour margins. Over other friends contend afterwards friendly, labour buildings. Canadian birds |-|Books|-|science|-|0.85|-|2817.48|-|0.87132480782474096 +AAAAAAAAGKPBAAAA|-|Great texts would phone proposed, young investors. Noble, capable allies explain remarkable services. Aware bits examine soviet mountains|-|Books|-|science|-|4.07|-|10423.90|-|3.22366180568604474 +AAAAAAAAHFDEAAAA|-|Certain, long councillors smile then fresh eyes. Lights attend initially after a preferences; national genes admit. Wide single plans improve never|-|Books|-|science|-|2.09|-|null|-|null +AAAAAAAAHGDAAAAA|-|Problems could not find small, late years. Demands might get only normal, available communications. Quiet mothers leave women. Fair interes|-|Books|-|science|-|0.21|-|4403.90|-|1.36193595737303432 +AAAAAAAAHJPDAAAA|-|Marks remember|-|Books|-|science|-|1.41|-|601.12|-|0.18590043886011907 +AAAAAAAAHMDDAAAA|-|Things prejudice unfortunately. Available lives used to get for an readers. Roughly good articles might express open years. Black m|-|Books|-|science|-|9.38|-|8682.12|-|2.68500452195271662 +AAAAAAAAHNIDAAAA|-|Small, stupid members lack hands. Literary terms would understand sure ordinary acids. Lovely,|-|Books|-|science|-|0.22|-|12024.49|-|3.71865512388393865 +AAAAAAAAIDGCAAAA|-|Major, regional police take imaginative minds. Real arms give. Low members will say children. Primary, assistant ways used to solve anxio|-|Books|-|science|-|0.40|-|619.12|-|0.19146706099793206 +AAAAAAAAIKBEAAAA|-|Words might not become most in a ideas.|-|Books|-|science|-|0.30|-|17040.17|-|5.26978819744981907 +AAAAAAAAIMCEAAAA|-|Questions resist less absolu|-|Books|-|science|-|5.85|-|3300.50|-|1.02070202032509816 +AAAAAAAAJLLDAAAA|-|However major deb|-|Books|-|science|-|0.66|-|3152.79|-|0.97502170054863391 +AAAAAAAAJNDDAAAA|-|Thereafter strange rates shall not inhibit now on a heroes; eyes may not provide.|-|Books|-|science|-|8.37|-|2094.67|-|0.64779091074515175 +AAAAAAAAKEDAAAAA|-|Other, certain purposes |-|Books|-|science|-|9.54|-|11871.10|-|3.67121822556620897 +AAAAAAAAKFCAAAAA|-|Effective sons increase howev|-|Books|-|science|-|3.04|-|16393.27|-|5.06972998295252896 +AAAAAAAAKJPBAAAA|-|Increased, australian pages bolster much like a patients; complicated assets range; strong, military names shall contr|-|Books|-|science|-|2.16|-|802.22|-|0.24809197841090751 +AAAAAAAAKLGBAAAA|-|New years drive about massive eyes. Western, great tourists move vast plans. Large, professional powers find artists. Complete shares choose obvious citizens. Costs con|-|Books|-|science|-|6.30|-|2596.26|-|0.80291102175101934 +AAAAAAAAKNFBAAAA|-|Difficult minutes could trace special, chief requirements; also likely schools must take in a attitudes. New, coming boys may not arise|-|Books|-|science|-|2.49|-|7096.17|-|2.19453872309357727 +AAAAAAAAKPOBAAAA|-|Other clothes might take surely ordinary tears. Titles claim back years. Flat designs cannot determine carefully scottish members. Fit|-|Books|-|science|-|8.54|-|3787.41|-|1.17128224172079382 +AAAAAAAALAPCAAAA|-|Due proposed concepts afford indeed yesterda|-|Books|-|science|-|1.34|-|4163.38|-|1.28755351534043544 +AAAAAAAALKJBAAAA|-|Earnings feel possibilities. Single, poor problems make full, sho|-|Books|-|science|-|2.75|-|3486.04|-|1.07808152429453270 +AAAAAAAALNGBAAAA|-|Direct schemes rival pa|-|Books|-|science|-|78.33|-|124.80|-|0.03859524682217005 +AAAAAAAAMFDDAAAA|-|Probably available teachers think objectives. Other, effective customers will not drive trials. Governments ought to let generally through a minutes; english, provincial years shal|-|Books|-|science|-|1.24|-|16539.63|-|5.11499280606865723 +AAAAAAAAMFOBAAAA|-|Corr|-|Books|-|science|-|3.50|-|7384.72|-|2.28377476853057381 +AAAAAAAAMIFDAAAA|-|Fun friends must appear much. Large details migh|-|Books|-|science|-|9.89|-|3700.70|-|1.14446658585580692 +AAAAAAAAMPOCAAAA|-|Scarcely steady sales give thus feet; eyes |-|Books|-|science|-|4.78|-|426.71|-|0.13196296291256556 +AAAAAAAANKOAAAAA|-|Professionally uncomfortable groups would not protect again there dependent users. Standard fields avoid likely families. Independent, intact fortunes work in the|-|Books|-|science|-|8.28|-|2033.36|-|0.62883037723018985 +AAAAAAAAOAAAAAAA|-|Formal, waiting students lead so crazy customers. Hostile levels believe underway hot, moving times. Minutes would not feel so main players; a|-|Books|-|science|-|0.59|-|13159.15|-|4.06955642804454337 +AAAAAAAAOCCEAAAA|-|Current, conservative sources used to photograph so new powers. Problems shall come by a authorities. Holy, true pp. understand evidently all clear changes. Again cold m|-|Books|-|science|-|3.48|-|5830.48|-|1.80311550233754834 +AAAAAAAAODAAAAAA|-|Only chinese difficulties shall try elega|-|Books|-|science|-|4.50|-|141.60|-|0.04379076081746217 +AAAAAAAAODEEAAAA|-|Meanwhile detailed sales want maybe visible, favorite authors; transactions might|-|Books|-|science|-|1.84|-|1750.32|-|0.54129833668093495 +AAAAAAAAODPCAAAA|-|Quickly welcome stairs cannot add particularly difficult, rich bars. Sequences should achieve chemical changes. Steep, alternative chips shall reduce desperately wide p|-|Books|-|science|-|2.43|-|2301.47|-|0.71174521397291430 +AAAAAAAAOEJBAAAA|-|Unexpected, constant details bring with a things. Necessary, lucky places prove possible materials.|-|Books|-|science|-|4.69|-|484.40|-|0.14980398686425619 +AAAAAAAAOINDAAAA|-|Now unchanged questions can push therefore also useful teeth. Sou|-|Books|-|science|-|4.73|-|7802.49|-|2.41297297578135892 +AAAAAAAAPGEDAAAA|-|Royal, considerable rooms reply then often c|-|Books|-|science|-|0.79|-|8511.36|-|2.63219583327199740 +AAAAAAAAACIBAAAA|-|Implications try strong others. Apparent years shall sign increasing flowers. Cr|-|Books|-|self-help|-|7.69|-|3248.15|-|1.12590046646800017 +AAAAAAAAACKCAAAA|-|Supposedly electronic differences should illustrate safe cities. Current groups realise more cruel, royal lives. New messages shall give quite organic occasions|-|Books|-|self-help|-|3.64|-|5738.39|-|1.98908793552493188 +AAAAAAAAAKFEAAAA|-|Types kiss extremely. Goods could help too countries. Good, white subjects talk. Supreme gardens reflect; just, basic days undertake particularl|-|Books|-|self-help|-|1.07|-|4428.51|-|1.53504655719662067 +AAAAAAAAAKGDAAAA|-|Enterprises shall not influence perhaps delighted, big police. Novels keep early temporary bacteria; rates will not cope men|-|Books|-|self-help|-|0.95|-|3034.44|-|1.05182254867206207 +AAAAAAAAALPCAAAA|-|Onwards current types may allow; other sectors might carry nowadays marginal conditions. Minutes add well faces. Urban, possible women could not oppose never markets; galleries must favour gently vehe|-|Books|-|self-help|-|6.21|-|4569.23|-|1.58382408090746437 +AAAAAAAAANECAAAA|-|Usually complete artists will give from the weeks. Units swallow political minutes; books might not arrest continually lips. Modest, royal problems must behave consequently genera|-|Books|-|self-help|-|1.82|-|8733.78|-|3.02737465204158998 +AAAAAAAAANPBAAAA|-|Fees would tell for instance in a sales. Mistakenly slow orders propose clearly following conventions. Brilliant teams agree above statistical styles. Public, extra researchers take specifically pub|-|Books|-|self-help|-|0.63|-|698.53|-|0.24213021345747338 +AAAAAAAAAOCDAAAA|-|Slowly likely legs get seasons. European re|-|Books|-|self-help|-|0.43|-|6825.28|-|2.36583468613663537 +AAAAAAAABFOCAAAA|-|There main prices could bowl acres. Radical, domestic plants take long. Fresh developments wave sanctions. British, able men cover goals. There other men|-|Books|-|self-help|-|7.22|-|9807.14|-|3.39943152277973097 +AAAAAAAABOKAAAAA|-|Social districts will forget |-|Books|-|self-help|-|1.50|-|null|-|null +AAAAAAAACDIBAAAA|-|Eastern, general examples strain just black, dry assumptions. In particular |-|Books|-|self-help|-|0.54|-|5607.50|-|1.94371776725807334 +AAAAAAAACHACAAAA|-|Early, previous r|-|Books|-|self-help|-|2.90|-|5170.28|-|1.79216497506893829 +AAAAAAAADIFDAAAA|-|Now christian papers believe very major, new branches. Annual wars include harshly so-called sites. |-|Books|-|self-help|-|5.23|-|3030.77|-|1.05055042308921105 +AAAAAAAADNCEAAAA|-|Much g|-|Books|-|self-help|-|4.52|-|5459.83|-|1.89253117738896952 +AAAAAAAADPNAAAAA|-|Particular prisoners wait at a wag|-|Books|-|self-help|-|1.99|-|4624.66|-|1.60303768337542960 +AAAAAAAAEAGBAAAA|-|Capital effects should play even reasonable, still years. Cells sell for a lawyers; social|-|Books|-|self-help|-|46.05|-|5833.42|-|2.02202801567161662 +AAAAAAAAEBKCAAAA|-|Pupils would not construct mothers. Slow, vital rates must send human respects; things could undertake more ancient, clear cities. European, annual sales must|-|Books|-|self-help|-|73.78|-|11005.17|-|3.81470253423014374 +AAAAAAAAECODAAAA|-|Really intensive offenders need collectively exceptional days. Students make very all subject cattl|-|Books|-|self-help|-|7.99|-|6685.74|-|2.31746618373035957 +AAAAAAAAEFKAAAAA|-|Instruments must not get actually servants. Popular, |-|Books|-|self-help|-|7.42|-|2315.06|-|0.80246513673980834 +AAAAAAAAEGPAAAAA|-|Therefore new chemicals know. Others cannot admit yet new honours. Quickly alternative personnel used to put specifically powerful|-|Books|-|self-help|-|7.83|-|3541.24|-|1.22749373270173511 +AAAAAAAAEIOAAAAA|-|Shares could release barely months. Aware writings used to use so very impossible authorities. |-|Books|-|self-help|-|7.66|-|8315.79|-|2.88248752060401493 +AAAAAAAAEKCBAAAA|-|Too blue railways might feel|-|Books|-|self-help|-|1.92|-|348.50|-|0.12079993613721597 +AAAAAAAAFFGAAAAA|-|Areas increase well final, peculiar findings. Fat possibilities will say now at all sure dogs|-|Books|-|self-help|-|5.11|-|2873.63|-|0.99608126393683768 +AAAAAAAAGAPBAAAA|-|Cruel, noble duties remove black, considerable orders. Actions see golden levels. Weakne|-|Books|-|self-help|-|4.22|-|10292.61|-|3.56770912678700281 +AAAAAAAAGBCCAAAA|-|Systems look commercially; over increased birds will make certainly almost technical others. Hours shall run stores. Of course dist|-|Books|-|self-help|-|2.53|-|10072.96|-|3.49157223733925679 +AAAAAAAAGGKBAAAA|-|Nuclear services know either; comfortable, ideal aspects must not help eventually immediate hands. Clear frames could not stop still suitable boys. Elaborate papers submit other months. Video-taped w|-|Books|-|self-help|-|6.50|-|7802.31|-|2.70450086003661850 +AAAAAAAAGHJBAAAA|-|A bit full groups achieve previously limited criteria. Only lar|-|Books|-|self-help|-|7.53|-|3890.80|-|1.34866109475661378 +AAAAAAAAGLHCAAAA|-|Historical supporters cost anyway activities. Steep towns would not form very. Then vague carers sp|-|Books|-|self-help|-|1.26|-|8834.76|-|3.06237717012232475 +AAAAAAAAGMIDAAAA|-|Specialists should not read just true, acceptable developments; over go|-|Books|-|self-help|-|4.67|-|4665.23|-|1.61710039043163290 +AAAAAAAAGNPAAAAA|-|Stable estates think also financial details. Reasons could attend so educational, pregnant reasons. Prices know outside now upper thousands. That is black businesses might not defeat |-|Books|-|self-help|-|3.03|-|2800.46|-|0.97071847677138548 +AAAAAAAAHAFBAAAA|-|Various|-|Books|-|self-help|-|6.24|-|9583.70|-|3.32198091236222871 +AAAAAAAAHBBEAAAA|-|There political deta|-|Books|-|self-help|-|8.83|-|2006.16|-|0.69539167828131189 +AAAAAAAAIDBEAAAA|-|Southern students come. Very hours fight jolly between a attacks. Irish stories go quickly eggs. Together positive years shift just black, dead islands. Human, other workers go t|-|Books|-|self-help|-|38.28|-|3848.33|-|1.33393979407441130 +AAAAAAAAILADAAAA|-|Always clinical doors|-|Books|-|self-help|-|1.75|-|1616.79|-|0.56042504662062959 +AAAAAAAAIOOCAAAA|-|Now important rights shall make. Just nasty days could not reach really; details list whole, only months. Chiefs would drown inst|-|Books|-|self-help|-|9.95|-|4937.09|-|1.71133473946538766 +AAAAAAAAJCEEAAAA|-|In order excellent words could go old costs. Surp|-|Books|-|self-help|-|1.45|-|10597.83|-|3.67350699338040614 +AAAAAAAAJCMCAAAA|-|Logic|-|Books|-|self-help|-|1.29|-|13064.53|-|4.52853483403943236 +AAAAAAAAJJOCAAAA|-|Sufficiently great tears may see. Much short standards duck over a pap|-|Books|-|self-help|-|8.57|-|579.81|-|0.20097851067925163 +AAAAAAAAJMABAAAA|-|Again right years welcome to the months. Once competitive years could benefit great, social projects. Actually old expectations must not spin |-|Books|-|self-help|-|2.42|-|871.80|-|0.30219048586635548 +AAAAAAAAKEEBAAAA|-|Scottish, new sides admit here roman principles. So personal orders help. More christian occasions hear for a lines. Main calls know increased, dangero|-|Books|-|self-help|-|6.37|-|8304.33|-|2.87851516115456731 +AAAAAAAAKFKBAAAA|-|Years ought to face companies. Old days expect currently ever low food|-|Books|-|self-help|-|2.41|-|431.50|-|0.14957007874665335 +AAAAAAAAKIEAAAAA|-|At least royal children write fle|-|Books|-|self-help|-|1.04|-|272.55|-|0.09447352250845972 +AAAAAAAAKNFDAAAA|-|Vital arms generate slow, neat judges. Specially simi|-|Books|-|self-help|-|6.56|-|8829.26|-|3.06047071488916926 +AAAAAAAALBBAAAAA|-|Highly other times could stay no longer huge symbolic results. Most narrow police chan|-|Books|-|self-help|-|7.99|-|1597.86|-|0.55386337433633260 +AAAAAAAAMGBAAAAA|-|Se|-|Books|-|self-help|-|27.79|-|1318.25|-|0.45694265656494965 +AAAAAAAAMGGCAAAA|-|Empty, new animals shall write more small aims. Magistrates remove too junior|-|Books|-|self-help|-|1.09|-|6593.43|-|2.28546893235352626 +AAAAAAAAMMACAAAA|-|Mental effects could share sexually good minu|-|Books|-|self-help|-|4.74|-|12603.80|-|4.36883281229911811 +AAAAAAAAMMBDAAAA|-|Top, small institutions go actually short, responsible chairs; over terrible arts get further sti|-|Books|-|self-help|-|36.88|-|10335.66|-|3.58263147183924714 +AAAAAAAANDDDAAAA|-|Sincerely important experiments should hear surprised, unchanged sorts. Else financial democrats will not start so major bodies. E|-|Books|-|self-help|-|1.90|-|963.73|-|0.33405601851798895 +AAAAAAAAOCKCAAAA|-|However central years exist i|-|Books|-|self-help|-|0.23|-|2598.82|-|0.90082436164166316 +AAAAAAAAOLHDAAAA|-|Useful methods fit famous, other schools; well dark prices should reject to a communities. Properly crucial walls may not satisfy exceptional, sure colleagues; ordinary, regular sides can mov|-|Books|-|self-help|-|7.54|-|4581.62|-|1.58811880460542737 +AAAAAAAAOLNDAAAA|-|Essential words may not go here. Thereby local bonds think suita|-|Books|-|self-help|-|95.88|-|5449.63|-|1.88899556950202661 +AAAAAAAAPEECAAAA|-|Results|-|Books|-|self-help|-|9.21|-|10771.10|-|3.73356726578928824 +AAAAAAAAPHECAAAA|-|Inner, bright stores realise as around fresh metres. Isolated gates construct relevant, absolute negotiations. Workers need quickly police; extra men shall know |-|Books|-|self-help|-|52.39|-|1028.88|-|0.35663884732527624 +AAAAAAAAPPNDAAAA|-|Smooth, othe|-|Books|-|self-help|-|8.62|-|5452.90|-|1.89012904379519360 +AAAAAAAAADCCAAAA|-|Even true actions must drink there mediterranean times. British observations would tell. Regular terms reassess for a students.|-|Books|-|sports|-|6.77|-|9814.08|-|3.65272425912067280 +AAAAAAAAAEAEAAAA|-|Cultural, increasing words can keep political questio|-|Books|-|sports|-|4.86|-|982.77|-|0.36577935172079539 +AAAAAAAAAFIBAAAA|-|Almost personal matters may deal; major, australian offences happen prime, usual hours. Functions might visit at the followers. Championships shall smile observations; compani|-|Books|-|sports|-|4.33|-|2698.54|-|1.00437560343990475 +AAAAAAAAAFJAAAAA|-|Working, economi|-|Books|-|sports|-|3.36|-|6090.01|-|2.26665436447303145 +AAAAAAAAAHCCAAAA|-|Ready, new days could eliminate more level prices. Houses shall come by a horses. Women take too dry, common years. Certainly cultural needs use|-|Books|-|sports|-|1.65|-|128.31|-|0.04775598422753570 +AAAAAAAAAHHDAAAA|-|Basic, overall results must agree prior from the comparisons. Much interesting |-|Books|-|sports|-|0.79|-|4058.84|-|1.51066868538766258 +AAAAAAAAANJAAAAA|-|So likely attitudes shall refrain even more than territorial indicators; really general measures can quote relevant gains. Little peasants should receive very long min|-|Books|-|sports|-|0.82|-|8110.78|-|3.01876924443154840 +AAAAAAAAAPCCAAAA|-|Wonderful, brief ships continue; less vital o|-|Books|-|sports|-|3.94|-|3165.86|-|1.17830847343610131 +AAAAAAAABAGAAAAA|-|Green levels provide. Students would agree. Very upper states get finally for a|-|Books|-|sports|-|1.29|-|251.00|-|0.09342024815767641 +AAAAAAAABKODAAAA|-|Small, democratic service|-|Books|-|sports|-|0.61|-|59.62|-|0.02219010037912616 +AAAAAAAABLKAAAAA|-|In order|-|Books|-|sports|-|9.54|-|3735.04|-|1.39015284334202266 +AAAAAAAABMIBAAAA|-|As specific characteristics contain for the hours. Free, double men avoid in the meals. Trying, potential institutions share above from the months. Contemporary problems could cheer only heav|-|Books|-|sports|-|1.58|-|1479.38|-|0.55061373195021244 +AAAAAAAABNPCAAAA|-|Grounds ought |-|Books|-|sports|-|1.69|-|9033.60|-|3.36223567233938482 +AAAAAAAABOPBAAAA|-|Completely particular voices shall not say straight. Used ideas must recall current colonies. New techniques could not make naturally old, great versions; great adults test|-|Books|-|sports|-|2.88|-|6875.72|-|2.55908951658445747 +AAAAAAAACAODAAAA|-|Good, legal services stand now trees; social, clear languages move nice flights. New factors distinguish lo|-|Books|-|sports|-|0.46|-|5398.06|-|2.00911595525907054 +AAAAAAAACDIDAAAA|-|Alone, male feet carry quite here wrong men. Southern pieces see wholly. Almost impossible children participate scientific things; good func|-|Books|-|sports|-|6.13|-|146.77|-|0.05462665267769787 +AAAAAAAACENDAAAA|-|Single results enter quite clear reports. Abroad mutual books handle previous, standard times. Furthermore financial limits c|-|Books|-|sports|-|8.75|-|5244.80|-|1.95207377504932757 +AAAAAAAACLPDAAAA|-|Environmental, new women pay again fingers. Different, uncomfortable records miss far russian, dependent members. Enough double men will go here immediatel|-|Books|-|sports|-|0.91|-|3081.97|-|1.14708526778690819 +AAAAAAAACNJCAAAA|-|Holes used to wish rough heads. Cultural, n|-|Books|-|sports|-|4.45|-|2627.68|-|0.97800206246598861 +AAAAAAAACPCDAAAA|-|New costs shall allow. Traditional studies work main ex|-|Books|-|sports|-|1.77|-|4984.13|-|1.85505442808812633 +AAAAAAAAEAADAAAA|-|Maybe western chips should not |-|Books|-|sports|-|3.28|-|3146.46|-|1.17108794429562752 +AAAAAAAAEBLAAAAA|-|Reasonable hours reflect anywhere big, significant rates. Rather bad members appoint even critical, global features. Major op|-|Books|-|sports|-|3.85|-|71.37|-|0.02656335900802138 +AAAAAAAAENIAAAAA|-|Full figures can come complete legs. Policemen ought to feel near high hours. International, royal differences sound ne|-|Books|-|sports|-|2.21|-|null|-|null +AAAAAAAAEOGCAAAA|-|Other, english men used to avoid as middle, orange minutes. Clear, good procedures shall look now under a products; very academic associat|-|Books|-|sports|-|4.85|-|5342.90|-|1.98858583219780587 +AAAAAAAAFBKDAAAA|-|Twice detailed customers know women; economic, intense values listen wide industr|-|Books|-|sports|-|0.74|-|6864.91|-|2.55506611864587388 +AAAAAAAAFIECAAAA|-|Sad, very sales could gather hence on a pounds. Issues see just within a things. Eastern directors put very in a initiatives. |-|Books|-|sports|-|3.99|-|8980.81|-|3.34258764484837391 +AAAAAAAAGAGEAAAA|-|Risks admit authors. Public optio|-|Books|-|sports|-|0.84|-|6509.82|-|2.42290438191954194 +AAAAAAAAGBFEAAAA|-|States should accept most. Stages cannot join somewhat islamic, elaborate resources. Bol|-|Books|-|sports|-|5.13|-|2075.16|-|0.77235841500750507 +AAAAAAAAGCFAAAAA|-|Away legal purposes must not call never thoroughly empty ministers. Also different photographs investigate months. Broken organisations use fatal hearts. Others will assume inner types. Able y|-|Books|-|sports|-|5.15|-|928.83|-|0.34570330317248835 +AAAAAAAAGFJCAAAA|-|Scenes monitor ago labour, big others. Always full owners should help too future, european rooms. Competitor|-|Books|-|sports|-|9.43|-|2094.31|-|0.77948589609204492 +AAAAAAAAGGCAAAAA|-|Freely public months may rebuild forth. Long, central methods can keep quickly common subjects. Suggestions cultivate sa|-|Books|-|sports|-|8.75|-|576.67|-|0.21463208966170221 +AAAAAAAAGGCDAAAA|-|Rules eme|-|Books|-|sports|-|0.47|-|9634.43|-|3.58585992612654305 +AAAAAAAAGGDEAAAA|-|Very social modules |-|Books|-|sports|-|8.51|-|1409.01|-|0.52442256516592683 +AAAAAAAAGLBCAAAA|-|Differences shall involve growing acres. Men shake extreme policies. Carefully economic programmes used to accept already terms. Practices think more just available thin|-|Books|-|sports|-|5.15|-|3872.73|-|1.44139999062819981 +AAAAAAAAGNDDAAAA|-|Previous, significant flats give all formally co|-|Books|-|sports|-|4.55|-|516.51|-|0.19224100548175873 +AAAAAAAAHACBAAAA|-|Papers conceive over immediate victims. Local, expert members add ill over immediate tiles. Profits pay even. Tall classes begin for instance grand fields; ru|-|Books|-|sports|-|0.25|-|1776.98|-|0.66137813773397538 +AAAAAAAAHEJCAAAA|-|Great, reliable children see french, proper dates. Public passages like closely traditionally academic books. Values used to distinguish leaders. Much key oper|-|Books|-|sports|-|31.97|-|3927.53|-|1.46179612448891960 +AAAAAAAAHLHDAAAA|-|Dual months should survive only large, political eyes; new, new merchants pass fairly conseque|-|Books|-|sports|-|6.26|-|6753.59|-|2.51363368029960879 +AAAAAAAAIAHBAAAA|-|Only new agencies |-|Books|-|sports|-|3.66|-|8774.03|-|3.26562573682429293 +AAAAAAAAIFNAAAAA|-|Properly ordinary questions should not love again. Poor, glad police would make because of a responsibilit|-|Books|-|sports|-|5.67|-|9060.99|-|3.37243001734750736 +AAAAAAAAIHHDAAAA|-|Obviously official conditions must get at least read|-|Books|-|sports|-|66.91|-|253.36|-|0.09429862180569281 +AAAAAAAAIKBAAAAA|-|Workers appear models. Late persons see exactly national times. Eyes must not buy with the members. Earlier firm rivals should ensure. Possible enquir|-|Books|-|sports|-|3.00|-|701.84|-|0.26121939030670761 +AAAAAAAAJBBCAAAA|-|Wrong others miss less to the respects. Especially other standards start in order regula|-|Books|-|sports|-|7.53|-|16901.33|-|6.29054359679195612 +AAAAAAAAJCCDAAAA|-|Adults will foresee most left, social children. Different eyes make personal counties. Readers would not admit more musical proceedings; titles take here away fast institutions; bird|-|Books|-|sports|-|3.83|-|4007.67|-|1.49162360929910361 +AAAAAAAAKFAEAAAA|-|Private photographs pay weeks. Consistent times should not need from the terms. Instructions replace slowly useful years. Too possible records |-|Books|-|sports|-|6.01|-|7220.33|-|2.68735067880603861 +AAAAAAAAKHECAAAA|-|Particular, long figures know also constraints. Main, only professi|-|Books|-|sports|-|6.26|-|3067.22|-|1.14159543248680569 +AAAAAAAAKHLAAAAA|-|Always sick artists would not expect. Results implement also large positions. Keenly imp|-|Books|-|sports|-|6.96|-|4870.65|-|1.81281805453859200 +AAAAAAAAKIDCAAAA|-|Economic sons rise well capable doubts. Full, clean affairs give. Tools can help deeper soldiers; troubles back more small, small years; laws will boost main seconds. Immediate jobs con|-|Books|-|sports|-|1.41|-|3191.08|-|1.18769516131871725 +AAAAAAAAKIHAAAAA|-|White police show never police. True women would not recover just sure, obvious hands. Likely eyes shall not visit right, |-|Books|-|sports|-|8.25|-|3505.34|-|1.30466028954991799 +AAAAAAAAKLIDAAAA|-|Financial li|-|Books|-|sports|-|4.82|-|1591.63|-|0.59239230906455179 +AAAAAAAAKPPBAAAA|-|Pounds know as elaborate elements. Public papers gaze creatures. New, advan|-|Books|-|sports|-|3.65|-|2988.60|-|1.11233367985670004 +AAAAAAAALEHDAAAA|-|Central, visible moments |-|Books|-|sports|-|57.64|-|5862.92|-|2.18213323238487713 +AAAAAAAALJLDAAAA|-|Old, straight enemies obtain however years. Largely social questions disrupt never. Measures rule fine, extensive trees. Already economic friends would not show more beautiful engines. Systems ret|-|Books|-|sports|-|9.99|-|4428.82|-|1.64837236432542002 +AAAAAAAALNHAAAAA|-|Freely proud children cannot continue countries. Rates shall not look applications. Compl|-|Books|-|sports|-|4.13|-|3482.98|-|1.29633807142718634 +AAAAAAAAMDEEAAAA|-|Actual, urban police learn quickly low, british years; ethnic, common months should fail then overall markets. Years get. Criminal statio|-|Books|-|sports|-|4.70|-|2318.62|-|0.86297233379821383 +AAAAAAAAMFJAAAAA|-|Annually new statements finish recommendations. More american cases may sleep also inner, common animals. So experienced |-|Books|-|sports|-|4.43|-|7337.37|-|2.73091205667207226 +AAAAAAAAMILDAAAA|-|Clients might not seem deep technical agents. Members save spare dishes. Times will know marked responses. As a whole plain reduc|-|Books|-|sports|-|0.41|-|2574.99|-|0.95839125419735128 +AAAAAAAANDFBAAAA|-|All capital bacteria make jobs. Again appropriate eyes may not leave others. There fixed ways|-|Books|-|sports|-|0.32|-|485.93|-|0.18085936727991911 +AAAAAAAANDNCAAAA|-|Papers occur critically relatively happy numbers; related, soviet genes experiment governments; voluntary devices|-|Books|-|sports|-|2.52|-|8684.12|-|3.23216193398821051 +AAAAAAAANMJDAAAA|-|Indeed similar changes might drink too national careful areas. Wise, good rooms give large opportunities. Various patients shall research directly plants. International hands can get pieces|-|Books|-|sports|-|9.31|-|5582.14|-|2.07762909980434971 +AAAAAAAAOCIBAAAA|-|Organic, successful arrangements will stimulate as p|-|Books|-|sports|-|2.62|-|2217.23|-|0.82523576423364486 +AAAAAAAAODCDAAAA|-|Thus single homes know however civil stones. Precise schools cannot |-|Books|-|sports|-|4.74|-|2690.01|-|1.00120080377143869 +AAAAAAAAODFEAAAA|-|Public, cost|-|Books|-|sports|-|2.79|-|8803.26|-|3.27650491552408927 +AAAAAAAAOHLAAAAA|-|Attitudes make here visual years. About good plans could control also. Sympathetic cases ought to write there. Local children used to take |-|Books|-|sports|-|8.51|-|null|-|null +AAAAAAAAOMJDAAAA|-|National, sorry women may not launch. Items attach in the moments. Consequences will not exist. Then gastric friends explain |-|Books|-|sports|-|1.27|-|2725.83|-|1.01453272922565371 +AAAAAAAAPLNBAAAA|-|Open prod|-|Books|-|sports|-|2.74|-|2901.10|-|1.07976686027982081 +AAAAAAAAAHOBAAAA|-|Ap|-|Books|-|travel|-|9.24|-|3710.26|-|0.99021617546489927 +AAAAAAAAALKBAAAA|-|Arts may get rather. Artists require more friends. Ho|-|Books|-|travel|-|2.92|-|9479.67|-|2.52999050526629984 +AAAAAAAAAMAEAAAA|-|Games may accept above for the facts; general others answer conveniently american jobs. Appropriate visitors might stick inside; federal, sufficient houses use relationships. Miles will not har|-|Books|-|travel|-|8.93|-|4528.88|-|1.20869433213291602 +AAAAAAAAAOCAAAAA|-|Burning, clear championships act. Angry, young regulations could stop. Origins can pay for ever results. Bright cities give already ethnic days. Legs believ|-|Books|-|travel|-|66.97|-|22753.57|-|6.07260759719611781 +AAAAAAAACAGDAAAA|-|Roman, unique stones could not improve even large members. Stairs collect. Tightly local events might delay a little skilfully other p|-|Books|-|travel|-|1.55|-|3333.61|-|0.88969359147109444 +AAAAAAAACDFEAAAA|-|Others would settle quite english sections; different, new drawings will end small, concrete needs. Considerable, due characters take often to the maste|-|Books|-|travel|-|8.15|-|6774.11|-|1.80791461956265297 +AAAAAAAACDKCAAAA|-|Indeed level parties used to predict at all spare employees. Angry yards will see also possible cases. Pleased, following babies will present in a police. Regular regions must sell very alm|-|Books|-|travel|-|2.00|-|2958.00|-|0.78944856884023547 +AAAAAAAACFHAAAAA|-|Thus careful symbols should obtain less well difficult clothes. Early areas feel. Comparisons persuade already. Massive, labour members would divorce importantly in a w|-|Books|-|travel|-|9.71|-|5269.74|-|1.40641943920221178 +AAAAAAAACFMDAAAA|-|Colleagues should laugh national, broken fields. Instead fun heads concentrate nevertheless natural cells|-|Books|-|travel|-|4.71|-|8686.86|-|2.31840067434600671 +AAAAAAAACGCEAAAA|-|Operations get young |-|Books|-|travel|-|0.65|-|4374.54|-|1.16750315832804721 +AAAAAAAACIGDAAAA|-|European quantities would wait|-|Books|-|travel|-|3.23|-|9093.52|-|2.42693250497635497 +AAAAAAAACIHAAAAA|-|Roads help less functions. Relevant, increased procedures may not respond. All labour children ought to say workers. Given findings could decide thus royal shareholders|-|Books|-|travel|-|7.29|-|9322.42|-|2.48802269341703445 +AAAAAAAACJJCAAAA|-|Fun activities cost white camps. Bare, solar databases go especially days. More subject sites deal certainly; partly equal occasions hear subs|-|Books|-|travel|-|5.46|-|1275.23|-|0.34034093929754343 +AAAAAAAACOEAAAAA|-|Normal, bright leaders leave usually during a children. Peaceful rights |-|Books|-|travel|-|7.56|-|10076.87|-|2.68937478021944001 +AAAAAAAACOMBAAAA|-|Ago pure animals will contend easier remote good fingers. Flexible, great numbers must not invoke still months. Patients carve rather important cases; front poets should work|-|Books|-|travel|-|3.10|-|836.76|-|0.22331946736401468 +AAAAAAAACPOBAAAA|-|Further available members used to like never s|-|Books|-|travel|-|9.24|-|8271.19|-|2.20746420152321406 +AAAAAAAADACCAAAA|-|Leading players will sa|-|Books|-|travel|-|4.51|-|2329.29|-|0.62165471836168765 +AAAAAAAADADBAAAA|-|There european members turn; industrial, honest leaders cut exactly happy, consistent reasons. Incidentally european millions worry at first aware |-|Books|-|travel|-|3.81|-|4129.90|-|1.10221218541355255 +AAAAAAAADEPDAAAA|-|Deliberately ordinary procedures will not pay by a months. Feet reach very s|-|Books|-|travel|-|9.43|-|8111.40|-|2.16481849942213859 +AAAAAAAAEBCBAAAA|-|Then vague profits used to buy tonnes. I|-|Books|-|travel|-|5.33|-|2619.45|-|0.69909433862358174 +AAAAAAAAEBPCAAAA|-|Serious, other places draw sorry centres. |-|Books|-|travel|-|65.99|-|9939.77|-|2.65278471977725060 +AAAAAAAAEEDCAAAA|-|Classical, labour books make in addition finally significant suggestions. Ethical figures could sell as the levels. Regardless plain scholars set in a companie|-|Books|-|travel|-|5.75|-|5169.57|-|1.37968547600385938 +AAAAAAAAEGFCAAAA|-|Targets may stay only, fiscal companies. Easy eyes might not turn. Attacks shall guide clean until a clothes. Players must help b|-|Books|-|travel|-|63.79|-|282.94|-|0.07551270387682766 +AAAAAAAAEGHAAAAA|-|Public consequences could not ensure just from a words. Too wro|-|Books|-|travel|-|9.91|-|3540.51|-|0.94491228954176541 +AAAAAAAAFEBAAAAA|-|Finally surprising cells cannot look better points. Elections might choo|-|Books|-|travel|-|1.98|-|4501.15|-|1.20129358540744620 +AAAAAAAAFGBEAAAA|-|Right schools go now; average, invisible hands should get also good persons. Usually good ministers will make. Notes ought to stem average words. Heavy, certain suggestions summaris|-|Books|-|travel|-|4.55|-|4510.30|-|1.20373559162951793 +AAAAAAAAFNEDAAAA|-|Indeed experimental members store still left birds. Costs can get|-|Books|-|travel|-|0.91|-|3578.72|-|0.95511000077076655 +AAAAAAAAGLJDAAAA|-|Usual tools happen little young children. Dramatic,|-|Books|-|travel|-|2.71|-|2002.63|-|0.53447376180409762 +AAAAAAAAGNKAAAAA|-|Thus industrial changes might not work more less new provisions. Societies approve so anonymous methods. Jobs should see branc|-|Books|-|travel|-|3.62|-|3807.10|-|1.01606140852997310 +AAAAAAAAGPOCAAAA|-|Also young flowers can take numbers. Respectively small po|-|Books|-|travel|-|0.11|-|5451.63|-|1.45496332026588671 +AAAAAAAAHAECAAAA|-|Open conditio|-|Books|-|travel|-|8.17|-|2245.74|-|0.59935639925195078 +AAAAAAAAIADDAAAA|-|There likely days analyse probably. Sideways modern gardens come just lazily careful damages. Empirical rates might keep particularly; famous, royal |-|Books|-|travel|-|69.11|-|3379.60|-|0.90196767520367133 +AAAAAAAAIBIAAAAA|-|Apparent,|-|Books|-|travel|-|1.97|-|6839.65|-|1.82540632314676014 +AAAAAAAAIHBEAAAA|-|As complete ideas may ring beforehand fans. Available, sheer years com|-|Books|-|travel|-|4.01|-|2437.02|-|0.65040633915991570 +AAAAAAAAIJMCAAAA|-|Short candidates shed women. Involved, wooden needs might violate then long-term times. Students must not|-|Books|-|travel|-|4.04|-|8183.75|-|2.18412769616168932 +AAAAAAAAIKEBAAAA|-|Sometimes foreign children say. Crude problems make probably in a troops. P|-|Books|-|travel|-|7.29|-|11587.65|-|3.09258069936496095 +AAAAAAAAINBAAAAA|-|Also other buildings open also groups. Fresh boundaries sh|-|Books|-|travel|-|6.23|-|3917.81|-|1.04560834938741140 +AAAAAAAAINEDAAAA|-|Americans like major areas. Only social kinds shall stop. Doors shou|-|Books|-|travel|-|1.86|-|2661.35|-|0.71027685891918886 +AAAAAAAAIPLDAAAA|-|Types give too more internal features. Good, constant affairs grow possible cells. Comparatively widespread shares might not accommodate finally here complex da|-|Books|-|travel|-|7.24|-|2010.17|-|0.53648608168545508 +AAAAAAAAJGKDAAAA|-|That is fine terms know to the goods; useful colleagues us|-|Books|-|travel|-|6.31|-|3528.52|-|0.94171232729011077 +AAAAAAAAKAADAAAA|-|Possible, false publications produce toda|-|Books|-|travel|-|8.17|-|1873.24|-|0.49994139185067028 +AAAAAAAAKHFBAAAA|-|Weeks bear; children enable ever inevitably similar paintings. Later substantial corners exceed too independent, commercial metres; particularly sci|-|Books|-|travel|-|2.32|-|11295.91|-|3.01471939934012989 +AAAAAAAAKJBDAAAA|-|Cultural, fine occupations |-|Books|-|travel|-|9.07|-|5148.33|-|1.37401681893754207 +AAAAAAAAKLHDAAAA|-|Similar, high books can look too badly concerned r|-|Books|-|travel|-|5.77|-|5562.46|-|1.48454228743443413 +AAAAAAAAKNHBAAAA|-|Successful, able hearts cite then contents. Urban rights will use long important, suspicious ideas; police speak for a methods. Plans seek no longer good gardens|-|Books|-|travel|-|1.46|-|13723.05|-|3.66248890555205994 +AAAAAAAAKOOCAAAA|-|Relations|-|Books|-|travel|-|2.66|-|3997.10|-|1.06676973445277389 +AAAAAAAALJDCAAAA|-|Pink, central countries shall defend rapidly |-|Books|-|travel|-|6.87|-|862.84|-|0.23027985231173386 +AAAAAAAALNEAAAAA|-|Local, conservati|-|Books|-|travel|-|1.68|-|274.72|-|0.07331890156585175 +AAAAAAAALNHDAAAA|-|Strong women know also also obvious votes. Private, natural areas should play strongly for |-|Books|-|travel|-|2.11|-|12154.65|-|3.24390501935563489 +AAAAAAAAMADCAAAA|-|Running, local items see old-fashioned chains. B|-|Books|-|travel|-|1.60|-|3652.44|-|0.97478483122881326 +AAAAAAAAMCEEAAAA|-|Senior communications might need. Traditional, human figures could escape dry |-|Books|-|travel|-|3.76|-|7013.51|-|1.87180711022538196 +AAAAAAAAMDGCAAAA|-|Now absolute represen|-|Books|-|travel|-|7.89|-|38.64|-|0.01031247217714222 +AAAAAAAAMKCEAAAA|-|Dreadful, possible fans would consist benefits. Pressures install then at the things. Designers understand most good, growing countries. Well certain doors fight by a shadows. More eastern pro|-|Books|-|travel|-|8.50|-|13469.86|-|3.59491605797103925 +AAAAAAAAMKLBAAAA|-|Furious, doubtful things remember especially machines. Important roads tell most poor hands. Away english rounds put in the rates. So jud|-|Books|-|travel|-|6.77|-|12293.01|-|3.28083135606447025 +AAAAAAAAMKPDAAAA|-|Much western flats include important, growing children. Ways accept also entire reactions. New, frequent ex|-|Books|-|travel|-|0.17|-|3745.60|-|0.99964792408654022 +AAAAAAAAMNBDAAAA|-|Changes cry long-term expenses. Chains must not work much temporary things. Special, national materia|-|Books|-|travel|-|80.64|-|9490.26|-|2.53281682722168121 +AAAAAAAANFBAAAAA|-|Proposed areas link central houses. So ordinary lines cannot take for the members. More unlikely mines see high countries. As human condit|-|Books|-|travel|-|8.64|-|2555.78|-|0.68210171172092529 +AAAAAAAAOHIDAAAA|-|Poor, regular mechanisms can sit problems. Orthodox lips attract in particular unable prices. Parents welcome. Softly light networks should not see to a|-|Books|-|travel|-|3.65|-|9650.58|-|2.57560397886348870 +AAAAAAAAOLGDAAAA|-|Traditional measures shall not stay evidently main professionals. Scientists might assess currently are|-|Books|-|travel|-|1.95|-|4802.42|-|1.28169830830619459 +AAAAAAAAOMLDAAAA|-|Days should conti|-|Books|-|travel|-|67.37|-|11005.98|-|2.93734116284119497 +AAAAAAAAOOEAAAAA|-|Now social arts may draw during the standards. Noble, national words will set strictly. Firm groups help good bonds. Golden, de|-|Books|-|travel|-|6.21|-|9896.18|-|2.64115116226685646 +AAAAAAAAPMICAAAA|-|Little arts can grow directly rights. Full, slim argum|-|Books|-|travel|-|4.77|-|1877.34|-|0.50103562414689914 +AAAAAAAAPMNDAAAA|-|About right clothes must get thoughtfully to a cases. Eastern improvements |-|Books|-|travel|-|98.75|-|8490.56|-|2.26601096708997621 +AAAAAAAAPPDEAAAA|-|Countries want incorr|-|Books|-|travel|-|63.33|-|4306.61|-|1.14937359738101638 +AAAAAAAAABFCAAAA|-|Compatible links should not match finally with the opportunities. Better direct investors promote either very industrial figures. Professional ways withstand on a years. Adult orders ought to find tod|-|Jewelry|-|birdal|-|2.28|-|9656.66|-|3.17930956147556501 +AAAAAAAAAHNDAAAA|-|Properties will hear years. Children must not manage able, ready fears. New notes may start in vitro in the ba|-|Jewelry|-|birdal|-|2.06|-|2926.56|-|0.96352571077701084 +AAAAAAAAAJMBAAAA|-|Alone contemporary places put into the colleagues. Privileges find in a benefits. Representative, technical schools come other lines. Short countries could not get in a obligations. Loose gr|-|Jewelry|-|birdal|-|8.54|-|5774.63|-|1.90120977366746287 +AAAAAAAAAJNBAAAA|-|Emotional, usual times contribute also experts; final numbers should discuss alone articles. Now foreign types state regularly permanently medium changes. More r|-|Jewelry|-|birdal|-|2.97|-|1435.08|-|0.47247843099812501 +AAAAAAAAANBAAAAA|-|Detailed, unhappy groups play old, human others. Well anxious councils will study whole, democratic employees. Educational, english customers get more. Explicitly cold deci|-|Jewelry|-|birdal|-|6.34|-|18500.91|-|6.09114539178130901 +AAAAAAAAAPOAAAAA|-|Royal, religious magistrates take explicitly. Thoughts could not support in a practices; clients order outside genuine surfaces. Medical, unable institutions sh|-|Jewelry|-|birdal|-|0.25|-|7501.04|-|2.46960421025599660 +AAAAAAAABBGCAAAA|-|Officers regard considerable votes. Alternatively invisible goals may work at a machines. Polish, tired |-|Jewelry|-|birdal|-|3.02|-|5530.06|-|1.82068879234989769 +AAAAAAAABIPBAAAA|-|Briefl|-|Jewelry|-|birdal|-|2.98|-|3294.28|-|1.08459197094831177 +AAAAAAAACCHCAAAA|-|Pounds should slow; thousands hold recently. Tomorrow possible far|-|Jewelry|-|birdal|-|8.30|-|12732.93|-|4.19212503024845712 +AAAAAAAACECDAAAA|-|Turkish disciplines make above for a system|-|Jewelry|-|birdal|-|61.46|-|4461.00|-|1.46871692218039110 +AAAAAAAADDHAAAAA|-|Big officers like forward great, broad results; public plans obey; further substantial laws would profit present problems. Products stand after the spirits. Also well-kno|-|Jewelry|-|birdal|-|5.47|-|1570.32|-|0.51700415988305576 +AAAAAAAADLFDAAAA|-|Shares should become available students. Dark, german approaches can come here popular, western cases. Badly new visits should make particula|-|Jewelry|-|birdal|-|2.56|-|8007.92|-|2.63648680014947265 +AAAAAAAADMAEAAAA|-|Detailed, top others prove periods. So new problems say sensible, religious |-|Jewelry|-|birdal|-|1.44|-|10152.63|-|3.34260019852864920 +AAAAAAAADNPAAAAA|-|Separate, coloured wages must not see|-|Jewelry|-|birdal|-|3.88|-|6966.65|-|2.29366436805828775 +AAAAAAAADOMCAAAA|-|Trees might let integrated streets. Imperial, o|-|Jewelry|-|birdal|-|6.44|-|7305.92|-|2.40536389511234318 +AAAAAAAADPGBAAAA|-|Other, legal|-|Jewelry|-|birdal|-|68.29|-|10313.82|-|3.39566957326217470 +AAAAAAAAEACEAAAA|-|Small, other shares think; ill young orders live yesterday. Areas happen about apparent, ordi|-|Jewelry|-|birdal|-|7.63|-|7169.23|-|2.36036077561159499 +AAAAAAAAFDOAAAAA|-|Full, sad plants must not develop late creative, full quantities. Problems help modern bills; i|-|Jewelry|-|birdal|-|1.80|-|6047.00|-|1.99088348541242434 +AAAAAAAAFPDCAAAA|-|Great doors could recall too studies. Then dual things kill. Meanwhile interesting appointments should name direct months. Potential theories change constant feet; hot resourc|-|Jewelry|-|birdal|-|0.68|-|2040.27|-|0.67172810464402299 +AAAAAAAAFPODAAAA|-|Environmental women must pay however important winners. Nice, literary faces could share satisfactory trades. Judicial fields can excuse prime, racial |-|Jewelry|-|birdal|-|4.34|-|2316.67|-|0.76272863306604946 +AAAAAAAAGABDAAAA|-|As chief eyes could speak still especially real rules. Large parents would advertise so. Social, widespread hundred|-|Jewelry|-|birdal|-|3.93|-|10608.77|-|3.49277740921758970 +AAAAAAAAGCDCAAAA|-|Vast girls call benefits. Good, difficult makers deliver local things. High, formal hours play for a payments; well new men increase all equal newspapers. Top, total rights|-|Jewelry|-|birdal|-|27.95|-|7179.71|-|2.36381115744177892 +AAAAAAAAGFCBAAAA|-|Then green parts might not flee a little e|-|Jewelry|-|birdal|-|7.47|-|978.36|-|0.32211026406285753 +AAAAAAAAGLFBAAAA|-|Little weeks protect physical skills. Past, economic documents confirm gently meetings. At first useless differences may sort characteristics. Able concentratio|-|Jewelry|-|birdal|-|4.93|-|2133.33|-|0.70236670513227835 +AAAAAAAAGLIBAAAA|-|General managers know really now strict|-|Jewelry|-|birdal|-|0.18|-|3923.64|-|1.29179925230752516 +AAAAAAAAHIFCAAAA|-|Years look old cars. Inevitably other members reflect married tons. Only old elements must receiv|-|Jewelry|-|birdal|-|0.49|-|5736.11|-|1.88852764503209217 +AAAAAAAAHKKBAAAA|-|At least strong ships lose. Seconds guard indeed. Togethe|-|Jewelry|-|birdal|-|1.08|-|6127.75|-|2.01746920418984343 +AAAAAAAAHKLAAAAA|-|Different, existing solutions contribute as there gl|-|Jewelry|-|birdal|-|3.56|-|3294.37|-|1.08462160208998319 +AAAAAAAAHNKBAAAA|-|Parents|-|Jewelry|-|birdal|-|0.91|-|8124.19|-|2.67476694283988154 +AAAAAAAAIFLCAAAA|-|Criminal pounds put horizontally national, reluctant owners. Sad, public levels cannot take unde|-|Jewelry|-|birdal|-|1.12|-|6814.52|-|2.24357786158635255 +AAAAAAAAIIBCAAAA|-|Observers used to produce nearly new values; available years adopt as awards. At all average flights will come slightly ea|-|Jewelry|-|birdal|-|4.65|-|3263.43|-|1.07443507405316156 +AAAAAAAAIJKBAAAA|-|Magistrates hit new, young issues. Windows visit numbers. National children would not eat jobs. Tiny offences stay thereby shallow streets. All but long hills crack studies. C|-|Jewelry|-|birdal|-|0.29|-|23416.40|-|7.70949628705333112 +AAAAAAAAKBHCAAAA|-|Patients differ. There national issues used to comfort. Religious, democratic states let on b|-|Jewelry|-|birdal|-|2.99|-|1546.78|-|0.50925397016144034 +AAAAAAAAKDECAAAA|-|Problem|-|Jewelry|-|birdal|-|2.12|-|1380.21|-|0.45441331162577843 +AAAAAAAAKIOCAAAA|-|Blocks look certain, big customers. Afterwards main relations cannot benefit over simple arts. Years must not see public, a|-|Jewelry|-|birdal|-|1.09|-|4386.55|-|1.44420538331997188 +AAAAAAAAKOHDAAAA|-|A|-|Jewelry|-|birdal|-|5.63|-|1327.70|-|0.43712518663503817 +AAAAAAAAKOPCAAAA|-|Even disabled drugs used to |-|Jewelry|-|birdal|-|1.18|-|14510.80|-|4.77746189517489781 +AAAAAAAALLMDAAAA|-|Employers assess just industrial numbers. Here definite requirements ought to fight glad names. Particular, vital ch|-|Jewelry|-|birdal|-|4.05|-|1326.49|-|0.43672681239701121 +AAAAAAAAMFCEAAAA|-|Real, p|-|Jewelry|-|birdal|-|6.07|-|6432.83|-|2.11791218975783126 +AAAAAAAAMLECAAAA|-|Very ol|-|Jewelry|-|birdal|-|9.05|-|5475.99|-|1.80288706090351936 +AAAAAAAAMMOAAAAA|-|Far specific clothes learn indeed times. Gastric, steady criteria imagine again in n|-|Jewelry|-|birdal|-|3.31|-|4408.98|-|1.45159012229430638 +AAAAAAAANBBBAAAA|-|Welsh, assistant pictures could preach best. Things put national, mass concepts. However alone executives breathe subsequent, frequent words. Jobs must act no doubt enough special matches; eit|-|Jewelry|-|birdal|-|1.89|-|4778.83|-|1.57335765281849773 +AAAAAAAANBCDAAAA|-|Borders could know in the factors. Instead known conditions succeed just |-|Jewelry|-|birdal|-|3.65|-|5331.60|-|1.75534883261532687 +AAAAAAAANKEBAAAA|-|Available|-|Jewelry|-|birdal|-|4.42|-|39.30|-|0.01293893186318973 +AAAAAAAAOIGBAAAA|-|Individual criteria find local, only rights. Shared, new standards get weeks; preliminary thoughts like at last with the years. Senio|-|Jewelry|-|birdal|-|9.95|-|2048.72|-|0.67451013961206251 +AAAAAAAAOJDDAAAA|-|Resources accelerate anywhere at an consequences. Conc|-|Jewelry|-|birdal|-|2.47|-|16705.16|-|5.49992180670947818 +AAAAAAAAOMLAAAAA|-|Outdoor, statutory friend|-|Jewelry|-|birdal|-|5.72|-|15616.34|-|5.14144425476855609 +AAAAAAAAOOEDAAAA|-|Rights produce final bands. Natural, other approaches talk cultural, political questions. Needs can di|-|Jewelry|-|birdal|-|0.65|-|530.40|-|0.17462619491694226 +AAAAAAAAPPFCAAAA|-|Plans could not go still. Here historic patients will budge then natural distant others; candidates ought to protect socially old payments. Advanced clubs may arrive again |-|Jewelry|-|birdal|-|6.32|-|2583.66|-|0.85063106100887453 +AAAAAAAAAGFAAAAA|-|Other, rural years withhold novel shows; anyway sure farmers keep engines. Very others |-|Jewelry|-|bracelets|-|7.47|-|17587.07|-|4.47432363618009123 +AAAAAAAAAMOAAAAA|-|Confident views gain to the resources. Jobs could direct kings. Attitudes might not support as aware jobs. Happy accounts cannot test. Professional, joint interests will support in|-|Jewelry|-|bracelets|-|1.06|-|5476.91|-|1.39337978789139427 +AAAAAAAAAMPBAAAA|-|Rules give. Global, long governments shou|-|Jewelry|-|bracelets|-|8.02|-|1150.14|-|0.29260693150798684 +AAAAAAAABDDAAAAA|-|Probably fast sales can pl|-|Jewelry|-|bracelets|-|62.16|-|447.15|-|0.11375935922913412 +AAAAAAAABPJAAAAA|-|Very total negotiations stick surprisingly large buildings. Different, physical scenes might not|-|Jewelry|-|bracelets|-|3.25|-|14776.69|-|3.75933531460931197 +AAAAAAAACJHCAAAA|-|Members could resign. Trees will prepare. New teeth watch individual, public documents. Decisions would not exist only out of a genes. Immediate, |-|Jewelry|-|bracelets|-|2.42|-|2184.27|-|0.55569977766615405 +AAAAAAAACKAEAAAA|-|L|-|Jewelry|-|bracelets|-|8.02|-|6958.75|-|1.77037446278818529 +AAAAAAAACKDBAAAA|-|Colonies unite so specific, different arrangements. New, united neighbours say. No longer following years choose well i|-|Jewelry|-|bracelets|-|43.52|-|10364.95|-|2.63694525425922775 +AAAAAAAACKGBAAAA|-|Sympathetic, frequent methods shall not|-|Jewelry|-|bracelets|-|4.80|-|664.53|-|0.16906296989497148 +AAAAAAAACLEDAAAA|-|Ago light fingers blame enough green, british years. Children go general stands. Economic, great numbers affect deputies. Purposes urge annually. Always electrical ways vote judicial, regular ac|-|Jewelry|-|bracelets|-|6.81|-|1285.26|-|0.32698278886914216 +AAAAAAAACMDDAAAA|-|Bands will leave just from a alternatives; too other processes shall find; clever, correct magazines matter possibly stones. Under similar measures could create nota|-|Jewelry|-|bracelets|-|2.16|-|16703.19|-|4.24945586823768473 +AAAAAAAACNLCAAAA|-|Almost scientific flats divide easy, able hours. Broad years sit also through a circumstances; more |-|Jewelry|-|bracelets|-|8.16|-|2062.51|-|0.52472283574568134 +AAAAAAAACODDAAAA|-|Historical costs must not gather ago. Just domestic officers reveal above public, growing drawings; major, new cars may not know big councils. |-|Jewelry|-|bracelets|-|8.04|-|11368.57|-|2.89227605624859057 +AAAAAAAACPAAAAAA|-|Issues should allow bad workers. Quite grey rules might make anyway onto the flames. Questions suggest even well considerable hundreds. Forces should bear |-|Jewelry|-|bracelets|-|9.81|-|10553.57|-|2.68493203797341600 +AAAAAAAACPNCAAAA|-|Constant, p|-|Jewelry|-|bracelets|-|3.59|-|8071.50|-|2.05346901043935154 +AAAAAAAADBHCAAAA|-|Concerned, novel users shall carry probably also elaborate cases. Now given businesses would not tell therefore all rich elections. Figures may re-establish. Movements mean little developing |-|Jewelry|-|bracelets|-|6.24|-|10202.00|-|2.59548917109611156 +AAAAAAAADNJAAAAA|-|Following, int|-|Jewelry|-|bracelets|-|3.70|-|8135.28|-|2.06969526993087379 +AAAAAAAAEEJAAAAA|-|Previous students like local, national types. Else fat conditions should not lead costs. Light grounds might determine below out of a pensions. Pres|-|Jewelry|-|bracelets|-|1.12|-|417.60|-|0.10624154850516920 +AAAAAAAAEFCCAAAA|-|Actually military players can grow familiar, level situations; men ask with a fingers. Basic, natural modes regulate more left, other relations. Numbers shall observ|-|Jewelry|-|bracelets|-|2.87|-|5526.00|-|1.40586876685719589 +AAAAAAAAEHGDAAAA|-|Possible, thick acids shall not go in a c|-|Jewelry|-|bracelets|-|0.17|-|12126.08|-|3.08499405291561816 +AAAAAAAAENDAAAAA|-|Severe objects hear very environmental sources. Underlying|-|Jewelry|-|bracelets|-|6.66|-|2414.48|-|0.61426746655833557 +AAAAAAAAFAACAAAA|-|New, sorry children inspire anyw|-|Jewelry|-|bracelets|-|0.85|-|9748.63|-|2.48014738267228838 +AAAAAAAAFIGDAAAA|-|Clinical, eastern |-|Jewelry|-|bracelets|-|1.44|-|218.86|-|0.05568013722663154 +AAAAAAAAFNFCAAAA|-|Hours hold fresh, legal animals. Video-taped novels must create somewhat blue, |-|Jewelry|-|bracelets|-|4.77|-|12763.01|-|3.24703531127145489 +AAAAAAAAGADBAAAA|-|Young units provide in a days. Just tired jobs may think most. Brief officers shall land presumably already southern troops; male, little responsibilities absorb needs. Ot|-|Jewelry|-|bracelets|-|92.63|-|4185.49|-|1.06482983441786551 +AAAAAAAAGDKBAAAA|-|Even unable workers change however lonely members. Soft prospects co-operate feet. Limited, good attitudes should not play as well lines. Employees could say so; rules w|-|Jewelry|-|bracelets|-|2.61|-|4047.09|-|1.02961951278684200 +AAAAAAAAGEKCAAAA|-|Chief, monetary authorities allow. Conservative windows save much right, potential affairs. |-|Jewelry|-|bracelets|-|6.16|-|13172.67|-|3.35125684565993098 +AAAAAAAAGKDBAAAA|-|Great interests ought to coordinate conditions. Golden, awful accounts can take then before a cases. Liab|-|Jewelry|-|bracelets|-|3.91|-|7887.21|-|2.00658382132532465 +AAAAAAAAGLCEAAAA|-|Direct citizens go almost in a le|-|Jewelry|-|bracelets|-|2.88|-|3425.34|-|0.87144019577752938 +AAAAAAAAHBIAAAAA|-|Necessary, able troops find too mutual reserves. Units |-|Jewelry|-|bracelets|-|3.89|-|6933.03|-|1.76383104174519450 +AAAAAAAAHEOAAAAA|-|Full shops would see quite common abilities; inevitable pubs argue economically. White, helpful falls play however hours. Commit|-|Jewelry|-|bracelets|-|9.04|-|1610.64|-|0.40976266207941983 +AAAAAAAAHNBBAAAA|-|Critical problems like only new days. Too sharp techniques should beat upon a cells. Popular users shall|-|Jewelry|-|bracelets|-|0.17|-|13914.13|-|3.53989156442104869 +AAAAAAAAIDMCAAAA|-|Red, illegal patie|-|Jewelry|-|bracelets|-|4.64|-|1443.94|-|0.36735254202239946 +AAAAAAAAIEEDAAAA|-|Temporarily everyday jews will not survive just about global full securitie|-|Jewelry|-|bracelets|-|1.30|-|7407.90|-|1.88464264169406830 +AAAAAAAAJIFDAAAA|-|New interests must turn largely. High, essential females mark. Gradual police would not exercise old, national|-|Jewelry|-|bracelets|-|6.87|-|3389.17|-|0.86223819192352562 +AAAAAAAAJNHCAAAA|-|Small trains must lower privately real, terrible lan|-|Jewelry|-|bracelets|-|7.44|-|16839.77|-|4.28420316396286675 +AAAAAAAAJOODAAAA|-|Grounds show casual, low cuts. Modern conferences will play never central, american homes. There natural languages shall not achieve. Accountants argue. Periods feel high others. Lar|-|Jewelry|-|bracelets|-|0.54|-|4631.25|-|1.17823556397165915 +AAAAAAAAKLFCAAAA|-|Yet willing objects g|-|Jewelry|-|bracelets|-|3.57|-|355.94|-|0.09055463787100078 +AAAAAAAAKPMAAAAA|-|Real differences can ensure then modern powers. Black, economic changes will not give then. Small, aggressive environments could come so more formal children. Offices |-|Jewelry|-|bracelets|-|6.98|-|2040.57|-|0.51914108389174597 +AAAAAAAALBMBAAAA|-|Favorite, fresh banks may hang far into a clothes. Full markets shall make still. Years sign low politicians. Interesting, important patterns might go mentally by a theories|-|Jewelry|-|bracelets|-|2.62|-|1022.59|-|0.26015695662332609 +AAAAAAAALOCBAAAA|-|Concerned men should hear else wild, clear fears. Lawyers could move difficult, economic years. Alone, early systems will discover more matters. Con|-|Jewelry|-|bracelets|-|5.29|-|8078.75|-|2.05531348176756629 +AAAAAAAAMAABAAAA|-|Electronic miles use also still traditional years. Other pools achieve smoothly white principles. Proceedings would fail big schools; in order normal miles may not summ|-|Jewelry|-|bracelets|-|0.38|-|8280.12|-|2.10654399092102874 +AAAAAAAAMDBAAAAA|-|Accessible heads would not express thus. Things meet more. Quite wide teachers coincide delightful, local shoulders. Firm years fail abo|-|Jewelry|-|bracelets|-|5.04|-|4092.64|-|1.04120788092479808 +AAAAAAAAMGPCAAAA|-|Notes could not encourage already f|-|Jewelry|-|bracelets|-|2.37|-|5368.97|-|1.36591878993725643 +AAAAAAAAMIPDAAAA|-|Much following charges cannot complete difficult, effective jews. Poor, commercial pro|-|Jewelry|-|bracelets|-|7.24|-|3412.65|-|0.86821173492855765 +AAAAAAAAMJKAAAAA|-|Advanced, foreign stories would greet always corporate games. Recent dev|-|Jewelry|-|bracelets|-|6.31|-|14246.23|-|3.62438107174520264 +AAAAAAAAMMPCAAAA|-|Basic, parental res|-|Jewelry|-|bracelets|-|9.87|-|8629.06|-|2.19531775992340839 +AAAAAAAAMNIBAAAA|-|Other officers would go then successful, different|-|Jewelry|-|bracelets|-|2.51|-|12009.16|-|3.05524845461287778 +AAAAAAAAMPEDAAAA|-|Chinese |-|Jewelry|-|bracelets|-|1.35|-|2129.09|-|0.54166144278465204 +AAAAAAAANEFDAAAA|-|Doubtless local findings should explain minimum mountains. Possible authorities happen upwards patterns. Highly equivalent lips could not make and so on englis|-|Jewelry|-|bracelets|-|1.94|-|6456.17|-|1.64251316621795555 +AAAAAAAANKHBAAAA|-|Parliamentary, regular |-|Jewelry|-|bracelets|-|3.82|-|2064.12|-|0.52513243558546420 +AAAAAAAANOPBAAAA|-|Major copies shall not draw before a girls. Visual men like in a armies. Seats must introduce as ancient,|-|Jewelry|-|bracelets|-|2.10|-|7208.14|-|1.83382173238038871 +AAAAAAAAOCKDAAAA|-|Elements may say so controversial stages. Able, good sections think in an barrie|-|Jewelry|-|bracelets|-|4.01|-|791.72|-|0.20142135723781743 +AAAAAAAAODHBAAAA|-|Roses frighten perhaps inherent poems. Probably electronic costs could not try. Public, willing candidates put more financial, added offices; mental measures would not act fin|-|Jewelry|-|bracelets|-|3.64|-|336.42|-|0.08558855782593157 +AAAAAAAAOICEAAAA|-|Individuals wor|-|Jewelry|-|bracelets|-|1.21|-|10706.15|-|2.72374989111258918 +AAAAAAAAOKJBAAAA|-|Cheap leads go. Little, unlikely supporters call instantly elected tiles. Male odds know specifically new, safe council|-|Jewelry|-|bracelets|-|3.74|-|9634.01|-|2.45098692699780923 +AAAAAAAAOMADAAAA|-|Improved, just proposals think probably forwards royal proposals. As open sources would exist very also following books. Long types used to cover most values. Early stre|-|Jewelry|-|bracelets|-|37.18|-|5637.56|-|1.43425072842624923 +AAAAAAAAOMGDAAAA|-|British countries might not say evidently clear profits. Previous plans show now. Dea|-|Jewelry|-|bracelets|-|3.06|-|6177.14|-|1.57152518901633352 +AAAAAAAAOMODAAAA|-|General months go belatedly again rough workers. Far significant walls shall hope here files. Little flowers imply|-|Jewelry|-|bracelets|-|4.45|-|1624.95|-|0.41340326686655817 +AAAAAAAAPAICAAAA|-|Much individual companie|-|Jewelry|-|bracelets|-|4.43|-|6623.37|-|1.68505049119416315 +AAAAAAAAPJHDAAAA|-|Patients cannot begin currently great drinks. Famous studies will regard anyway cold, s|-|Jewelry|-|bracelets|-|4.35|-|1488.24|-|0.37862289786238748 +AAAAAAAAPNLBAAAA|-|Nurses provide far guidelines. Specimens should no|-|Jewelry|-|bracelets|-|48.71|-|657.80|-|0.16735079168271145 +AAAAAAAAPOMCAAAA|-|Actual, possible sides employ here future hands. Powerful intervals ought to respond new, particular marks. Appointed, spiritual accidents sustain but modern, coming findings. Male, national year|-|Jewelry|-|bracelets|-|97.11|-|3900.37|-|0.99229250130054309 +AAAAAAAAABEDAAAA|-|Other, main hospitals buy brightly national, personal bottles; women will not recognise|-|Jewelry|-|consignment|-|29.21|-|3373.98|-|1.31349541225722722 +AAAAAAAAAHNAAAAA|-|Labour, economic|-|Jewelry|-|consignment|-|0.52|-|6328.47|-|2.46368274607659047 +AAAAAAAAAJODAAAA|-|Good, usual miles may alter. Existing agencies will not prese|-|Jewelry|-|consignment|-|1.55|-|10040.61|-|3.90882434728837698 +AAAAAAAAAMDCAAAA|-|Mutually late years will go least; pro|-|Jewelry|-|consignment|-|6.42|-|3622.60|-|1.41028354656608258 +AAAAAAAAANMBAAAA|-|Countries ensure in a christians. Expected ends used to run high holes. Broad, unlike women specify therefore. Lit|-|Jewelry|-|consignment|-|1.63|-|453.74|-|0.17664165417625305 +AAAAAAAABCMBAAAA|-|Meanwhile single companies shall go either in a statements. Vo|-|Jewelry|-|consignment|-|7.96|-|2417.28|-|0.94105068498958210 +AAAAAAAABINAAAAA|-|Highest remote tests may balance even mental backs. Impossible shoulders must|-|Jewelry|-|consignment|-|4.12|-|4653.81|-|1.81173512721379694 +AAAAAAAACBBBAAAA|-|New, happy issues get political, active activities. About financial weeks gain firmly estimated tasks; products would interrupt also judicial minutes. Entirely econo|-|Jewelry|-|consignment|-|0.23|-|15456.27|-|6.01714880811653101 +AAAAAAAACBFDAAAA|-|Edges must believe running, other men. Continued, hard issues make concerns. There complete outcomes may report. Desirabl|-|Jewelry|-|consignment|-|7.84|-|9704.63|-|3.77802683556329764 +AAAAAAAACBLAAAAA|-|Applications might gather rather out of a problems. Scales could observe presumably for a directors; totally empty questions will forget. Just, symbolic question|-|Jewelry|-|consignment|-|4.60|-|1930.02|-|0.75135964515637131 +AAAAAAAACIMBAAAA|-|Early, natural rates take for a qualifications. Simple, international wages would not sell somewhat home stupid meals. Then differe|-|Jewelry|-|consignment|-|8.75|-|12370.25|-|4.81575665044693951 +AAAAAAAACKCAAAAA|-|Different legs should go but neatly impossible teachers. Weeks accept well very poor sales. Students raise stairs. Matches speak predominantly there ordinary nerves. High complaints tell mile|-|Jewelry|-|consignment|-|9.65|-|7479.08|-|2.91161692360499556 +AAAAAAAADJNDAAAA|-|Effective issues hide sophisticated, valid cases; though dangerous losses may notice grey, decisive eyes. Dutch, specific mem|-|Jewelry|-|consignment|-|0.79|-|151.27|-|0.05888963509331732 +AAAAAAAADKGDAAAA|-|Large countries find regularly in a recomm|-|Jewelry|-|consignment|-|7.19|-|4057.99|-|1.57978151855841039 +AAAAAAAADNAAAAAA|-|Relative steps say particularly too extra tables. Relationships should describe then investigations. Ever other dogs indicate flat years; german, public|-|Jewelry|-|consignment|-|72.33|-|8666.23|-|3.37377617726422511 +AAAAAAAAEHDAAAAA|-|Likely products ought to work other, considerable arrangements. Also other funds kill possible, royal patterns. Old, good files know palestinian colours. Northern|-|Jewelry|-|consignment|-|7.12|-|5107.56|-|1.98838067440486412 +AAAAAAAAELGCAAAA|-|Similar, rare markets |-|Jewelry|-|consignment|-|4.54|-|166.32|-|0.06474862238858026 +AAAAAAAAFEMBAAAA|-|Pleasantly european governments should explain unknown, important c|-|Jewelry|-|consignment|-|7.39|-|21391.49|-|8.32773874662752993 +AAAAAAAAFIMAAAAA|-|Legs end with a books; by now right days avoid currently technically vertical minds. Good, international exports would make even in|-|Jewelry|-|consignment|-|9.02|-|7097.14|-|2.76292711579418300 +AAAAAAAAFPCDAAAA|-|Police used to feel highly. Goods will forgive for a troops. R|-|Jewelry|-|consignment|-|5.32|-|12273.34|-|4.77802944388322310 +AAAAAAAAGFCEAAAA|-|Champions use|-|Jewelry|-|consignment|-|2.21|-|488.55|-|0.19019323874423333 +AAAAAAAAGHPAAAAA|-|Open, large comparisons stress off a councils. Light votes affect old, high authorities. More only bodies fill formal women. Thin, aware methods fix somewhere methods|-|Jewelry|-|consignment|-|0.63|-|7338.92|-|2.85705242797017468 +AAAAAAAAIBCAAAAA|-|More far women apply never cultural judges. Peoples present christian circumstances. Fresh years avoid in a aims. Ways apply extra, wide hundreds. Necessary, white contracts drain numbers; |-|Jewelry|-|consignment|-|3.35|-|2958.26|-|1.15165500040428959 +AAAAAAAAIBNDAAAA|-|Obligations see and so on in a days; international, commercial winne|-|Jewelry|-|consignment|-|2.28|-|4123.69|-|1.60535862588723267 +AAAAAAAAICCEAAAA|-|Stairs used to respect also enough interesting forms. Arms should think patterns. Always particular accounts think now western issues; authorities discriminate just great, angry readers; nervous,|-|Jewelry|-|consignment|-|1.05|-|541.13|-|0.21066271063691941 +AAAAAAAAICJDAAAA|-|As new copies want certain, hot police. Accurate crops beat programmes. Young, wild characteristics will relieve slowly serious, internal workers. S|-|Jewelry|-|consignment|-|1.72|-|2202.45|-|0.85741704773766593 +AAAAAAAAIMIBAAAA|-|Level, financial families shall act prominent, political lives. Instead s|-|Jewelry|-|consignment|-|4.97|-|2586.93|-|1.00709568131126705 +AAAAAAAAKCHDAAAA|-|Stands see open secure, other views. Origins shall list only good, royal tons. Main, autonomous school|-|Jewelry|-|consignment|-|9.74|-|8753.87|-|3.40789455909524467 +AAAAAAAAKDDBAAAA|-|Exceedingly poor spirits accept most important assumptions. Precise, assistant months reac|-|Jewelry|-|consignment|-|9.47|-|2882.68|-|1.12223159443910864 +AAAAAAAAKHHBAAAA|-|Free, british factors accept. More decent friends fix private, interesting police. Main states used to find even; now local criticisms may support so prices. Eyes get ei|-|Jewelry|-|consignment|-|5.44|-|2774.04|-|1.07993788149841984 +AAAAAAAAKHLBAAAA|-|Public hands work forwards. So digital months should add such as the words. Gmt accessible measures take thus. Details can obtain finally other reasons. Important, safe requir|-|Jewelry|-|consignment|-|0.41|-|9454.19|-|3.68053017255827094 +AAAAAAAAKHPCAAAA|-|And so on historical levels use|-|Jewelry|-|consignment|-|5.49|-|2812.65|-|1.09496881169576883 +AAAAAAAAKKMAAAAA|-|European, main firms achieve for example growing troubl|-|Jewelry|-|consignment|-|0.77|-|2267.52|-|0.88274889513319814 +AAAAAAAALBAEAAAA|-|Materials ask primary states. Young, general cases used to store usually. Tons clear; really english members continue in the things. Even various quarters emerge more. Famous, pos|-|Jewelry|-|consignment|-|4.27|-|941.23|-|0.36642223335018879 +AAAAAAAALEABAAAA|-|Incentives introduce perhaps far final days; units could not a|-|Jewelry|-|consignment|-|4.75|-|1681.75|-|0.65470776636601043 +AAAAAAAALICBAAAA|-|Other difficulties will not cause more with a details. |-|Jewelry|-|consignment|-|2.78|-|3552.35|-|1.38293511749683196 +AAAAAAAALJFAAAAA|-|Sometimes big recordings write male hands. Young, written communists could see bare, dear methods. Basic, white rights could conc|-|Jewelry|-|consignment|-|2.17|-|19218.35|-|7.48173212531007376 +AAAAAAAAMBCEAAAA|-|Parts shall come hardly goals. Other sales ought to settle always somewhat possible lives; courses get mutual arrangements; internal places should come mainly very c|-|Jewelry|-|consignment|-|1.43|-|1194.87|-|0.46516466109573651 +AAAAAAAAMFGAAAAA|-|Catholic findings display yesterday angry laws. Men would |-|Jewelry|-|consignment|-|76.24|-|341.44|-|0.13292309781359334 +AAAAAAAAMMBEAAAA|-|Good, local prisoners handle unfortunately effects. False, old others lead fine services. All darling legs report alre|-|Jewelry|-|consignment|-|3.46|-|427.21|-|0.16631348587437093 +AAAAAAAANCLCAAAA|-|Away total costs think aggressively clearly sick charges. Subsequent terms alter. Patients may not start male days. Fair, outside ideas require double samples; now increased guards note t|-|Jewelry|-|consignment|-|2.03|-|2166.45|-|0.84340219440680440 +AAAAAAAAOCEDAAAA|-|Closer yo|-|Jewelry|-|consignment|-|0.42|-|17336.36|-|6.74907063030596021 +AAAAAAAAOCHDAAAA|-|Just formal teams ask still, certain interests. Well l|-|Jewelry|-|consignment|-|8.57|-|1004.40|-|0.39101440793103664 +AAAAAAAAOEEEAAAA|-|Public sections s|-|Jewelry|-|consignment|-|2.71|-|11081.17|-|4.31391589678730120 +AAAAAAAAOEHDAAAA|-|Mental, free shares should not lead. Businesses handle right women. Barely tiny managers should not se|-|Jewelry|-|consignment|-|4.67|-|87.24|-|0.03396266123845444 +AAAAAAAAOKBEAAAA|-|Essential, modern goods help friendly roads. Cultures|-|Jewelry|-|consignment|-|1.49|-|11910.55|-|4.63679475944146605 +AAAAAAAAOKGBAAAA|-|Then successful tasks could adhere. Royal conditions know |-|Jewelry|-|consignment|-|1.34|-|null|-|null +AAAAAAAAAEGBAAAA|-|Nations think; serious questions eat so to a members. Complete |-|Jewelry|-|costume|-|4.65|-|17671.60|-|7.42561235375557417 +AAAAAAAAAFMDAAAA|-|Earl|-|Jewelry|-|costume|-|3.41|-|4635.42|-|1.94780506670848500 +AAAAAAAABBFDAAAA|-|Things meet as arbitrary reasons. Cheeks might know behind a benefits. As likely trains can walk white levels. Little, usual germans would keep about students. Diff|-|Jewelry|-|costume|-|4.70|-|7041.20|-|2.95871464413317124 +AAAAAAAABGOBAAAA|-|International, perfect hands should seek so types. Blues will cope. Now nice women may |-|Jewelry|-|costume|-|4.01|-|9583.08|-|4.02681348802756783 +AAAAAAAABLJBAAAA|-|Exceedingly upper sources link electoral, poor homes. Vast police|-|Jewelry|-|costume|-|89.64|-|3594.58|-|1.51044374332616808 +AAAAAAAACHIAAAAA|-|More private ways examine also american artists. Elected, scottish successes get. Inadequate, only faces ask quite specific, special girls. Links would|-|Jewelry|-|costume|-|4.99|-|5390.00|-|2.26487984035076308 +AAAAAAAACHKDAAAA|-|However medical ports should supervise subsequently other, ini|-|Jewelry|-|costume|-|4.74|-|1.00|-|0.00042020034143799 +AAAAAAAACHLCAAAA|-|Now close items become already against a groups. Authorities would work as well natural, dependent parties. Operators should not fall l|-|Jewelry|-|costume|-|2.77|-|16899.15|-|7.10102860001179923 +AAAAAAAACHOAAAAA|-|Too public standards must receive models. Nuclear, sure mistakes ought to pick there only italian forms. Painti|-|Jewelry|-|costume|-|3.65|-|13.14|-|0.00552143248649518 +AAAAAAAACPCBAAAA|-|Relations used to create australian, extra specialists. Videos|-|Jewelry|-|costume|-|3.48|-|7175.21|-|3.01502569188927620 +AAAAAAAADLGCAAAA|-|Important laws know here terms. Good eyebrows use about right, old residents. Red, direct areas compensate into the employees. Capital, soft tactics shall not raise there |-|Jewelry|-|costume|-|4.87|-|4159.78|-|1.74794097630691971 +AAAAAAAADLNBAAAA|-|Young, brief others used to reduce nicely. Independent lawyers make almost with the parents. Basic, b|-|Jewelry|-|costume|-|1.86|-|5348.37|-|2.24738690013669958 +AAAAAAAADMNAAAAA|-|However fair communists would go out of a pp.. Quite black techniques consider for example now late countries; dead positions set perhaps regional studies. Elections halt no longer soft,|-|Jewelry|-|costume|-|0.55|-|5148.99|-|2.16360735606079324 +AAAAAAAAEDJAAAAA|-|C|-|Jewelry|-|costume|-|81.60|-|6834.08|-|2.87168274941453486 +AAAAAAAAELMCAAAA|-|Users make then more extra directions. As typical views result left events; stars can suffer a little numbers. Occasions get more crucial losses. Now limited conditions sol|-|Jewelry|-|costume|-|1.72|-|11208.28|-|4.70972308293258827 +AAAAAAAAENFAAAAA|-|Total shoulders might need. United buyers obtain characteristics. Certainly simi|-|Jewelry|-|costume|-|4.46|-|null|-|null +AAAAAAAAENOAAAAA|-|Official, new problems might prevent for long other, important modules. More prime words should reveal all in the organisations; p|-|Jewelry|-|costume|-|2.39|-|3602.73|-|1.51386837610888769 +AAAAAAAAEPICAAAA|-|Positive, recent adults cannot tell fortunately laboratories. Frequent performances may get labour buildings; vocational windows will talk; similar seeds must replace better. Other merch|-|Jewelry|-|costume|-|0.96|-|4003.74|-|1.68237291502893584 +AAAAAAAAGCDAAAAA|-|Now long groups should send at present powers. Risks understand conditions; suitable, particular aut|-|Jewelry|-|costume|-|2.75|-|546.96|-|0.22983277875292270 +AAAAAAAAGCLBAAAA|-|Fresh, beautiful functions give empty, fast origins. Sons get other companies. Lights say delightful, native services. Small, soviet things could go already also dead systems. Medical, comm|-|Jewelry|-|costume|-|4.10|-|5635.62|-|2.36808944821476204 +AAAAAAAAGPDBAAAA|-|Young, recent readers include. National children contain in particular to a |-|Jewelry|-|costume|-|8.68|-|1781.86|-|0.74873818039469586 +AAAAAAAAIDFAAAAA|-|Never national individuals appeal. Regional titles stop here new efforts. Right educational prices could not tell. High, different procedures might |-|Jewelry|-|costume|-|6.66|-|9359.81|-|3.93299535779470793 +AAAAAAAAIFEAAAAA|-|Surely possible measures feel fairly other, british parties. Primarily fatal eyes ought to investigate even categories. Dead, enormous ways want about in front of a changes. Medical, |-|Jewelry|-|costume|-|0.25|-|6206.49|-|2.60796921713146707 +AAAAAAAAIFOCAAAA|-|Present procedures can think however political politician|-|Jewelry|-|costume|-|3.02|-|4437.78|-|1.86475667122668077 +AAAAAAAAIMFBAAAA|-|Banks seem reforms; daily, black applications end clear details. Tonnes might not take just skilled, fine reasons; police shall live slowly realistic, true terms.|-|Jewelry|-|costume|-|8.67|-|5439.43|-|2.28565034322804289 +AAAAAAAAIPFDAAAA|-|Responsible, economic projects can require groups; cold, various passengers say unions. Li|-|Jewelry|-|costume|-|3.87|-|3894.68|-|1.63654586579170871 +AAAAAAAAKDNDAAAA|-|Priorities give there. Sound, chinese conflicts communicate alone on a members. Again s|-|Jewelry|-|costume|-|1.16|-|2303.25|-|0.96782643641704918 +AAAAAAAALAHBAAAA|-|Countries used to inspect ult|-|Jewelry|-|costume|-|4.51|-|1636.89|-|0.68782173689643053 +AAAAAAAALLGAAAAA|-|Others give relevant boys. Great poets consult together howe|-|Jewelry|-|costume|-|0.68|-|10761.33|-|4.52191454032687889 +AAAAAAAAMALDAAAA|-|Continuously magnetic loans drain in a colleges. So white members may send otherwise; threats should make hard good networks. Letters remov|-|Jewelry|-|costume|-|7.32|-|4207.94|-|1.76817782475057328 +AAAAAAAAMBDAAAAA|-|Strangers shall|-|Jewelry|-|costume|-|0.12|-|3495.33|-|1.46873885943844763 +AAAAAAAAMBLCAAAA|-|M|-|Jewelry|-|costume|-|0.55|-|2535.45|-|1.06539695569895032 +AAAAAAAAMDOCAAAA|-|As fit effects cannot agree for the police. Grounds live both other, good terms. Soo|-|Jewelry|-|costume|-|4.97|-|6758.29|-|2.83983576553694964 +AAAAAAAAMFEBAAAA|-|Other legs pay very like a leaders. Patterns write better perhaps small men. Fat, international efforts used to overcome already major views. At once |-|Jewelry|-|costume|-|2.82|-|2456.60|-|1.03226415877656486 +AAAAAAAAMIBCAAAA|-|Able, assistant positions should die|-|Jewelry|-|costume|-|4.16|-|548.01|-|0.23027398911143259 +AAAAAAAANBBEAAAA|-|Rational, recent women could not go yet for |-|Jewelry|-|costume|-|2.06|-|3315.78|-|1.39329188813325662 +AAAAAAAANBNBAAAA|-|Patients assist there with the shadows. Premises gain tomorrow powerful injuries; then g|-|Jewelry|-|costume|-|1.48|-|2131.92|-|0.89583351191847844 +AAAAAAAANPADAAAA|-|Daily, different wages say yet to |-|Jewelry|-|costume|-|83.35|-|17874.66|-|7.51093823508797230 +AAAAAAAAOELCAAAA|-|Direct, full wages used to imagine. White pp. go other, popular streets; buildings look both o|-|Jewelry|-|costume|-|8.43|-|1910.62|-|0.80284317635825138 +AAAAAAAAOMJCAAAA|-|Serious times might not make. Well primary details seek global germans. Cold pe|-|Jewelry|-|costume|-|8.53|-|11724.65|-|4.92670193324092287 +AAAAAAAAOPGCAAAA|-|Wrong, local indians train excellent, comprehensive holidays. Meals c|-|Jewelry|-|costume|-|0.33|-|129.50|-|0.05441594421621963 +AAAAAAAAPANDAAAA|-|Participants serve even new hearts; other, direct houses will contain adequately|-|Jewelry|-|costume|-|2.61|-|6322.59|-|2.65675447677241765 +AAAAAAAAPDFCAAAA|-|Right, ultimate women enjoy beyond weak times. Following seconds shall check in the main rarely military dreams. Years cause hence certain members; often final waters trust|-|Jewelry|-|costume|-|6.78|-|10255.93|-|4.30954528776411903 +AAAAAAAAAAIDAAAA|-|Charges sound aside educational interactions. Responsible pupil|-|Jewelry|-|custom|-|2.14|-|2032.64|-|0.66949339753703345 +AAAAAAAAAFGCAAAA|-|Prime, hard esti|-|Jewelry|-|custom|-|0.76|-|4934.70|-|1.62534884132261440 +AAAAAAAAAGNBAAAA|-|Indirect, quick characters depend often good, outstanding shareholders. Ruling boards may get explicitly by a cuts. Yet unfair events will score clean, intense laws. Subjects c|-|Jewelry|-|custom|-|0.94|-|448.96|-|0.14787456497866151 +AAAAAAAAAIDAAAAA|-|Real, genetic rights fail almost wheels; soviet resources ought to use a|-|Jewelry|-|custom|-|5.73|-|9810.33|-|3.23124171651619830 +AAAAAAAAAMKDAAAA|-|Early great representatives lie real, only visitors. Relationships consid|-|Jewelry|-|custom|-|2.13|-|6234.75|-|2.05354807555396886 +AAAAAAAAANAAAAAA|-|Finally other views may join perhaps. Years shall foresee very, capable kinds. International, important earnings shal|-|Jewelry|-|custom|-|3.64|-|8832.90|-|2.90930426986818262 +AAAAAAAABALBAAAA|-|Wonderful, rational quarters say occupational, surprising parts. Fully practical users shall respon|-|Jewelry|-|custom|-|5.19|-|9263.41|-|3.05110193328800525 +AAAAAAAABCBAAAAA|-|Parts tell even expensive neighbours. Joint models sit now similar, legal errors. Here simple others must indulge simply.|-|Jewelry|-|custom|-|1.54|-|3983.22|-|1.31195858141995747 +AAAAAAAABFKAAAAA|-|Servants must watch features. Modules may s|-|Jewelry|-|custom|-|12.32|-|3093.68|-|1.01896958344437265 +AAAAAAAABLKDAAAA|-|Northern duties will choose still; hands used to justify now young, difficult men. Again small activities pursue enough international sectors. Accidents fix major, demand|-|Jewelry|-|custom|-|4.02|-|3708.00|-|1.22130899621542428 +AAAAAAAACDMAAAAA|-|Outside operations would not attend always satisfactory, similar years. More afraid elements may not generate christian eyes; records like recently bars. Angry, regulatory cuts try easy seats. B|-|Jewelry|-|custom|-|3.17|-|2169.79|-|0.71466667931452682 +AAAAAAAACDPCAAAA|-|Social, local expectations should find so women; corporate, african objectives cannot want today. Dreams prevent well. Main police doubt forward to a questions. Foreign role|-|Jewelry|-|custom|-|7.38|-|5153.44|-|1.69739553221586195 +AAAAAAAACJLAAAAA|-|New, true individuals will add about a powers. Views may speak for the numbers. Cells used to know once more political n|-|Jewelry|-|custom|-|4.96|-|2366.56|-|0.77947708146806216 +AAAAAAAACLJDAAAA|-|Inside special pupils weep|-|Jewelry|-|custom|-|4.01|-|8303.85|-|2.73505035281107091 +AAAAAAAACMADAAAA|-|Concerned clothes comment less small probl|-|Jewelry|-|custom|-|1.61|-|3407.18|-|1.12222750424090327 +AAAAAAAACMFEAAAA|-|Normal, difficult customers will call |-|Jewelry|-|custom|-|5.07|-|3018.99|-|0.99436883670021676 +AAAAAAAADKECAAAA|-|Future lines might continue more following cities. International groups induce indeed differen|-|Jewelry|-|custom|-|0.72|-|608.25|-|0.20034012862676155 +AAAAAAAADKPAAAAA|-|Financial officers would find about in a resources. High new industries may increase. Following, living towns give rather present, hard traditions. Significant, prime relationships admit more kin|-|Jewelry|-|custom|-|2.09|-|8553.84|-|2.81738989864815125 +AAAAAAAAEDGDAAAA|-|Plants include clear years. Stores used to go very in the patients. Exotic years produce despite the implications. Ever armed orders|-|Jewelry|-|custom|-|3.09|-|5575.80|-|1.83650881906633299 +AAAAAAAAEHOAAAAA|-|Also international soldiers use shortly decisive parties. Major, above advertisements expect about already loyal stairs. Lucky, small towns appear. Then english children corresp|-|Jewelry|-|custom|-|32.77|-|9603.63|-|3.16316065677571065 +AAAAAAAAELFCAAAA|-|Diplomatic, mental systems pay. Distinctive offers promote in a degrees; periods should call polit|-|Jewelry|-|custom|-|9.74|-|6439.25|-|2.12090451830641068 +AAAAAAAAFJBBAAAA|-|Men must build on the bases. National, domestic occasions could not focus very stairs; video-taped, deep principles see new, red|-|Jewelry|-|custom|-|1.58|-|955.98|-|0.31487243101456885 +AAAAAAAAFJFDAAAA|-|Well-known clothes make by a part|-|Jewelry|-|custom|-|7.71|-|12610.21|-|4.15344199492063254 +AAAAAAAAGAEEAAAA|-|Anxious acres shall understand more into a sections. Cards might maintain there. Old conditions used to clear of course social years. Games pursue original, fu|-|Jewelry|-|custom|-|4.41|-|16063.57|-|5.29087986848333416 +AAAAAAAAGAGBAAAA|-|Formal parents may not pay private hours. L|-|Jewelry|-|custom|-|2.73|-|1075.38|-|0.35419937118396520 +AAAAAAAAGFLAAAAA|-|Standard, geographical scales may hope equal, sure problems. Strong associati|-|Jewelry|-|custom|-|7.77|-|8661.67|-|2.85290601220314295 +AAAAAAAAGHGBAAAA|-|Historical dogs remove political costs. As considerable actions |-|Jewelry|-|custom|-|4.94|-|3426.96|-|1.12874246970615167 +AAAAAAAAGJJBAAAA|-|Just integrated goods mark more appropriate relations. Main, social lives should mean naturally single customers; e|-|Jewelry|-|custom|-|3.15|-|454.08|-|0.14956094633265908 +AAAAAAAAGKGDAAAA|-|Hi|-|Jewelry|-|custom|-|5.32|-|5268.31|-|1.73523042013260030 +AAAAAAAAGLFEAAAA|-|Human fears contact victorian amounts; only new buildings will not convert real, sure damages|-|Jewelry|-|custom|-|1.27|-|13940.01|-|4.59144002705851582 +AAAAAAAAHMGAAAAA|-|Services remember actual units. Name|-|Jewelry|-|custom|-|4.42|-|8355.25|-|2.75198004062268709 +AAAAAAAAIDGAAAAA|-|Loyal songs bring at a applications; lucky, |-|Jewelry|-|custom|-|1.53|-|5669.79|-|1.86746643302380001 +AAAAAAAAIFMDAAAA|-|Of course maximum copies attract. International horses provide unfair forces; certainly original organisations think customers; for example u|-|Jewelry|-|custom|-|1.22|-|6619.14|-|2.18015513193348530 +AAAAAAAAIJFEAAAA|-|Associations must occur for a memories. Then good observations might conflict all national mathematical crops. Democratic, inner contr|-|Jewelry|-|custom|-|5.59|-|5944.36|-|1.95790192684550148 +AAAAAAAAIKAEAAAA|-|Political, appointed actors might not take formal resources. Possibly new programmes might not use in a waves. Racial, suspicious reader|-|Jewelry|-|custom|-|7.31|-|5646.33|-|1.85973938096036586 +AAAAAAAAILDAAAAA|-|Littl|-|Jewelry|-|custom|-|4.83|-|9584.62|-|3.15689930725627829 +AAAAAAAAIMEBAAAA|-|Heavy dangers might not sell more observers; hotels spot often calculations. Apparently inherent bodies will not enjoy nervously just literary resources. Consc|-|Jewelry|-|custom|-|0.41|-|2511.67|-|0.82727215925684863 +AAAAAAAAJCBBAAAA|-|Ideas will mean also; managers cannot think now other, following friends. Most only pounds ensure nuclear characteristics; |-|Jewelry|-|custom|-|4.86|-|3322.93|-|1.09447796731233005 +AAAAAAAAJDEAAAAA|-|Flowers work soon by a minutes. Then special terms follow though issues. True, awkward activities could change finally specific recordings. Too young theories may repeat by a det|-|Jewelry|-|custom|-|2.38|-|2022.40|-|0.66612063482903831 +AAAAAAAAJMBDAAAA|-|Symptoms fix here widely special assumptions. European, automatic shoes administer. Southern, private pol|-|Jewelry|-|custom|-|2.26|-|1090.76|-|0.35926510267312195 +AAAAAAAAKAJAAAAA|-|Electronic, possible gods establish solutions; buildings would want in common with a bills. Children reflect |-|Jewelry|-|custom|-|2.31|-|617.26|-|0.20330776456416742 +AAAAAAAAKDEDAAAA|-|Deliberate, tough steps can make perhaps empty years. Sale|-|Jewelry|-|custom|-|8.92|-|1421.72|-|0.46827384738387082 +AAAAAAAAKDOBAAAA|-|Lights react at least usual ways. French humans must build. Anonymous, concerned details understand earlier strengths. Possible pounds would take glorio|-|Jewelry|-|custom|-|4.64|-|1305.81|-|0.43009641325460172 +AAAAAAAAKJBAAAAA|-|Basic plants should not discourage. Never underlying styles engage e|-|Jewelry|-|custom|-|3.59|-|5214.42|-|1.71748059763905952 +AAAAAAAAKNKCAAAA|-|Federal, basic remains take strong boats. Broad, likely b|-|Jewelry|-|custom|-|5.91|-|1335.70|-|0.43994132315127891 +AAAAAAAALPNBAAAA|-|Novel, physical customers dare recently home new advantages. Hard minute players can create only; also civil areas understand high heroes. Wide direct terms let now characters. |-|Jewelry|-|custom|-|3.45|-|479.37|-|0.15789074798160408 +AAAAAAAAMBECAAAA|-|Legislative, comfortable workers change for instance constantly lackin|-|Jewelry|-|custom|-|2.91|-|10241.20|-|3.37315795362497388 +AAAAAAAAMEKAAAAA|-|Newspapers should put well medical children. Tomorrow ma|-|Jewelry|-|custom|-|0.16|-|6853.44|-|2.25732684116036607 +AAAAAAAAMKCBAAAA|-|Frequently static classes see equal, true words. Various, metropolitan problems exceed consequently statutory names. Ready, othe|-|Jewelry|-|custom|-|0.54|-|9386.44|-|3.09162449148767721 +AAAAAAAAMNEDAAAA|-|Different, common buildings could not comply even. Impossible transactions build always qualities. Police move tiles. Options must use just different stages; words|-|Jewelry|-|custom|-|1.70|-|3135.14|-|1.03262531995545450 +AAAAAAAANAPDAAAA|-|Chemical agencies hate almost rational clients; private views announce clear, good observations. Foreign, creative levels might not take. Long, domestic steps accept again from |-|Jewelry|-|custom|-|4.62|-|8978.11|-|2.95713228479278935 +AAAAAAAAOAIBAAAA|-|Well new carers shall give together with a samples. Individual, central birds find there weapons. Kind details proceed ultimate miles. Unlike, independent months mus|-|Jewelry|-|custom|-|7.88|-|2025.70|-|0.66720756031110706 +AAAAAAAAOFDAAAAA|-|Particular agencies must lead small days. Purposes sit operations. Police try very small defences. Old o|-|Jewelry|-|custom|-|4.82|-|6588.49|-|2.17005989980457409 +AAAAAAAAOOCBAAAA|-|Warm, various decisions can commemorate always. Popular, significant sports might enjoy. Then labour bodies influence as fair rates. As visual opportun|-|Jewelry|-|custom|-|3.86|-|4390.80|-|1.44620375959619335 +AAAAAAAAPFCAAAAA|-|Scottish produ|-|Jewelry|-|custom|-|6.50|-|5130.42|-|1.68981340355003696 +AAAAAAAAPGDEAAAA|-|Circumstances lie late economic conclusions. Long-term, nat|-|Jewelry|-|custom|-|6.46|-|6218.92|-|2.04833412695362092 +AAAAAAAAPIACAAAA|-|Too different women will need below standard teeth. Recently real parties could continue bad, religious hours. Cases drive bad, wrong fe|-|Jewelry|-|custom|-|3.88|-|5100.01|-|1.67979722054709439 +AAAAAAAAPKADAAAA|-|Dark, gross modules follow even once necessary residents. Policies will make now new |-|Jewelry|-|custom|-|8.32|-|4419.13|-|1.45553485017407441 +AAAAAAAAAGBBAAAA|-|Difficult services can provide perhaps; extra, unhappy contracts wait merely about public men. Jews quit frantically by the children. Unions mu|-|Jewelry|-|diamonds|-|7.82|-|4800.39|-|2.15817761024087172 +AAAAAAAAAGEBAAAA|-|Dead, different miles think as a whole domestic reasons. Even original artists may not deliver. Appropriate sessions exploit for the hours. Still users will not discuss clear posts; rele|-|Jewelry|-|diamonds|-|2.46|-|9550.35|-|4.29368270910569958 +AAAAAAAAAGPCAAAA|-|Base victims approve together far regular hands. Home catholic years must enjoy abo|-|Jewelry|-|diamonds|-|2.72|-|6868.37|-|3.08790793099104366 +AAAAAAAAAIMCAAAA|-|Rarely original goods may celebrate soon shy newspapers. Small,|-|Jewelry|-|diamonds|-|9.67|-|4052.94|-|1.82213619386125682 +AAAAAAAAAKPBAAAA|-|Valuable, old gentlemen should find continuously tourists. Still considerable parents look known balls; plants may not halt sensibly wild associations. Also huge notes |-|Jewelry|-|diamonds|-|3.35|-|5727.04|-|2.57478444479591907 +AAAAAAAABGADAAAA|-|Paintings lie tears. Almost fair cars would weep simply ways. Cases make to the words. Heavy boys think important, splendid clients. Similar, capable years continue ordinary walls. Pa|-|Jewelry|-|diamonds|-|3.07|-|1837.59|-|0.82615070750554090 +AAAAAAAABHLAAAAA|-|Classical, active years create enough years. Local, urban implications shall get in a organisms. Also formal questions head more able, other streets. Eyes would not occupy too|-|Jewelry|-|diamonds|-|52.56|-|9547.09|-|4.29221706589558848 +AAAAAAAABNIDAAAA|-|Orders try however; average parties prepare quite from th|-|Jewelry|-|diamonds|-|6.48|-|727.48|-|0.32706322775816743 +AAAAAAAACEEDAAAA|-|Scottish, british colleagues enable about a workers. Most good persons could read with a years. Indeed specific damages believe organisations. Immediate facilitie|-|Jewelry|-|diamonds|-|8.36|-|3155.08|-|1.41847287710347900 +AAAAAAAACHBEAAAA|-|Free, major defendants give potentially; |-|Jewelry|-|diamonds|-|4.45|-|5548.32|-|2.49443482684774224 +AAAAAAAACJIDAAAA|-|Servants must not knit churches. Live, national holidays ought to imitate aspects. Right months report traditiona|-|Jewelry|-|diamonds|-|0.75|-|5112.80|-|2.29863208731780729 +AAAAAAAADALCAAAA|-|Private examples speak questions. Here |-|Jewelry|-|diamonds|-|2.66|-|8110.00|-|3.64612467300645773 +AAAAAAAADHDAAAAA|-|Massive hour|-|Jewelry|-|diamonds|-|1.06|-|9560.88|-|4.29841682659111980 +AAAAAAAAEADDAAAA|-|Beautif|-|Jewelry|-|diamonds|-|6.34|-|2809.30|-|1.26301578839420983 +AAAAAAAAEJMAAAAA|-|Carelessly different quarters reach so single poin|-|Jewelry|-|diamonds|-|3.97|-|715.04|-|0.32147040520179254 +AAAAAAAAEPCEAAAA|-|New, previous police outline right in a persons. Wealthy quest|-|Jewelry|-|diamonds|-|8.95|-|1000.40|-|0.44976364030526021 +AAAAAAAAFEEAAAAA|-|Stages honour so like the banks. Original, nearby products turn fields. White details |-|Jewelry|-|diamonds|-|7.55|-|3382.21|-|1.52058684713799894 +AAAAAAAAGEMAAAAA|-|Systems could not recycle base, successful costs. Rises may raise modest, early girls. Global perio|-|Jewelry|-|diamonds|-|2.74|-|764.42|-|0.34367085358071472 +AAAAAAAAGIJAAAAA|-|Always other hours used to use. Women should jump then. Civil samples take therefore other offices. Concrete, major demands|-|Jewelry|-|diamonds|-|1.39|-|1457.18|-|0.65512453156739212 +AAAAAAAAGJOCAAAA|-|Lines ma|-|Jewelry|-|diamonds|-|1.59|-|14731.35|-|6.62297641204607659 +AAAAAAAAGKCEAAAA|-|Still formal eggs could complicate public, causal fears. Little members should throw delighted reasons. Luckily early rules ask with a feet. Uncomfortable, christian words develop additional words|-|Jewelry|-|diamonds|-|5.85|-|11305.65|-|5.08283716515110467 +AAAAAAAAGLODAAAA|-|Schools maintain; please|-|Jewelry|-|diamonds|-|2.16|-|156.32|-|0.07027894067624778 +AAAAAAAAGOAAAAAA|-|Final teachers co-ordinate high, white dates. Too legal studies accomplish then sorts. Dry parties could not help cool lights; quit|-|Jewelry|-|diamonds|-|7.40|-|12163.07|-|5.46831931276259628 +AAAAAAAAHFJBAAAA|-|American needs should result quite. Charges see more conditions. Even adequate corporations can wonder acceptable standards. Extra little flats must revive elsewhere separate americans. Su|-|Jewelry|-|diamonds|-|3.32|-|336.96|-|0.15149175953344710 +AAAAAAAAICHCAAAA|-|Physical hou|-|Jewelry|-|diamonds|-|1.71|-|2898.02|-|1.30290286373195742 +AAAAAAAAIDPCAAAA|-|Students forget local, unacceptable problems; impossible, absolute flowers exist again automatic groups. Guilty, political m|-|Jewelry|-|diamonds|-|7.09|-|7570.42|-|3.40353824254273092 +AAAAAAAAIEIDAAAA|-|Public, professional rewards love across the animals. Others could live|-|Jewelry|-|diamonds|-|7.40|-|7632.04|-|3.43124159671667148 +AAAAAAAAIFBDAAAA|-|Usually front flowers decide yet. Trusts play ultimately professional patients; kinds used to raise great, useful branches. Ga|-|Jewelry|-|diamonds|-|1.81|-|9456.06|-|4.25129145196417321 +AAAAAAAAIFKDAAAA|-|Original trousers should support with a interests. Here other hours will fall in the men; indeed little professionals ought to see friends. Raw, future u|-|Jewelry|-|diamonds|-|0.29|-|55.15|-|0.02479454694405748 +AAAAAAAAIKODAAAA|-|Premier, good budgets could put high, slow members; traditions could not join however. Students laugh for a effects. Carefu|-|Jewelry|-|diamonds|-|8.95|-|1387.03|-|0.62358622752159643 +AAAAAAAAINCDAAAA|-|Good, big minutes would live even similar accounts; solid, old firms may join almost; prices hear neither public, successf|-|Jewelry|-|diamonds|-|2.75|-|1362.80|-|0.61269281188325531 +AAAAAAAAJBGAAAAA|-|Materi|-|Jewelry|-|diamonds|-|8.02|-|6332.91|-|2.84717378581126094 +AAAAAAAAJDGBAAAA|-|Common, strong profits raise very so|-|Jewelry|-|diamonds|-|2.04|-|445.11|-|0.20011424823697958 +AAAAAAAAKEPDAAAA|-|Available friends distinguish very magistrates. Alive bottles establish currently. Measu|-|Jewelry|-|diamonds|-|4.97|-|6943.41|-|3.12164469985200600 +AAAAAAAAKGHCAAAA|-|Asian, environmental users know more most hidden lists. Old, human banks should believe early eff|-|Jewelry|-|diamonds|-|5.04|-|2453.34|-|1.10298193653189433 +AAAAAAAAKJEDAAAA|-|Standard years begin then to a police. Chronic, social systems find then with a employees. Constant, considerable devices may not please then of course foreign countries. Effects shall change t|-|Jewelry|-|diamonds|-|2.00|-|1877.43|-|0.84406212636775758 +AAAAAAAALCMDAAAA|-|New, bizarre roles emerge on the years. Then existing risks know frequent, successful arrangements. Very creative ideas go natural, different forces. Quiet p|-|Jewelry|-|diamonds|-|2.38|-|3396.78|-|1.52713728320282065 +AAAAAAAALFHCAAAA|-|Long theories swallow then breasts. Respondents matter opportunities. Lengthy, active things would see lo|-|Jewelry|-|diamonds|-|0.94|-|1600.70|-|0.71964879951682329 +AAAAAAAAMLJCAAAA|-|Iss|-|Jewelry|-|diamonds|-|0.26|-|2659.64|-|1.19573107587113382 +AAAAAAAAMNMBAAAA|-|Interested adults estimate more terms. As yet fresh twins may offer in a experi|-|Jewelry|-|diamonds|-|3.24|-|5061.86|-|2.27573028820030433 +AAAAAAAANKEEAAAA|-|Just occasional farmers last as governments; outdoor, international campaigns shall not become no longer gingerly irish reasons. Practical, political circumst|-|Jewelry|-|diamonds|-|1.08|-|412.39|-|0.18540386607905464 +AAAAAAAANNIAAAAA|-|Genuine, voluntary questions may con|-|Jewelry|-|diamonds|-|6.09|-|9061.86|-|4.07406551533049310 +AAAAAAAAOEEDAAAA|-|Other courses discuss full leaves. Connections excuse; objective, international sessions go. All expensive surve|-|Jewelry|-|diamonds|-|3.98|-|13938.81|-|6.26666326181863663 +AAAAAAAAOGKBAAAA|-|Brown, economic dates could prevent still white months. Workers avoid really. Responsible properties can get primary, useful costs. Big, excellen|-|Jewelry|-|diamonds|-|7.72|-|268.89|-|0.12088858980575911 +AAAAAAAAOLADAAAA|-|Early additional places listen hotels. Cases should open easily. Ot|-|Jewelry|-|diamonds|-|2.82|-|4777.95|-|2.14808894961667136 +AAAAAAAAPBADAAAA|-|Communities ought to expect there present, following products. Specimens introduce again in a children; extensive c|-|Jewelry|-|diamonds|-|1.66|-|9415.11|-|4.23288099507642790 +AAAAAAAAADACAAAA|-|Occasions hear then famous runs. Appropriate buyers ought to decipher on a russians. Only only expenses must not need always steep, royal costs. Minutes might not teach on a products. Hitherto uppe|-|Jewelry|-|earings|-|9.79|-|2851.07|-|1.18880895817067183 +AAAAAAAAANKCAAAA|-|New, young publica|-|Jewelry|-|earings|-|7.58|-|19942.42|-|8.31537897827902133 +AAAAAAAABJDAAAAA|-|Empty vi|-|Jewelry|-|earings|-|3.49|-|8589.34|-|3.58149197907230562 +AAAAAAAABOBDAAAA|-|Very royal structures arrange partly interested place|-|Jewelry|-|earings|-|5.95|-|6340.34|-|2.64372778986409925 +AAAAAAAACEABAAAA|-|Companies round other, long-term proposals. Free events burst both th|-|Jewelry|-|earings|-|5.40|-|4487.72|-|1.87124193294506532 +AAAAAAAACOAEAAAA|-|Hard rates would mention certainly advances. Questions appoint most lines. Big, ill contracts return again excellent characters; simultaneously massive machines could go|-|Jewelry|-|earings|-|3.19|-|6642.53|-|2.76973177400675282 +AAAAAAAACOEDAAAA|-|T|-|Jewelry|-|earings|-|2.09|-|6858.87|-|2.85993893483080945 +AAAAAAAACPHBAAAA|-|Banks shall know in a hab|-|Jewelry|-|earings|-|8.64|-|14717.76|-|6.13685561287726610 +AAAAAAAACPHCAAAA|-|Almost fun years explain too too long lessons. There light problems rely levels; numerous principles coul|-|Jewelry|-|earings|-|83.72|-|366.75|-|0.15292352885376153 +AAAAAAAADAGEAAAA|-|Effects say more. Of course elabo|-|Jewelry|-|earings|-|4.28|-|1550.46|-|0.64649438185849518 +AAAAAAAADEAAAAAA|-|Scientific problems rela|-|Jewelry|-|earings|-|0.39|-|263.80|-|0.10999652872971314 +AAAAAAAADGHDAAAA|-|Other, deep goals go probably visible studies. Still british functions let also anonymous devices. Fat, capi|-|Jewelry|-|earings|-|0.90|-|10786.60|-|4.49768217132647349 +AAAAAAAAEDOCAAAA|-|Islands will not discuss ideas. Young, damp others provide shares. Good, short shops may not understand. Even able decisions go elsewhere trying, bad sizes; soft, tired failures secur|-|Jewelry|-|earings|-|5.80|-|2980.24|-|1.24266889606307913 +AAAAAAAAEEGCAAAA|-|Main clubs exercise full, new circumstances. Politically black awards would not climb solemnly red needs. Various, bol|-|Jewelry|-|earings|-|8.28|-|4040.10|-|1.68459808840376815 +AAAAAAAAEGEAAAAA|-|Palestinian, hot subjects satisfy present workers; late, official fears must not provide hitherto common, |-|Jewelry|-|earings|-|4.10|-|680.68|-|0.28382273379735078 +AAAAAAAAELICAAAA|-|Economic elements used to hear as |-|Jewelry|-|earings|-|9.05|-|9431.41|-|3.93260940495338803 +AAAAAAAAENJCAAAA|-|Reduced, great terms can tax for a requirements. Sets reach in a men. Excessive|-|Jewelry|-|earings|-|0.79|-|6107.81|-|2.54676989439207425 +AAAAAAAAFAOAAAAA|-|Various brothers would seem on a children. Professional ministers mould so cities; regul|-|Jewelry|-|earings|-|1.61|-|12803.66|-|5.33873447701091313 +AAAAAAAAFCDAAAAA|-|Here wealthy jobs escape already now open police. Strictly individual researchers keep poor times; concerned, big types use necessarily on the interests. Very essential meeting|-|Jewelry|-|earings|-|16.46|-|3127.27|-|1.30397590750784684 +AAAAAAAAGMNAAAAA|-|Double, national allies g|-|Jewelry|-|earings|-|25.44|-|802.62|-|0.33466798290008475 +AAAAAAAAIACEAAAA|-|Conversely good eggs would not call too. Police happen present courses. Fine procedures finish well forward private|-|Jewelry|-|earings|-|65.03|-|1059.00|-|0.44157059865339731 +AAAAAAAAIBGBAAAA|-|Signs proceed however arts. Easy, due men strengthen abruptly blue changes; similar, identical names play operations; interesting others would not work new libraries. Different, junior children ma|-|Jewelry|-|earings|-|6.05|-|2543.20|-|1.06043658781427766 +AAAAAAAAIDHCAAAA|-|Markets appoint poor cigaret|-|Jewelry|-|earings|-|0.66|-|2696.91|-|1.12452895487661354 +AAAAAAAAIFDDAAAA|-|Hands should count unnecessarily outer questions; social rivers might invoke existing events. Resources take occasionally like a sections; so as complete langua|-|Jewelry|-|earings|-|81.36|-|870.10|-|0.36280507827036922 +AAAAAAAAIFLBAAAA|-|Varieties go hardly other, likely travellers. High pieces may not include now capable, e|-|Jewelry|-|earings|-|98.57|-|8889.30|-|3.70656612144442371 +AAAAAAAAJFFAAAAA|-|Strong sounds may not become in a dreams. Certain conditions will not propose really sensible miles. Corporate, only conditions would not make quite empty thousands. Please useful ti|-|Jewelry|-|earings|-|0.69|-|7200.70|-|3.00247158614118792 +AAAAAAAAKAPBAAAA|-|Real stairs should sleep of course early developments. Special, grey levels would not increase white, local bodies; small, catholic parents transform historic, financial c|-|Jewelry|-|earings|-|7.56|-|14173.73|-|5.91001174811295284 +AAAAAAAAKEIAAAAA|-|Thanks can show then principles. Different, long animals r|-|Jewelry|-|earings|-|4.18|-|5199.12|-|2.16787396682799908 +AAAAAAAAKIMBAAAA|-|Good, silent examples close so literary, financial years. Often foreign interests discourage best suddenly whi|-|Jewelry|-|earings|-|8.42|-|3054.65|-|1.27369558940188866 +AAAAAAAAKJAEAAAA|-|Sensible subjects could last twice strategic, genetic blocks. Tomorrow different categories may find as sure priorities. Happy, frequent buil|-|Jewelry|-|earings|-|1.75|-|318.24|-|0.13269634307408608 +AAAAAAAAKJFCAAAA|-|Good services shall contribute less generally per|-|Jewelry|-|earings|-|3.37|-|8953.90|-|3.73350234493168478 +AAAAAAAALIAAAAAA|-|Other, stupid students contribute as houses. Companies used to receive appropriate, military principles. Wet, perfect blocks make so sexually european voices. Systems must not bec|-|Jewelry|-|earings|-|5.02|-|1648.71|-|0.68746162578455399 +AAAAAAAAMBJAAAAA|-|Therefore unab|-|Jewelry|-|earings|-|53.39|-|3770.24|-|1.57207472508685994 +AAAAAAAAMMGCAAAA|-|Soviet, human tories show then afra|-|Jewelry|-|earings|-|1.80|-|5010.20|-|2.08910010705689443 +AAAAAAAAOAEBAAAA|-|Advantages make more so popular conditions. Origi|-|Jewelry|-|earings|-|9.61|-|1067.84|-|0.44525660818323303 +AAAAAAAAOCBCAAAA|-|Other, current movements would get in a products.|-|Jewelry|-|earings|-|4.09|-|11019.22|-|4.59467759404484297 +AAAAAAAAOEMCAAAA|-|Seconds preve|-|Jewelry|-|earings|-|1.15|-|1374.95|-|0.57331208179271825 +AAAAAAAAOFCEAAAA|-|Rationally current purposes used to honour. Years|-|Jewelry|-|earings|-|3.57|-|1008.01|-|0.42030932875222948 +AAAAAAAAOMKBAAAA|-|Others used to coincide there so as historical sites; syste|-|Jewelry|-|earings|-|4.88|-|4424.25|-|1.84477688488412941 +AAAAAAAAPAAEAAAA|-|Urban components will achieve to a resour|-|Jewelry|-|earings|-|2.64|-|2370.56|-|0.98845098993748586 +AAAAAAAAPJDEAAAA|-|Visual changes purchase obviously full magistrates. Still special pounds will complete enough on|-|Jewelry|-|earings|-|0.90|-|7713.08|-|3.21611836927435857 +AAAAAAAAPJHAAAAA|-|Growing, recent courses fade helplessly ultimately eastern sequences; roughly early responsibilities may not exist physically sharp, dual others. Big traditions cause also ago adequat|-|Jewelry|-|earings|-|8.60|-|3628.45|-|1.51295263331814870 +AAAAAAAAPODCAAAA|-|Entirely technical approaches knit across new lawyers; ago right firms ought to lie with a patients. Relevant heads could not listen there pretty failures. Students license much. Broad, re|-|Jewelry|-|earings|-|4.68|-|18459.94|-|7.69723017649272441 +AAAAAAAAALHCAAAA|-|Far multiple shows stop arguably. Too final times may encourag|-|Jewelry|-|estate|-|8.14|-|12113.87|-|3.62155108506141381 +AAAAAAAAAPNBAAAA|-|Other, original descriptions override less rises. Still easy positions might achieve little serious, green villages. Sweet,|-|Jewelry|-|estate|-|5.51|-|4991.21|-|1.49216740738256059 +AAAAAAAACCPAAAAA|-|Clinical collections hunt concerned funds. Radical patients find at a schools. Responses shall raise later especially immediate children. Children take today opportunities. Residential progr|-|Jewelry|-|estate|-|0.23|-|16788.59|-|5.01910094223821135 +AAAAAAAACFEDAAAA|-|Preliminary, ideological levels believe like, only priests. Samples arrest now for example real methods. Quickly grey ideas cannot show then personal metropolitan a|-|Jewelry|-|estate|-|4.20|-|8906.43|-|2.66265786495343997 +AAAAAAAACNNAAAAA|-|Human, remarkable women come by a churches. More major creditors will not go well young old weeks; then subject m|-|Jewelry|-|estate|-|5.79|-|313.47|-|0.09371469387026618 +AAAAAAAADBKCAAAA|-|Acute proceedings ought to own at least. Happy, national minutes shall close probably level restrictions. Never living films sell p|-|Jewelry|-|estate|-|3.13|-|6327.34|-|1.89161556484859802 +AAAAAAAADBLBAAAA|-|Relative risks could speak well numbers. Clean adva|-|Jewelry|-|estate|-|3.97|-|1768.64|-|0.52875093682555772 +AAAAAAAADIIAAAAA|-|Powerful, public facilities must die. Healthy arms dissolve early, national cheeks. Mass, separate conditions go only increased, certain pieces. Quite capital teachers should let also a|-|Jewelry|-|estate|-|1.34|-|607.92|-|0.18174318658121102 +AAAAAAAAEDFCAAAA|-|Established areas happen carefully primarily industrial years. Whole dogs shall pres|-|Jewelry|-|estate|-|7.40|-|3286.95|-|0.98266345429186661 +AAAAAAAAEDHCAAAA|-|Somewhere new courts cannot introduce factors. Also previous topics will bring like the pers|-|Jewelry|-|estate|-|2.90|-|8248.68|-|2.46601754883653060 +AAAAAAAAEDMAAAAA|-|Awful, typical purposes use. Con|-|Jewelry|-|estate|-|2.08|-|8755.15|-|2.61743133964417953 +AAAAAAAAENMDAAAA|-|Likely, black demands cannot support urgen|-|Jewelry|-|estate|-|1.34|-|13047.94|-|3.90079976628577191 +AAAAAAAAEPDEAAAA|-|Disabled rates |-|Jewelry|-|estate|-|1.98|-|5380.34|-|1.60850134308848677 +AAAAAAAAFAIDAAAA|-|P|-|Jewelry|-|estate|-|8.51|-|4151.80|-|1.24121818997215406 +AAAAAAAAFLCEAAAA|-|For example heavy bases shall work much surfaces. Both running brothers may seek all comprehensive, great in|-|Jewelry|-|estate|-|6.87|-|3804.91|-|1.13751228460112450 +AAAAAAAAGHDAAAAA|-|Supporters must not experience today other years. Closer final |-|Jewelry|-|estate|-|8.30|-|1826.34|-|0.54600087409647474 +AAAAAAAAGLKCAAAA|-|Very similar forces try. Corporate months know still new minutes. Magic, attractive facts result below successive, important police; possib|-|Jewelry|-|estate|-|3.70|-|6715.34|-|2.00761167682634159 +AAAAAAAAHEEBAAAA|-|Small, anxious profits can travel elderly police. Armed boys might not t|-|Jewelry|-|estate|-|4.35|-|2255.17|-|0.67420348414651541 +AAAAAAAAHLMBAAAA|-|Mad positions sample large, alone fields. Far|-|Jewelry|-|estate|-|1.66|-|8236.08|-|2.46225066478776882 +AAAAAAAAIADCAAAA|-|Delegates go then. Net, free users redress trying states. Years might agree. Dominant, other experts will pick necessarily legal, square changes. Relations watch no long|-|Jewelry|-|estate|-|4.53|-|3325.53|-|0.99419729449831338 +AAAAAAAAICNAAAAA|-|Mentally live fans must mean industrial, royal ideas. So poor children should improve then with a forces. Nations shall not get obviously well necessary words. Terms|-|Jewelry|-|estate|-|3.15|-|21255.70|-|6.35458391073537140 +AAAAAAAAIDIDAAAA|-|Patterns expand soon high communications. Things fos|-|Jewelry|-|estate|-|4.97|-|7388.31|-|2.20880214970691400 +AAAAAAAAIHIAAAAA|-|Leaders might p|-|Jewelry|-|estate|-|1.32|-|11844.71|-|3.54108326676262654 +AAAAAAAAIHIDAAAA|-|Able, concrete politicians ought to stir as british appeals. Parties forget by|-|Jewelry|-|estate|-|0.95|-|6565.47|-|1.96280668377968069 +AAAAAAAAIJOAAAAA|-|Doctors tell inside services. Social, running authorities will not succeed more other |-|Jewelry|-|estate|-|4.67|-|389.00|-|0.11629507102923260 +AAAAAAAAIKICAAAA|-|Immediately whole police could not provide now to a babies. Minor, professional u|-|Jewelry|-|estate|-|4.24|-|12950.65|-|3.87171404016640420 +AAAAAAAAILFCAAAA|-|British supporters must see. Regional, national shares might steer so wings. States borrow then often serious officers. Strategic wa|-|Jewelry|-|estate|-|4.63|-|2476.37|-|0.74033322633588881 +AAAAAAAAIOLCAAAA|-|Safe, normal poun|-|Jewelry|-|estate|-|3.18|-|4108.47|-|1.22826429427113439 +AAAAAAAAJANAAAAA|-|New, new industries cannot set personally to a bodies; big symptoms will not say much notes. Trees may concentrate so important individuals. English limits turn oft|-|Jewelry|-|estate|-|1.84|-|2627.78|-|0.78559861632184281 +AAAAAAAAJCFAAAAA|-|Instead other problems deal. Wages could look. Catholic, logical things can avoid so well sure situations. Schools ma|-|Jewelry|-|estate|-|3.89|-|1889.85|-|0.56498776345654303 +AAAAAAAAJDBDAAAA|-|Casual, necessary gardens must go perfect insects. Shares follow by the sales. Pure, present ob|-|Jewelry|-|estate|-|9.61|-|47.00|-|0.01405107541998440 +AAAAAAAAKAIBAAAA|-|Principles used to cool. National reasons heal for a friends. Processes hit again members. Mean, faint policies will accept then; little bars would bla|-|Jewelry|-|estate|-|8.70|-|15857.88|-|4.74085676342685639 +AAAAAAAAKKOBAAAA|-|Existing, acceptable benefits decide social players. Southern, international processes bring either boxes. Accurate years follow. Also ultimate thoughts used t|-|Jewelry|-|estate|-|0.10|-|5320.56|-|1.59062957099047256 +AAAAAAAAKNIAAAAA|-|Values see prisons. External, main |-|Jewelry|-|estate|-|8.39|-|8646.89|-|2.58506603272997717 +AAAAAAAAKPBDAAAA|-|Once flexible groups could ac|-|Jewelry|-|estate|-|3.28|-|10410.98|-|3.11245670587125980 +AAAAAAAAKPDBAAAA|-|European, sensible days come either particularly large women. Writers would not stick afterwards elements. Great thoughts comply |-|Jewelry|-|estate|-|1.81|-|67.90|-|0.02029931959610513 +AAAAAAAAMDBBAAAA|-|Ears can find totally like a duties; current years must not trade. Other, real trousers listen only developments. Customs feel; reasonable, great plants take uncertain,|-|Jewelry|-|estate|-|18.77|-|64.88|-|0.01939646326060826 +AAAAAAAAMPFCAAAA|-|Major, senior words afford economic libraries; successful seconds need outside. Clinical, new ideas put now red c|-|Jewelry|-|estate|-|3.74|-|141.12|-|0.04218910134613189 +AAAAAAAAMPIDAAAA|-|Furious boys could not win homes. Fun difficulties should treat later anyway available books;|-|Jewelry|-|estate|-|2.31|-|16393.36|-|4.90094335631820209 +AAAAAAAAMPOAAAAA|-|More possible things will not build probably. Other visitors put little, symbolic weaknesses. So rare sources know again high words. Savings follow then right, old effects. Possibly pol|-|Jewelry|-|estate|-|12.16|-|11174.34|-|3.34067008741592561 +AAAAAAAANFOCAAAA|-|Rich, human women mean well ill only industries. Tories will damage accidentally in the rules. Rates leave long afterwards chief police; years govern as during the|-|Jewelry|-|estate|-|2.94|-|1972.04|-|0.58955920789842639 +AAAAAAAANKACAAAA|-|Expensive, waste places ought to back often positive assessments. Prospective, happy months work used, regional men. Scientists look locally. Effects depend according t|-|Jewelry|-|estate|-|7.94|-|8944.45|-|2.67402428809105288 +AAAAAAAANKIAAAAA|-|However german rates find sure, military railways. Currently different regulations expose at a years. Factors sleep ever acceptable cars. Involve|-|Jewelry|-|estate|-|6.89|-|19332.09|-|5.77950328970055873 +AAAAAAAANNFDAAAA|-|Bloody spirits play experimentally obvious benefits. Impressive, wet teachers see alone long-term, major eyes. Relevant groups|-|Jewelry|-|estate|-|3.45|-|1936.40|-|0.57890430730335737 +AAAAAAAAOCDEAAAA|-|Earlier expected poles will pay structural women. Ordinary questions spoil nominally in a women. Impossible, various|-|Jewelry|-|estate|-|2.89|-|19223.69|-|5.74709612851914789 +AAAAAAAAOCPAAAAA|-|Demands invest easier there bad cases. Just young accidents may go in order. Local, great students serve on a hands. Sort of human c|-|Jewelry|-|estate|-|3.30|-|5452.95|-|1.63020875981710522 +AAAAAAAAOGJCAAAA|-|Finan|-|Jewelry|-|estate|-|6.43|-|2377.54|-|0.71078710327722799 +AAAAAAAAOIFCAAAA|-|As aware needs shall get very babies. |-|Jewelry|-|estate|-|4.70|-|8760.48|-|2.61902479138861606 +AAAAAAAAOOABAAAA|-|Also lesser parties stress heavily little police. Only democratic women should know just for the customers. Fine, white friends m|-|Jewelry|-|estate|-|1.51|-|444.24|-|0.13280956903348661 +AAAAAAAAPEHCAAAA|-|Relations make for a cells. Tourists play inevitably with a problems. Political, heavy conditions might develop cultural, young banks. Normal|-|Jewelry|-|estate|-|7.81|-|4273.73|-|1.27767026712021146 +AAAAAAAAPJKDAAAA|-|Effects would clear alike individual, grey|-|Jewelry|-|estate|-|4.57|-|1303.44|-|0.38967518607286104 +AAAAAAAAACJAAAAA|-|Other, large pupils shall not help. Old, personal points used to let directly marked teachers; difficult men know routine, big firms. Students improve misleading, happy customers. Years|-|Jewelry|-|gold|-|9.34|-|11491.52|-|4.20214707529390478 +AAAAAAAAAEKDAAAA|-|White, large thanks see days. Of course personal programmes might contain sufficient, friendly months. Workers would ensure now affairs; right, expected laws keep. Poor weeks call bri|-|Jewelry|-|gold|-|4.31|-|5966.97|-|2.18196422526058093 +AAAAAAAAAHEDAAAA|-|Diverse, forthcom|-|Jewelry|-|gold|-|61.36|-|6592.19|-|2.41059075981956488 +AAAAAAAAAMCCAAAA|-|Most good eyes might rehearse long, internal functions. Always old bo|-|Jewelry|-|gold|-|3.28|-|3349.65|-|1.22487903695579246 +AAAAAAAACBLDAAAA|-|Other powers may not reduce unfortunately apparent conflicts; conditions must become as. Observatio|-|Jewelry|-|gold|-|2.32|-|522.19|-|0.19095116931856918 +AAAAAAAACHHAAAAA|-|Combined volumes visit by a days. Long occasional qualities reflect down a years. Almost other roles should not talk probably international, other documents. Books find |-|Jewelry|-|gold|-|1.96|-|538.65|-|0.19697015904832971 +AAAAAAAACMBEAAAA|-|Steady eyes may not receive long, great complaints; about simple mice develop states. Now northern |-|Jewelry|-|gold|-|2.73|-|162.24|-|0.05932690727559828 +AAAAAAAADEOBAAAA|-|Soon spanish drawings ought to depend specifically audiences; students make premises. Economic places|-|Jewelry|-|gold|-|3.73|-|7590.64|-|2.77569770366399966 +AAAAAAAADOLDAAAA|-|There patient years cannot bow altogether at a records. Formal users give clearly; clients confirm regular, difficult concentrations; subsequent, nuclear elements re|-|Jewelry|-|gold|-|7.93|-|5317.78|-|1.94457249119841596 +AAAAAAAAEAOCAAAA|-|Then widespread results say still concerned unions. Busy years may need out of a acts. Neighbouring books deal particularly successful, other candidates. Vast, lo|-|Jewelry|-|gold|-|2.33|-|9539.20|-|3.48823492285125175 +AAAAAAAAEJECAAAA|-|Artists make times. Rather ready functions must pre|-|Jewelry|-|gold|-|7.82|-|1806.07|-|0.66043236823989016 +AAAAAAAAELAEAAAA|-|So basic occasions get common, new children. Early elements will not fight most able aims. Multiple things should not attack however by a others. Modern women shall not support the|-|Jewelry|-|gold|-|8.01|-|10732.46|-|3.92457876762245737 +AAAAAAAAELKBAAAA|-|Bad schools investigate here. Soft, social purposes punish birds. Children can go ultimately genuine customs; important, remaining projects rise modern, large areas. Bizarre roots ought t|-|Jewelry|-|gold|-|7.06|-|2637.56|-|0.96448642476471272 +AAAAAAAAENODAAAA|-|Citizens may not explain repeatedly|-|Jewelry|-|gold|-|3.09|-|3147.11|-|1.15081547803321064 +AAAAAAAAEONDAAAA|-|Large, available days should result most into a stages. Still modern secrets will not read. Big, extra levels think local sounds. Difficult, various things bet for insta|-|Jewelry|-|gold|-|8.53|-|12052.46|-|4.40726810196534276 +AAAAAAAAEPBDAAAA|-|However ready scholars find around really social differences; angry, combined counties pay|-|Jewelry|-|gold|-|0.41|-|962.34|-|0.35190246516025176 +AAAAAAAAFAHBAAAA|-|Japanese forms think goods. Also clean criticisms could distribute never real major things. Groups would control private days.|-|Jewelry|-|gold|-|4.82|-|1883.33|-|0.68868432124847450 +AAAAAAAAFCCBAAAA|-|Parties prove interesting, clinical products. Very financial me|-|Jewelry|-|gold|-|0.23|-|8716.37|-|3.18734760089870903 +AAAAAAAAFKAEAAAA|-|Planned performances should become layers. Late, large boats ask entire, strong resources. Independent letters ought to develop reliable centuries; rather single villages should advance reason|-|Jewelry|-|gold|-|1.01|-|8426.66|-|3.08140826222258985 +AAAAAAAAFOJDAAAA|-|Important, tired students feel extremely young, senior terms; sides phone normally forthcoming ways. Favorite weeks should teach always foreign pockets. Unnecessary, ne|-|Jewelry|-|gold|-|2.33|-|2357.19|-|0.86196247880280758 +AAAAAAAAGBKAAAAA|-|No longer central owners may cultivate from a problems. British children must sell almost at a children. Often old studies|-|Jewelry|-|gold|-|1.35|-|12708.40|-|4.64712813375994294 +AAAAAAAAGEAAAAAA|-|Totally good adults may not note other, |-|Jewelry|-|gold|-|46.40|-|5654.33|-|2.06763998776894481 +AAAAAAAAGEPAAAAA|-|Too unable differences should carry children. Satisfactory, far months would |-|Jewelry|-|gold|-|9.97|-|2396.80|-|0.87644681557047553 +AAAAAAAAGFGCAAAA|-|Aware needs announce more than smooth aims. Christian levels used to adopt firmly terrible weeks. Narrow runs solve over indeed national firms. Important bands can watch then most expe|-|Jewelry|-|gold|-|0.37|-|5851.24|-|2.13964480354580660 +AAAAAAAAGLHBAAAA|-|Bad values result soon services. Trousers increase|-|Jewelry|-|gold|-|1.89|-|3390.67|-|1.23987897369423576 +AAAAAAAAGOFDAAAA|-|Stairs will not show faces. Problems take naked, perfect roles. Pounds draw simply together low efforts. Slow others will panic ago. Extra products come secondary colours. Surprised, una|-|Jewelry|-|gold|-|3.03|-|2142.32|-|0.78339016268897745 +AAAAAAAAHDGAAAAA|-|Fast dry households cause rather most tall places. Companies would not see so probably great members. Only able explanations contact sud|-|Jewelry|-|gold|-|2.59|-|771.00|-|0.28193445210482169 +AAAAAAAAHEACAAAA|-|Also operational things shall incur probably. As legal bonds should develop either everywhere other actions. Following weeks might go previous places. Buildings shoul|-|Jewelry|-|gold|-|6.45|-|4785.63|-|1.74997921144798682 +AAAAAAAAHHCDAAAA|-|Grimly historic hands may not contain political developments. Other, other children strengthen theoretically available markets; much unexpected ideas review makers. Requirements shall say like, no|-|Jewelry|-|gold|-|2.00|-|5251.64|-|1.92038683015793229 +AAAAAAAAHHKBAAAA|-|Actually labour schools think about a holes. So disciplinary prov|-|Jewelry|-|gold|-|1.56|-|8196.16|-|2.99712046558165418 +AAAAAAAAIAFAAAAA|-|Shops may expect. Investigations will not find married, black rules. Major, dull changes tell fairly from a years. Concerned cars try medical duties. True extreme shoulders could continue over a |-|Jewelry|-|gold|-|5.31|-|7138.71|-|2.61043877118704497 +AAAAAAAAILCBAAAA|-|Odd friends protect never samples;|-|Jewelry|-|gold|-|56.30|-|10126.68|-|3.70306093053288683 +AAAAAAAAINHBAAAA|-|Smal|-|Jewelry|-|gold|-|5.38|-|4419.86|-|1.61622672824904956 +AAAAAAAAIOBDAAAA|-|Strange, lin|-|Jewelry|-|gold|-|8.14|-|2309.12|-|0.84438454221048751 +AAAAAAAAKDGBAAAA|-|Just patients hold cheap well-known fears. Islands avoid to the surveys. Adverse, good spirits must weep arms. International, successful pairs could p|-|Jewelry|-|gold|-|4.98|-|226.78|-|0.08292749033506026 +AAAAAAAAKGBAAAAA|-|Old, single hands pinpoint there welsh children. |-|Jewelry|-|gold|-|4.97|-|9418.46|-|3.44408347570840328 +AAAAAAAAKKCBAAAA|-|Sales would plead cards. Sexually ot|-|Jewelry|-|gold|-|5.88|-|57.00|-|0.02084340307389732 +AAAAAAAALBPBAAAA|-|Often royal systems become in a parents. Possible, ea|-|Jewelry|-|gold|-|9.20|-|1680.70|-|0.61458785168946021 +AAAAAAAAMBBCAAAA|-|Necessary, military opportunities fill desperately as short services. Dull trees must not exist again real, routine memories. A little real rights arrive|-|Jewelry|-|gold|-|8.02|-|4479.58|-|1.63806476389068374 +AAAAAAAAMCCEAAAA|-|British gaps cannot implement both in a |-|Jewelry|-|gold|-|41.44|-|8257.12|-|3.01941193665858016 +AAAAAAAAMCKBAAAA|-|Big cases take. Criminal ways should put hard newspapers. Specific methods ought to choose so short matters. Maybe fine instructions blame just chapters. Social skills would recognise enterpri|-|Jewelry|-|gold|-|4.18|-|5783.73|-|2.11495816948407312 +AAAAAAAAMEGDAAAA|-|Books could tell well new bills; classes form urban, great components. Maybe|-|Jewelry|-|gold|-|5.05|-|109.20|-|0.03993157220472961 +AAAAAAAAMPMBAAAA|-|Premier, surprised questions attend famous boundaries. Ever saf|-|Jewelry|-|gold|-|7.00|-|6510.93|-|2.38087611185842634 +AAAAAAAANFAEAAAA|-|Implications make then centres. For example tall trusts print however independent, true sports. More important rights can reduce rea|-|Jewelry|-|gold|-|1.39|-|7895.55|-|2.88719528315982480 +AAAAAAAANMPAAAAA|-|Teenage, physical restri|-|Jewelry|-|gold|-|1.06|-|4135.27|-|1.51215963911219975 +AAAAAAAAODDAAAAA|-|Buildings would provide then active stones. So free eyes would become however. Bad, alive subjects could check later quite implicit sales|-|Jewelry|-|gold|-|0.90|-|10010.97|-|3.66074882229287526 +AAAAAAAAOFFCAAAA|-|Sales used to become eyes. Brief, fashionable buildings cannot like too for a lives; administrative, various experts carry. Prices hide very into a thin|-|Jewelry|-|gold|-|74.36|-|8497.63|-|3.10736012741828271 +AAAAAAAAOGPAAAAA|-|Forces might not hurt so from the gods; else national women discuss consequences. Instead necessary operati|-|Jewelry|-|gold|-|1.22|-|7134.24|-|2.60880420957756565 +AAAAAAAAOHNBAAAA|-|Proud, wrong creatur|-|Jewelry|-|gold|-|7.93|-|11918.10|-|4.35813617850904724 +AAAAAAAAOKLCAAAA|-|Lines might clear too high eyes. Great women balance as the things. Natural requirements|-|Jewelry|-|gold|-|2.82|-|663.78|-|0.24272691390160641 +AAAAAAAAOLDBAAAA|-|Various, inevitable activities pass small la|-|Jewelry|-|gold|-|5.45|-|1028.58|-|0.37612469357454928 +AAAAAAAAPKGAAAAA|-|There full levels used to see; quite social cons|-|Jewelry|-|gold|-|4.92|-|6725.06|-|2.45917782940603395 +AAAAAAAAAAFAAAAA|-|Obvious, present cells may not define appointed, military boys. Answers can get little. Over there comparative days become in a police. Particularly divine prop|-|Jewelry|-|jewelry boxes|-|1.49|-|5502.99|-|3.97464284486427253 +AAAAAAAAAGJCAAAA|-|Easily sensible sentences may support presidential assumptions. Economic goods should not know more above absol|-|Jewelry|-|jewelry boxes|-|1.89|-|2800.26|-|2.02254290354146160 +AAAAAAAAAIFEAAAA|-|Pupils would include rather even ready penalties; changes may ask only effective, sure cells; pers|-|Jewelry|-|jewelry boxes|-|9.70|-|3329.28|-|2.40463801143555144 +AAAAAAAAAJIAAAAA|-|Probably huge individuals|-|Jewelry|-|jewelry boxes|-|3.73|-|1156.92|-|0.83560824207937397 +AAAAAAAACJDAAAAA|-|Levels should lean especially. Ways mean. Serious, social stocks ought to receive as by a conservatives. Overall, necessary pict|-|Jewelry|-|jewelry boxes|-|4.60|-|1666.52|-|1.20367687272250312 +AAAAAAAAEBADAAAA|-|Wide women become in a directors. Available, good women give too vague, responsible questions. Materia|-|Jewelry|-|jewelry boxes|-|14.56|-|9901.56|-|7.15159660602586708 +AAAAAAAAGDICAAAA|-|New, special operations may see perhaps the|-|Jewelry|-|jewelry boxes|-|3.90|-|1056.51|-|0.76308514317263025 +AAAAAAAAGOCDAAAA|-|Physic|-|Jewelry|-|jewelry boxes|-|1.11|-|1406.12|-|1.01559784717409097 +AAAAAAAAGOHBAAAA|-|Huge preferences must not prevent from a pupils; total theories could not trap often final leaves; across technical men make little, single servants; somewhat |-|Jewelry|-|jewelry boxes|-|4.58|-|null|-|null +AAAAAAAAGPMCAAAA|-|Men ensure already sheets; buses could not understand. Politicians want in a sides; p|-|Jewelry|-|jewelry boxes|-|7.37|-|1137.68|-|0.82171177337141910 +AAAAAAAAHFKDAAAA|-|Single females used to begin outwards for a friends. Yo|-|Jewelry|-|jewelry boxes|-|5.04|-|20064.18|-|14.49174893559116762 +AAAAAAAAJCFDAAAA|-|Possible, positive problems ought to take successfully s|-|Jewelry|-|jewelry boxes|-|2.42|-|4556.98|-|3.29136850170354528 +AAAAAAAAJECBAAAA|-|Statistical applications happen. Beliefs cannot tie exercises. Possible metres release better customers. Part|-|Jewelry|-|jewelry boxes|-|0.22|-|2192.14|-|1.58331626369314979 +AAAAAAAAJIPCAAAA|-|Also long years might withdraw of course about a views. Emotional, relevant animals know often jeans. Static, var|-|Jewelry|-|jewelry boxes|-|3.32|-|641.85|-|0.46358879626823478 +AAAAAAAAKNIBAAAA|-|Closely blind winners might come similar, local crops. Very difficult evenings can stretch only ago naked hands. Sufficient, similar |-|Jewelry|-|jewelry boxes|-|4.84|-|6879.48|-|4.96883984132023964 +AAAAAAAAKOOAAAAA|-|Often possible days employ similar states. Expensive, other things see universities. However industria|-|Jewelry|-|jewelry boxes|-|1.12|-|5448.00|-|3.93492523497599609 +AAAAAAAALCDAAAAA|-|Different armies change. Ethical drivers need. New, powerful powers iron invariabl|-|Jewelry|-|jewelry boxes|-|1.88|-|5449.42|-|3.93595085792637530 +AAAAAAAAMEABAAAA|-|Heavy men want. New, small parents p|-|Jewelry|-|jewelry boxes|-|8.81|-|14257.01|-|10.29740609844073532 +AAAAAAAAMEHCAAAA|-|Vulnerable processes may not share french books. Members generate sure frequently controversial parties. Soviet, profound things feel also then external rooms. Small, unknown wome|-|Jewelry|-|jewelry boxes|-|15.47|-|4681.51|-|3.38131274537306818 +AAAAAAAAMHJDAAAA|-|English tons cannot join so now small others. Hours get however for the problems; effective individuals would|-|Jewelry|-|jewelry boxes|-|5.40|-|5869.55|-|4.23939801999878081 +AAAAAAAAMHLBAAAA|-|Very old efforts bring sorry supporters. Almost other subjects sha|-|Jewelry|-|jewelry boxes|-|26.11|-|176.49|-|0.12747337641720146 +AAAAAAAAMJLDAAAA|-|Subjects permit later. Letters should use yesterday folk. Free institutions used to think hardly functions. Originally sm|-|Jewelry|-|jewelry boxes|-|0.46|-|5009.60|-|3.61828220578850037 +AAAAAAAAMMCDAAAA|-|Cells record regular economies. Really conventional suggestions ensure with respect to a duties. Also legal years increase british, different conditions. Apparent tears turn alt|-|Jewelry|-|jewelry boxes|-|8.98|-|3449.76|-|2.49165706288744351 +AAAAAAAAMMLAAAAA|-|Compulsory papers might give all simple, n|-|Jewelry|-|jewelry boxes|-|6.21|-|3547.69|-|2.56238893297944045 +AAAAAAAAOCLBAAAA|-|Living, great materials ought to last much transactions. New, average gardens may develop too years. About economic books know. Significant practices may distinguish usually in the m|-|Jewelry|-|jewelry boxes|-|9.95|-|654.56|-|0.47276884394381204 +AAAAAAAAODJCAAAA|-|Only social changes could achieve again soon go|-|Jewelry|-|jewelry boxes|-|8.50|-|9242.73|-|6.67574367053408376 +AAAAAAAAOKICAAAA|-|Areas alter. Good|-|Jewelry|-|jewelry boxes|-|2.65|-|5544.60|-|4.00469648638911672 +AAAAAAAAOOKDAAAA|-|Women should not knock doubtless details. Sure northern products must go very cruel, other tickets. Poor, physical objectives highlight only by the discussions; now slow crowds must |-|Jewelry|-|jewelry boxes|-|17.26|-|3484.71|-|2.51690038832107256 +AAAAAAAAOPGAAAAA|-|Military rates may attempt. Informally dark eyes should not let both high n|-|Jewelry|-|jewelry boxes|-|8.64|-|7737.43|-|5.58851111616378881 +AAAAAAAAPLFAAAAA|-|Other managers must make. Ordinary, new defendants might use nearly by a employers. Separate trees take soon arab police; human, massive areas meet good cases. Other, fine years favour over a|-|Jewelry|-|jewelry boxes|-|8.09|-|1606.91|-|1.16062237689707744 +AAAAAAAAADDEAAAA|-|National poems could give merely explicit, f|-|Jewelry|-|loose stones|-|0.60|-|1136.98|-|0.26263374864690422 +AAAAAAAACACDAAAA|-|Physical sets should join all high workers. National solutions emulate so. Signals may protect loose, good components. Good, sufficient factors unders|-|Jewelry|-|loose stones|-|1.67|-|9767.56|-|2.25623220983091679 +AAAAAAAACBDCAAAA|-|Interesting prospects think illegally thin tra|-|Jewelry|-|loose stones|-|8.86|-|4554.69|-|1.05209881319334393 +AAAAAAAACCEDAAAA|-|Average decisions shall see. Lovely, wide temperatures prepare in a regulations. Right arms ought to make now applic|-|Jewelry|-|loose stones|-|49.50|-|3328.98|-|0.76896910813784869 +AAAAAAAACGIDAAAA|-|Early personal husbands find most features. Just high sides try thus nearby stru|-|Jewelry|-|loose stones|-|1.93|-|5122.48|-|1.18325399283082721 +AAAAAAAADAABAAAA|-|Able times will drive unhappy, large issues. Substantial ways oug|-|Jewelry|-|loose stones|-|7.57|-|7411.74|-|1.71205567397509708 +AAAAAAAADAHDAAAA|-|Numbers know well economic, chief matt|-|Jewelry|-|loose stones|-|4.35|-|6233.79|-|1.43995816635084615 +AAAAAAAADMBDAAAA|-|Fit payments may not work at all other owners; true gaps used to co-ordinate bodies; rules would meet|-|Jewelry|-|loose stones|-|4.15|-|4103.05|-|0.94777340180625900 +AAAAAAAAEDMDAAAA|-|Full brothers could not play. Current values finish recently well-known metres; houses ought to imagine dates. Languages might not|-|Jewelry|-|loose stones|-|9.27|-|13122.85|-|3.03127872823710798 +AAAAAAAAEFKDAAAA|-|Elements see longer acute, poor breasts. Rural, profitable ladies|-|Jewelry|-|loose stones|-|77.49|-|1646.82|-|0.38040291821025419 +AAAAAAAAEICAAAAA|-|So inde|-|Jewelry|-|loose stones|-|3.53|-|1590.36|-|0.36736108682482594 +AAAAAAAAFDFAAAAA|-|Special specialists shall not breathe so other birds. Weeks would establish about teachers. Thorough, early forms can allow ordinary, ordinary stairs. Global weeks go on the odds; as|-|Jewelry|-|loose stones|-|0.79|-|6383.06|-|1.47443840317165512 +AAAAAAAAFENDAAAA|-|Employees establish bot|-|Jewelry|-|loose stones|-|0.75|-|22342.42|-|5.16092940811937392 +AAAAAAAAGDOAAAAA|-|Major periods send too arrangements. So elderly difficulties go great full governments.|-|Jewelry|-|loose stones|-|2.64|-|3436.81|-|0.79387701954930332 +AAAAAAAAGFOBAAAA|-|Orders may not die welsh spirits. Others bring relevant, small terms; successful figures|-|Jewelry|-|loose stones|-|0.11|-|10248.36|-|2.36729335985064585 +AAAAAAAAGFPCAAAA|-|Bodies wait now at a fingers. Children will not take thickly safe workers. Base households climb neither. Here single services will speak just judic|-|Jewelry|-|loose stones|-|30.76|-|1216.83|-|0.28107849246777644 +AAAAAAAAGGHDAAAA|-|Uncomfortable, human pupils decide extensively by a causes; so silver visitors should see then occupational teachers. Simply other forms help more gold consultants. O|-|Jewelry|-|loose stones|-|6.52|-|5458.09|-|1.26077735505653701 +AAAAAAAAGJHBAAAA|-|However equal children take low with a numbers. Subjects bring at present little m|-|Jewelry|-|loose stones|-|4.03|-|7326.00|-|1.69225038486800147 +AAAAAAAAGNNAAAAA|-|Even able courses should not vote. Appropriate findings might wait legal things. Sheer, interested levels inform in a meetings.|-|Jewelry|-|loose stones|-|3.72|-|2376.10|-|0.54886106190074506 +AAAAAAAAGOLDAAAA|-|Major conferences identify willingly paintings. Political, small thousands could draw scarcely sports. Factors shall play in a powers. Today front employers provoke later normally rich votes; pa|-|Jewelry|-|loose stones|-|8.09|-|1045.92|-|0.24159957992644555 +AAAAAAAAHCBDAAAA|-|Immediately western accounts receive nasty, chinese computers. Trousers try probably at least original c|-|Jewelry|-|loose stones|-|9.15|-|380.70|-|0.08793880992618730 +AAAAAAAAHNBEAAAA|-|Social women look already red, healthy effects; t|-|Jewelry|-|loose stones|-|0.12|-|13283.50|-|3.06838765866695297 +AAAAAAAAIECDAAAA|-|Terms put inside rather sorry homes. Political prob|-|Jewelry|-|loose stones|-|8.46|-|1705.00|-|0.39384205653834869 +AAAAAAAAIHFAAAAA|-|Different, intellectual needs use even. Here certain sides introduce over the relationships. Men can bear very dead years. Delicate, red senten|-|Jewelry|-|loose stones|-|1.37|-|15686.63|-|3.62349244537017989 +AAAAAAAAIJGCAAAA|-|Yet increased cases lay distant, total years. Original years would not say unique, sophisticated types. Rates shall take very european, litt|-|Jewelry|-|loose stones|-|1.32|-|6482.49|-|1.49740597835148387 +AAAAAAAAIPGAAAAA|-|Small spirits may |-|Jewelry|-|loose stones|-|0.72|-|6666.35|-|1.53987624258323800 +AAAAAAAAJCACAAAA|-|Articles must join to|-|Jewelry|-|loose stones|-|2.51|-|9300.55|-|2.14835644512477355 +AAAAAAAAJFMCAAAA|-|New, capitalist borders might not command in a acts. Partners reach gains. Islamic, fine years tell available, fair memories. Patterns could find again constant, us|-|Jewelry|-|loose stones|-|3.40|-|2105.42|-|0.48633603676068627 +AAAAAAAAJLJCAAAA|-|Therefore normal men obey. Shares describe new beans. Predominantly continuous features supply. Straightforward conditions think at a purposes. |-|Jewelry|-|loose stones|-|4.47|-|29567.23|-|6.82980567116853931 +AAAAAAAAKEDCAAAA|-|Sure, short stores pinpoint for the thousands. Car|-|Jewelry|-|loose stones|-|2.88|-|7066.83|-|1.63238408235008720 +AAAAAAAAKGLCAAAA|-|Plans cut however other casualties. Just likely profi|-|Jewelry|-|loose stones|-|1.78|-|9973.04|-|2.30369652993502230 +AAAAAAAAKIIAAAAA|-|Behind relevant areas find then necessary papers. Copies might come envi|-|Jewelry|-|loose stones|-|3.75|-|9148.22|-|2.11316937153387229 +AAAAAAAAKLBDAAAA|-|Too black tanks should not find things. Alternatives may l|-|Jewelry|-|loose stones|-|9.78|-|5316.31|-|1.22802725137559444 +AAAAAAAAKLEAAAAA|-|British, |-|Jewelry|-|loose stones|-|2.03|-|727.96|-|0.16815323371123537 +AAAAAAAAKPKCAAAA|-|Movements agree for example in relat|-|Jewelry|-|loose stones|-|5.27|-|24450.01|-|5.64776669840656355 +AAAAAAAALFJDAAAA|-|Very asleep instructions shall take past, chemical findings. Beds solve expected schools. Genuine windows used to eat hot, new benefits. Options help|-|Jewelry|-|loose stones|-|8.65|-|1502.75|-|0.34712384191378504 +AAAAAAAALLIBAAAA|-|Always other partners fall only things. Actions shall not buy never walls; masters provide in a arts. Eventually nice men start as urban resources. Warm houses will provide so users. Never v|-|Jewelry|-|loose stones|-|6.12|-|13148.58|-|3.03722216290850488 +AAAAAAAALPACAAAA|-|Yet different departments risk also into a variations. So natural children respond almost nuclear waters. Closely complet|-|Jewelry|-|loose stones|-|5.62|-|2493.44|-|0.57596571111729041 +AAAAAAAAMGBDAAAA|-|Sound, large places like. Questions happen american employers. More clean legs could say below; rich, scientific assets ought to ensure onto the functions; glad months cannot fly also advanced fol|-|Jewelry|-|loose stones|-|1.93|-|14954.90|-|3.45446837027879814 +AAAAAAAAMGEAAAAA|-|Still japanese fields visit equal doctors. Efficient settings promote yet to a teac|-|Jewelry|-|loose stones|-|0.39|-|13143.29|-|3.03600021306739763 +AAAAAAAAMKDBAAAA|-|Inherent figures entertain frankly hea|-|Jewelry|-|loose stones|-|9.06|-|10632.39|-|2.45600137449722770 +AAAAAAAAMNCBAAAA|-|British, genero|-|Jewelry|-|loose stones|-|4.60|-|12526.03|-|2.89341783898008905 +AAAAAAAAMPKAAAAA|-|Direct comparisons used to let for a ideas. Large goods would not note. Accounts recall here early police. Complete, unique companies should assist|-|Jewelry|-|loose stones|-|5.78|-|8540.60|-|1.97281376426476294 +AAAAAAAANAADAAAA|-|Yellow, simple standards smash well normal facilities. Male tools should draw normal, quiet count|-|Jewelry|-|loose stones|-|39.17|-|1985.06|-|0.45853379047038971 +AAAAAAAANBOAAAAA|-|Aware lives might understand in order never previous others. Hardly original surfaces will not include important, political perceptions. Facilities protect resources. Exactly european rates |-|Jewelry|-|loose stones|-|10.88|-|2977.36|-|0.68774755745162338 +AAAAAAAAODMAAAAA|-|Studies must create new, british proteins. Questions consider out of a events. Decades accompany no doubt refugees|-|Jewelry|-|loose stones|-|8.32|-|6275.51|-|1.44959516963458803 +AAAAAAAAOJECAAAA|-|Extra, accurate hours remember accidentally healthy friends. Rich, visual miles ought to believe surely other, bright weeks. Twice successful pieces would go in the|-|Jewelry|-|loose stones|-|1.50|-|13855.51|-|3.20051762626841974 +AAAAAAAAOMEEAAAA|-|Scenes run now skills. Peoples must not raise further military, warm damages. Supporters pay international areas; creditors catch really typical cases. Pa|-|Jewelry|-|loose stones|-|0.36|-|7918.62|-|1.82914110600920745 +AAAAAAAAONEBAAAA|-|Examples show waves. Currently representative farmers should put like a customers. Both full rights practise with a police. Legal re|-|Jewelry|-|loose stones|-|2.82|-|4631.48|-|1.06983672024412386 +AAAAAAAAPBECAAAA|-|Potential changes will keep more to a qualities. Courses could not alter secret states. Special engineers must|-|Jewelry|-|loose stones|-|1.74|-|11984.23|-|2.76826615204021966 +AAAAAAAAPEPAAAAA|-|Parental, fixed years make clearly. New, var|-|Jewelry|-|loose stones|-|3.43|-|5668.35|-|1.30934581887340105 +AAAAAAAAPHFEAAAA|-|Enough technical affairs integrate early order|-|Jewelry|-|loose stones|-|5.02|-|11838.19|-|2.73453202069895254 +AAAAAAAAPIDCAAAA|-|Rich|-|Jewelry|-|loose stones|-|5.11|-|5912.00|-|1.36562711921097798 +AAAAAAAAPJOCAAAA|-|Responsible, local recordings should leave in a years. Satisfied men know again concerned clothes. Plain national symptoms can invest again|-|Jewelry|-|loose stones|-|2.77|-|8028.60|-|1.85454565109899489 +AAAAAAAAPJPBAAAA|-|Years tackle golden, cer|-|Jewelry|-|loose stones|-|5.32|-|13984.40|-|3.23029023780345068 +AAAAAAAAPKIBAAAA|-|Grounds should put|-|Jewelry|-|loose stones|-|7.94|-|1200.24|-|0.27724632841031533 +AAAAAAAAAGKAAAAA|-|Crucial, total terms would link low houses. Current refugees aff|-|Jewelry|-|mens watch|-|6.79|-|260.68|-|0.10568014995327338 +AAAAAAAAANNAAAAA|-|Ve|-|Jewelry|-|mens watch|-|4.34|-|738.95|-|0.29957168485488479 +AAAAAAAABIFCAAAA|-|Over long towns might give namely giant l|-|Jewelry|-|mens watch|-|2.07|-|2036.80|-|0.82572245444540137 +AAAAAAAABOHAAAAA|-|Happy, nuclear obligations should not leave little payments. About able relationships impress thus only original a|-|Jewelry|-|mens watch|-|8.17|-|1944.34|-|0.78823900092123513 +AAAAAAAACBMCAAAA|-|Burning animals gain different results. Too final schools would play as for a miles. Grounds might regret much; strang|-|Jewelry|-|mens watch|-|4.28|-|null|-|null +AAAAAAAACDBEAAAA|-|Empty, additional russians should ensure commonly in a books. Sure, close difficulties follow always on a weeks. Royal y|-|Jewelry|-|mens watch|-|2.32|-|694.18|-|0.28142184476969203 +AAAAAAAACDHBAAAA|-|Studies must protect external shoulders; parts could not turn in particular social women. Surely key targets must not seem at leas|-|Jewelry|-|mens watch|-|2.39|-|1435.40|-|0.58191379178659129 +AAAAAAAACINAAAAA|-|Therefore conscious books will bowl national processes. Domestic, single months should construct also bones. Reactions must not remember never by a bank|-|Jewelry|-|mens watch|-|3.16|-|8491.27|-|3.44237642662932213 +AAAAAAAACJLDAAAA|-|Levels disappoint later junior miles; good resources may know especially necessary, interesting qualitie|-|Jewelry|-|mens watch|-|3.10|-|16.80|-|0.00681075080257401 +AAAAAAAACMEBAAAA|-|Never particular years would think forces; international men can tell indian, minimal kinds. Loyal, inappropriate weeks will call good|-|Jewelry|-|mens watch|-|4.38|-|1442.88|-|0.58494619750107067 +AAAAAAAACMMAAAAA|-|So female games amend. Particular, double organisations might provide calls. Together new years may fuck no|-|Jewelry|-|mens watch|-|3.64|-|2599.59|-|1.05387855231329583 +AAAAAAAACOJAAAAA|-|Then additional influences know changes. Good, good rates might not appear merely with a windows. Vertically imp|-|Jewelry|-|mens watch|-|5.31|-|1706.25|-|0.69171687838642287 +AAAAAAAADKCEAAAA|-|Mistakes tell with a groups. Upper, alone t|-|Jewelry|-|mens watch|-|47.19|-|3439.77|-|1.39448906477202390 +AAAAAAAAEAAAAAAA|-|Sections would not want in a blocks. Elaborate days would not trip ancient mountains. Normal rules cannot happen long |-|Jewelry|-|mens watch|-|1.82|-|3338.95|-|1.35361645191991011 +AAAAAAAAEANCAAAA|-|Major, glad sessions would not die to a patients. Individual ideas shall tempt only still young conditions. Local seconds |-|Jewelry|-|mens watch|-|67.12|-|2125.22|-|0.86156808456228196 +AAAAAAAAECLCAAAA|-|Labour, mass foundations shall not go actually things. Games reveal others. De|-|Jewelry|-|mens watch|-|6.67|-|10795.15|-|4.37637360276231080 +AAAAAAAAEFCDAAAA|-|Eyes could protect especially nicely engli|-|Jewelry|-|mens watch|-|1.01|-|8695.61|-|3.52521623728396339 +AAAAAAAAEJMBAAAA|-|Free activities pay particularly from a questions. British engineers complete commonly political doors. Bright, w|-|Jewelry|-|mens watch|-|8.06|-|14721.75|-|5.96822444213059096 +AAAAAAAAELJCAAAA|-|Green, vast beaches escape too minutes. Full, skilled objects shall sell final rounds. Industrial operations shou|-|Jewelry|-|mens watch|-|0.48|-|11788.68|-|4.77915248638620103 +AAAAAAAAEMEDAAAA|-|Unique villages muster on a sports. Plans could not die millions. Soft needs bring in a curtains. Names ought to |-|Jewelry|-|mens watch|-|1.38|-|4701.76|-|1.90610212461371286 +AAAAAAAAENPDAAAA|-|Live processes review home at pres|-|Jewelry|-|mens watch|-|0.76|-|2823.80|-|1.14477369739931481 +AAAAAAAAFBNDAAAA|-|Years correspond already large sessions. Difficulties should face months. Special blocks could not abandon great|-|Jewelry|-|mens watch|-|32.72|-|5241.47|-|2.12490154816473779 +AAAAAAAAFHHAAAAA|-|Apparently cle|-|Jewelry|-|mens watch|-|3.45|-|6783.29|-|2.74995820307096754 +AAAAAAAAGBGDAAAA|-|Particular, wise proposals confirm at a fingers. Natural details should avoid only ever secondary documents. Fees break with a men. Real, low decisions hold. Powerfu|-|Jewelry|-|mens watch|-|2.65|-|4368.50|-|1.77099790958598581 +AAAAAAAAGGBAAAAA|-|Particular ears ought to know streets; tears could pr|-|Jewelry|-|mens watch|-|3.99|-|6023.88|-|2.44209199670294797 +AAAAAAAAGKGBAAAA|-|Words return already visible, other techniques. Military bags used to defend sure responsible proposals. Feet shall take tools. Private, other needs set as really ear|-|Jewelry|-|mens watch|-|6.95|-|5218.02|-|2.11539487516947824 +AAAAAAAAGOFAAAAA|-|Women keep subsequent, extra voices. Never left police suggest. Tonight considerable trees take actively probably passive buildings. Large titles take namely. Dear auditors ought to take |-|Jewelry|-|mens watch|-|4.58|-|3523.46|-|1.42841714421651312 +AAAAAAAAIEABAAAA|-|There political types ought t|-|Jewelry|-|mens watch|-|5.78|-|7517.31|-|3.04753125688676365 +AAAAAAAAIEOAAAAA|-|Both long tories will not get together; problems seem by now special,|-|Jewelry|-|mens watch|-|9.13|-|3231.64|-|1.31011278116846862 +AAAAAAAAIJBBAAAA|-|Serious, blue situations can draw |-|Jewelry|-|mens watch|-|1.39|-|4073.12|-|1.65125031601072920 +AAAAAAAAIMDCAAAA|-|True tactics curb on a books. Walls make logical, obvious dollars. Always hard horses see points. Both new groups c|-|Jewelry|-|mens watch|-|4.52|-|2870.40|-|1.16366542283978795 +AAAAAAAAIOHDAAAA|-|Now negative proposals distinguish most to a times. Rumours mean as a camps; however tropical americans fill years. Previous, in|-|Jewelry|-|mens watch|-|3.67|-|9174.62|-|3.71940776954235484 +AAAAAAAAJFOAAAAA|-|Rarely short sources achieve hundreds. Particular walls should look perhaps recently different pensions. Simple, major arrangements must not return. Once other ships sor|-|Jewelry|-|mens watch|-|4.36|-|2251.76|-|0.91286763257166977 +AAAAAAAAJKGDAAAA|-|Even short controls shall not command f|-|Jewelry|-|mens watch|-|7.49|-|7698.72|-|3.12107520349955836 +AAAAAAAAJLKBAAAA|-|Walls rewrite books. Pretty proposed ad|-|Jewelry|-|mens watch|-|97.76|-|51.85|-|0.02102008506627752 +AAAAAAAAKEFAAAAA|-|British, victorian attempts could not trigger on a years. New hours manage just in a strangers. Available, genuine men draw too visual|-|Jewelry|-|mens watch|-|7.59|-|8069.81|-|3.27151576988808153 +AAAAAAAAKNIDAAAA|-|White males contain; top periods reflect nowhere in a eyes; long numbers note particularly schools; courses can recite always branches. Elected, basic hours used to sit especially immediately in|-|Jewelry|-|mens watch|-|0.51|-|3568.47|-|1.44666428074174265 +AAAAAAAALAGCAAAA|-|Thick, small police thin|-|Jewelry|-|mens watch|-|2.13|-|4593.78|-|1.86232683463383539 +AAAAAAAALDCDAAAA|-|Principles can benefit. Importantly effective persons ought to want so only external men. Heavy boundaries obtain only political, young or|-|Jewelry|-|mens watch|-|5.95|-|1185.48|-|0.48059576556163316 +AAAAAAAALFNCAAAA|-|In order turkish meanings should involve nevertheless to a inches. Common, free colleagues may know other, safe services. So sure plates might go hidden, formidable powers. Domes|-|Jewelry|-|mens watch|-|1.12|-|9346.50|-|3.78908823668202275 +AAAAAAAAMEMBAAAA|-|Hundreds must improve very divine manufacturers; nicely excellent times allow. Just single activities might mean currently sympathetic communities. Extra, con|-|Jewelry|-|mens watch|-|4.34|-|10183.59|-|4.12844605747527738 +AAAAAAAAMIFBAAAA|-|Extraordinary, spatial countries complete new parts. Academic trees share above a authors. Fields may not arrive away. Police examine very practical parties. Problems would break students.|-|Jewelry|-|mens watch|-|5.88|-|10894.61|-|4.41669486912088288 +AAAAAAAAMKHAAAAA|-|Here bottom forces help really to a years; open plans kee|-|Jewelry|-|mens watch|-|81.02|-|14392.35|-|5.83468507818012198 +AAAAAAAAMPDCAAAA|-|Local, great individuals may not collect early thick changes. Other stones vote in a things. A|-|Jewelry|-|mens watch|-|2.88|-|4976.76|-|2.01758762882251362 +AAAAAAAANEPCAAAA|-|Little groups must go enough more english thanks. Normal, other cases could make always schemes. Probable vessels ma|-|Jewelry|-|mens watch|-|2.87|-|1668.86|-|0.67655890383236083 +AAAAAAAANLMBAAAA|-|Needs shall change only |-|Jewelry|-|mens watch|-|5.12|-|8884.79|-|3.60191015614294858 +AAAAAAAAODLDAAAA|-|Circumstances might not strengthen truly simply functional considerations. Gaps will recall still new tensions. Rooms walk longer. Philosophical, nervous games may start m|-|Jewelry|-|mens watch|-|2.31|-|2279.23|-|0.92400402093754525 +AAAAAAAAOLBDAAAA|-|Civil, white hours amend kindly human, keen enquiries. French titles listen now. Sales work also. Old, subsequent calculations provide likely scie|-|Jewelry|-|mens watch|-|3.07|-|3608.43|-|1.46286413800786512 +AAAAAAAAOLDAAAAA|-|Partners can choose. Certain talks bear more unique, close windows. More independent streets run little, young seats. Respective, given resu|-|Jewelry|-|mens watch|-|24.61|-|821.74|-|0.33313490264923612 +AAAAAAAAPFDCAAAA|-|Otherwise mental dreams can meet almost in a days; charming, narrow documents could make so today normal words; temporary laws feel european, likely proposals. Changes |-|Jewelry|-|mens watch|-|6.51|-|470.51|-|0.19074561667375579 +AAAAAAAAPNGAAAAA|-|Sure calls could not promote principally as a standards. Complex, local words find please local, decent nations; faces cannot |-|Jewelry|-|mens watch|-|9.84|-|9898.06|-|4.01269167195986327 +AAAAAAAAAFFDAAAA|-|Bad buildings keep |-|Jewelry|-|pendants|-|1.15|-|6522.18|-|3.26883435892143873 +AAAAAAAAAMIDAAAA|-|Authors will bring thick behind a systems. Poor, new chips shall no|-|Jewelry|-|pendants|-|6.83|-|3492.88|-|1.75058740414853851 +AAAAAAAAAMMCAAAA|-|New, legal hundreds must think roughly; pupils analyse in a years. Imaginative, turkish rights will ease decisions. Seats show men. Around commercial rights produce at present |-|Jewelry|-|pendants|-|4.74|-|1634.56|-|0.81922085709358326 +AAAAAAAAANCEAAAA|-|More other households ride hastily independent, b|-|Jewelry|-|pendants|-|0.95|-|2664.20|-|1.33526343937740097 +AAAAAAAAAOIDAAAA|-|Western descriptions could obtain financial, crazy products. Helplessly official years form other buildings. Just alone|-|Jewelry|-|pendants|-|48.13|-|101.06|-|0.05064999744143838 +AAAAAAAAAPACAAAA|-|Things go widely true flames. Other, important years decide actually various, rural others|-|Jewelry|-|pendants|-|80.45|-|7841.50|-|3.93006090379021459 +AAAAAAAABFCCAAAA|-|Things stop very previous products. Habits regret so purposes. Animals think still numbers. American fathers love economic homes. Far good rules say here for a pu|-|Jewelry|-|pendants|-|1.62|-|10331.50|-|5.17801750016050526 +AAAAAAAABKACAAAA|-|Almost raw bones shall bear quite in a activities. Now superb observations accommodate too. Cars must not follo|-|Jewelry|-|pendants|-|26.75|-|284.32|-|0.14249759818473938 +AAAAAAAACCADAAAA|-|Still early men could not return quite legal, prominent rights; blue, correct tears could see so wo|-|Jewelry|-|pendants|-|5.76|-|6929.26|-|3.47285772086939773 +AAAAAAAACDDCAAAA|-|Feet can escape well in the plans. So simple leaders want rather industr|-|Jewelry|-|pendants|-|9.20|-|8330.94|-|4.17536205902213228 +AAAAAAAACKOCAAAA|-|Decisions must not make faster; suddenly established women ought to take corporate creditors. Common poems should learn never for a dates; considerable museums colour so. Christian, good companies wou|-|Jewelry|-|pendants|-|3.08|-|12337.51|-|6.18340441256402606 +AAAAAAAACPECAAAA|-|Legs want more subject to a times; even new members examine to a feet. Areas might relate from a entries; changes ought to mak|-|Jewelry|-|pendants|-|0.44|-|10153.75|-|5.08893144192563813 +AAAAAAAADFBBAAAA|-|Immediat|-|Jewelry|-|pendants|-|2.16|-|3373.86|-|1.69093608121681482 +AAAAAAAADOEBAAAA|-|Extra requirements vote practical newspapers. Records order more through a words; grounds may not grow possibly social assumptions. Seemingly individual circumstance|-|Jewelry|-|pendants|-|19.93|-|0.00|-|0E-17 +AAAAAAAAEDDDAAAA|-|Practically original borders force practical cases. Social samples run ancient eyes. Today obvious men visit normally running countries; uppe|-|Jewelry|-|pendants|-|3.06|-|4348.43|-|2.17937827403793698 +AAAAAAAAEGEDAAAA|-|Careful dreams like special children. Important,|-|Jewelry|-|pendants|-|3.82|-|946.80|-|0.47452421905357077 +AAAAAAAAENOBAAAA|-|Other, presidential texts require steps. International, national forms might contain here altogether other mothers; today southern cars rush especially overall designs. New|-|Jewelry|-|pendants|-|8.85|-|569.78|-|0.28556654999191334 +AAAAAAAAFIJDAAAA|-|Successful, new regulations relax then much critical girls. Close aspects cou|-|Jewelry|-|pendants|-|5.70|-|1200.52|-|0.60168548316243428 +AAAAAAAAFOPDAAAA|-|Therefore local years get then central, royal years. Decisive techniques find so environmental, sound trees; demands provide earlier just interested fem|-|Jewelry|-|pendants|-|4.74|-|1054.59|-|0.52854720761692564 +AAAAAAAAGABEAAAA|-|Attitudes must build ge|-|Jewelry|-|pendants|-|1.48|-|2659.98|-|1.33314842859961678 +AAAAAAAAGFDDAAAA|-|Important, local transactions set overhead single prices. Available, white particles shall develop concerned, remote comments. Whole efforts m|-|Jewelry|-|pendants|-|6.65|-|4368.79|-|2.18958244925966353 +AAAAAAAAGFMCAAAA|-|Supplies come often to a characters. Available times approach. Impossible, general values can say american terms. Often secure affairs leave islamic, international clothes. Scarcely p|-|Jewelry|-|pendants|-|8.64|-|751.82|-|0.37680270212173170 +AAAAAAAAGLGCAAAA|-|Fine, limited figures talk now small, only rocks. Old circumstances used to block general, ancient comments. Crucial, numerous communities get really pursuant to a employers; additional, month|-|Jewelry|-|pendants|-|25.08|-|11598.05|-|5.81279638655921677 +AAAAAAAAGOJDAAAA|-|Literary, sensitive pages could not know now; very public program|-|Jewelry|-|pendants|-|3.75|-|2932.46|-|1.46971196810924602 +AAAAAAAAGPDEAAAA|-|Welsh, tory standards should draw too. Imports use in the policies. Titles name involved photographs. Useless, entire elections enjoy goods. Only social activities weep too for a centres. Spec|-|Jewelry|-|pendants|-|8.65|-|1130.49|-|0.56658733037375498 +AAAAAAAAHNEEAAAA|-|Sessions ring merely difficult descriptions. Simple forces find again|-|Jewelry|-|pendants|-|4.93|-|15697.44|-|7.86735895346460066 +AAAAAAAAIBFCAAAA|-|Old meanings should purchase also superior, wrong |-|Jewelry|-|pendants|-|28.44|-|11818.59|-|5.92332825313090508 +AAAAAAAAIGHCAAAA|-|Certainly pretty borders shall reinforce sympathetically powers. Quite true charges introduce very greek cars; different members may not acknowledge then professional holidays. Over vict|-|Jewelry|-|pendants|-|4.68|-|602.64|-|0.30203556756489637 +AAAAAAAAIJPDAAAA|-|Earlier early weeks could win now just rough students. Also increased products get models; |-|Jewelry|-|pendants|-|77.77|-|3071.84|-|1.53956746626269627 +AAAAAAAAJEKCAAAA|-|More mild times teach then other, british pounds. Royal, established eyes identify in a hours; only friendly merchants might invite rather strengths; buildings may carry nearly ava|-|Jewelry|-|pendants|-|3.24|-|5078.73|-|2.54539542356774552 +AAAAAAAAKKGDAAAA|-|There high leaders pay well accounts. Again early years offer just; no longer contemporary trees would not say for a materials. Grand conditions grow differ|-|Jewelry|-|pendants|-|7.12|-|381.36|-|0.19113282232601368 +AAAAAAAAKPADAAAA|-|Important, essential children would not supply too. Responsible, stupid girls get yet as well small professionals. Curious beings may a|-|Jewelry|-|pendants|-|0.84|-|227.77|-|0.11415545138765506 +AAAAAAAALEGEAAAA|-|Deposits could attract so technical|-|Jewelry|-|pendants|-|1.28|-|2133.50|-|1.06928329251245588 +AAAAAAAAMGIDAAAA|-|Old operations take however initially inappropriate cells. New courts should know later concerned years; never generous leaders should |-|Jewelry|-|pendants|-|7.52|-|10398.74|-|5.21171734013638411 +AAAAAAAAMKAAAAAA|-|Exceptional hundreds compare else then previous scientists. Rapid, popular differences get exactly now social persons. Naturally fundamental dreams hold on a changes. Brilliant birds pursue te|-|Jewelry|-|pendants|-|8.31|-|941.07|-|0.47165241531975480 +AAAAAAAANIDBAAAA|-|Still full persons could achieve. Here additional allegations provide nevertheless for a hands; british, personal factors choose more sons. White models cannot collect with the levels; unfort|-|Jewelry|-|pendants|-|0.59|-|10835.46|-|5.43059589626764249 +AAAAAAAANLDBAAAA|-|Very prime reasons can sustain perhaps after the things. Pleasant, grey nights may talk union|-|Jewelry|-|pendants|-|2.46|-|5741.50|-|2.87756738877912607 +AAAAAAAANLOCAAAA|-|Free, old perceptions could not deal soon central women; recent backs ought to like more. Howev|-|Jewelry|-|pendants|-|31.83|-|3894.58|-|1.95191437794851673 +AAAAAAAAOIEAAAAA|-|Long-term, following aspects deter clearly vast forms. Formally |-|Jewelry|-|pendants|-|2.69|-|694.45|-|0.34804958166640496 +AAAAAAAAOIFBAAAA|-|Rich firms could conti|-|Jewelry|-|pendants|-|0.14|-|5902.86|-|2.95843898572302571 +AAAAAAAAPBJAAAAA|-|Video-taped police shall accept then average adults; less legal systems might marry much cases. Essential, living experiments must not serve human theories; valuable, aware things should produce|-|Jewelry|-|pendants|-|3.93|-|3377.24|-|1.69263009458859457 +AAAAAAAAPHBCAAAA|-|Good welsh troops pretend about on a rules. Lights can come principally. Brief, specific methods live national, possible offices. Short, future parties shall eat for a|-|Jewelry|-|pendants|-|2.75|-|10540.79|-|5.28291100861606275 +AAAAAAAAPMLCAAAA|-|Possible, abstract groups can walk successful partners; eventually availab|-|Jewelry|-|pendants|-|8.26|-|2628.38|-|1.31731090713564040 +AAAAAAAAAAHBAAAA|-|States take immediately parliamentary interests. Royal, human pounds run ever throughout|-|Jewelry|-|rings|-|2.44|-|3250.11|-|1.16721766454114545 +AAAAAAAAAAHDAAAA|-|Here regional factors consider then with a rates. Primary groups increase as rapid, obvious reports. Economically little communities should increase yet therefore beautiful |-|Jewelry|-|rings|-|4.88|-|11132.31|-|3.99796587781583976 +AAAAAAAAADJBAAAA|-|Open, small reasons test in part temporarily economic earnings; only, good requirements should grow |-|Jewelry|-|rings|-|0.25|-|5963.30|-|2.14161031440727012 +AAAAAAAAAFIDAAAA|-|Local, medieval priorities might allow members; members prosecute also concerned studies. Soviet, primary hands invest funny, labour roles. Military, dependent studies must notify as dry girls. |-|Jewelry|-|rings|-|0.16|-|17337.66|-|6.22650403026618665 +AAAAAAAAAICAAAAA|-|Unknown magistrates cut. Women support at least now beautiful women; so glad sites count. Deep, new countries justify solid funds. Totally principal prices can make best fully aware problem|-|Jewelry|-|rings|-|3.99|-|12392.51|-|4.45054369852183171 +AAAAAAAAAMCAAAAA|-|Political children end more acute standards. Most specialist councils would not consult hard. More personal households shall identify with|-|Jewelry|-|rings|-|3.88|-|11184.77|-|4.01680592897774766 +AAAAAAAACAHBAAAA|-|In addition nuclear rebels give we|-|Jewelry|-|rings|-|3.60|-|195.87|-|0.07034313421812620 +AAAAAAAACHHDAAAA|-|Applications go also systems; conditions write men. Wrong, empty facts will reduce very both just waters. Empty questions treat enough scientific effects; brief recordings may waste all absolute sol|-|Jewelry|-|rings|-|9.61|-|7935.08|-|2.84973909976805476 +AAAAAAAACIJAAAAA|-|Times can obtain almost as a executives. Severely plain minut|-|Jewelry|-|rings|-|0.53|-|2380.76|-|0.85500648502142311 +AAAAAAAAEENBAAAA|-|Clear farmers try long tall arrangements. As sure galleries confine now. Good, natural eyes might work sound, fair jobs. Holes clear badly about a dat|-|Jewelry|-|rings|-|3.35|-|583.44|-|0.20953182329209962 +AAAAAAAAELFDAAAA|-|Little improvements write somewhat then critical results. Decades would discount with a lips; especially disastrous words forget medical, previous rumours; partici|-|Jewelry|-|rings|-|0.12|-|441.14|-|0.15842737646900594 +AAAAAAAAFMEEAAAA|-|Versions measure other, stron|-|Jewelry|-|rings|-|4.80|-|7287.61|-|2.61721207106427076 +AAAAAAAAFMFDAAAA|-|Widely accessible wines remove there able winners. Different, fit arms remember low single, dead systems. Closely tropical powers |-|Jewelry|-|rings|-|2.71|-|13299.73|-|4.77635519709419325 +AAAAAAAAFPKBAAAA|-|Police must direct; live others might retain above|-|Jewelry|-|rings|-|5.69|-|1936.57|-|0.69548375674067833 +AAAAAAAAGAKAAAAA|-|All industrial powers take increased goods; in part compatible forests regret in a parts. Obvious members pr|-|Jewelry|-|rings|-|0.75|-|19810.95|-|7.11474097533357503 +AAAAAAAAGBDAAAAA|-|Other details may reveal just into a problems. Financial things would say in a references; socialis|-|Jewelry|-|rings|-|4.67|-|11100.44|-|3.98652034921252285 +AAAAAAAAHIKDAAAA|-|Similarly typical chapters must succumb then. More famous hands shall not declare present dir|-|Jewelry|-|rings|-|1.31|-|2080.83|-|0.74729210177721729 +AAAAAAAAICGDAAAA|-|Records cause too. Useful feet leave. Appropriate places laugh less clear minutes. Years |-|Jewelry|-|rings|-|7.08|-|567.22|-|0.20370670644409836 +AAAAAAAAIGNCAAAA|-|Light services vary anything but. Other negotiations can cover. Women shall not become parts. Tropical poems could choose irrelevant, m|-|Jewelry|-|rings|-|0.54|-|8714.60|-|3.12968947494400687 +AAAAAAAAIILBAAAA|-|Faces cannot need because of a models. Medical residents sit for example to a men. Special, modern months suggest good members; hard secrets hear either more financial issues. Dange|-|Jewelry|-|rings|-|4.73|-|1712.48|-|0.61500592477590628 +AAAAAAAAIKKDAAAA|-|Sweet, fortunate o|-|Jewelry|-|rings|-|9.34|-|1892.49|-|0.67965322957299056 +AAAAAAAAIPDCAAAA|-|In general key attitudes imagine endless, left children. At first similar prizes will go vital, possible workers. Little traditional |-|Jewelry|-|rings|-|1.68|-|4251.93|-|1.52700302586448846 +AAAAAAAAKADAAAAA|-|Then political factors could not assimilate parts. Current|-|Jewelry|-|rings|-|6.00|-|2242.66|-|0.80541039151285503 +AAAAAAAAKBOBAAAA|-|Still mutual teachers shall constitute external, liberal years. Old, elderly standards seem right, free weapons. Warm papers see at present times. Arab practices find. Then individual newspapers stan|-|Jewelry|-|rings|-|4.38|-|12684.83|-|4.55552508921281375 +AAAAAAAAKCKBAAAA|-|Different, wild friends reach to a values. Official minutes will conduct local institutions. Difficult households must need so apparent losses. Statutory reasons must make also|-|Jewelry|-|rings|-|4.46|-|3130.61|-|1.12430142142547648 +AAAAAAAAKGNCAAAA|-|Old, early books ought to need political statements. Long special accounts ought to think very working relations. Levels store today british |-|Jewelry|-|rings|-|26.58|-|7578.70|-|2.72175172971314173 +AAAAAAAALAEBAAAA|-|Items capture probably shares. Huge, following categories burn so. Rar|-|Jewelry|-|rings|-|9.40|-|31.35|-|0.01125878009770897 +AAAAAAAALGJCAAAA|-|Fears might mix still wonderful, quiet walls. Very indian bodies get even to a experiments. Also solar volumes contain. That is misleading words appeal home interests. Children shall not look biologic|-|Jewelry|-|rings|-|5.73|-|3009.91|-|1.08095422021994305 +AAAAAAAALHGBAAAA|-|National, silent legs accept in a purposes. Traditional negotiations follow for ever countries. Minutes install important shares. Years might send scienc|-|Jewelry|-|rings|-|2.66|-|2770.35|-|0.99492062021333503 +AAAAAAAALHNAAAAA|-|Events get there very brave cars; geographical, informal students help exclusively however warm meetings. Financial miners know maximum, small times. Obviously lon|-|Jewelry|-|rings|-|4.49|-|18786.52|-|6.74683564533370252 +AAAAAAAALIJAAAAA|-|null|-|Jewelry|-|rings|-|0.43|-|6482.78|-|2.32817207150959411 +AAAAAAAALOOBAAAA|-|Contributions used to correct right, different pounds. Different companies could bring periods. Policies hurt merely aside large others. Implicit, availab|-|Jewelry|-|rings|-|5.97|-|7837.31|-|2.81462678939634803 +AAAAAAAAMCLAAAAA|-|Deaths used to give so classes. Patients contract even soviet order|-|Jewelry|-|rings|-|9.49|-|8835.38|-|3.17306540668886460 +AAAAAAAAMDBDAAAA|-|Brothers appoint even.|-|Jewelry|-|rings|-|9.09|-|2734.83|-|0.98216426075334706 +AAAAAAAAMDPCAAAA|-|Serious patients shall not wander civil clients. Very scottish bonds should not waive else lawyers. Decisions must not charge labour, |-|Jewelry|-|rings|-|1.94|-|2307.82|-|0.82881141579249512 +AAAAAAAAMEKDAAAA|-|Gothic problems soften for a servants. Large twins send in part islamic, ab|-|Jewelry|-|rings|-|8.22|-|2763.53|-|0.99247134173593869 +AAAAAAAAMLHBAAAA|-|Elections could not perform just in front of a costs; common numbers ban rules; similarly distinctive hopes proceed as asleep, young years. Cats ought to contribute short orders; |-|Jewelry|-|rings|-|9.60|-|6022.90|-|2.16301456620387155 +AAAAAAAAMMDBAAAA|-|Ages speak all comfortable, dead children. Violent, early years occur usually strong, endless wives; various contributions put points. Goo|-|Jewelry|-|rings|-|8.91|-|1115.31|-|0.40054322267227415 +AAAAAAAANCEAAAAA|-|Constantly particular nations accommodate never; gothic elections ensure under a companies; systems consider only considerable |-|Jewelry|-|rings|-|7.74|-|3050.84|-|1.09565348240173662 +AAAAAAAANJIBAAAA|-|Empty parents salvage often|-|Jewelry|-|rings|-|0.39|-|7390.56|-|2.65418468385722574 +AAAAAAAANLHDAAAA|-|Possible, difficult expectations tour. Actual items shall impress constant officers. Perhaps british relationships will employ here long plans. Others may push new services; great employees recognise |-|Jewelry|-|rings|-|39.51|-|10748.52|-|3.86013470672493938 +AAAAAAAAOAFBAAAA|-|Again scottish women shall ag|-|Jewelry|-|rings|-|4.98|-|3088.40|-|1.10914247061449416 +AAAAAAAAOBNBAAAA|-|Professional, early methods shall not return. Practically independent gifts will see however; continued reactions see adu|-|Jewelry|-|rings|-|1.03|-|722.90|-|0.25961633596918075 +AAAAAAAAODBEAAAA|-|Certain customers think exactly already necessary factories. Awkward doubts shall not forget fine|-|Jewelry|-|rings|-|1.22|-|6120.92|-|2.19821665951096672 +AAAAAAAAOIDBAAAA|-|Teams keep for ever particu|-|Jewelry|-|rings|-|4.87|-|1449.18|-|0.52044653722481306 +AAAAAAAAOJFAAAAA|-|Injuries answer so good issues. Aside aware definitions m|-|Jewelry|-|rings|-|3.92|-|8285.14|-|2.97545675721634832 +AAAAAAAAOKKAAAAA|-|Less prime views can sell disciplinary, little hundreds. Short-term circumstance|-|Jewelry|-|rings|-|2.30|-|304.74|-|0.10944180692107918 +AAAAAAAAOLCBAAAA|-|Things will take often bottom, tory banks. Hot, important workers ought to read either among a workers. Particular, evident children can get also; j|-|Jewelry|-|rings|-|2.45|-|647.40|-|0.23250188948187525 +AAAAAAAAPAOCAAAA|-|Ways speak innocently likely borders. Discussions kill always early articles. Possible proportions provide also formidable bottles. Details shall s|-|Jewelry|-|rings|-|1.44|-|2406.25|-|0.86416075311362731 +AAAAAAAAPECEAAAA|-|Present, fine gains fly in particular human posts. Downstairs formal obligations deal in a men. Social, primary poets will not work here; years might plan currently main publications. Goods tell awar|-|Jewelry|-|rings|-|2.61|-|447.91|-|0.16085869835932460 +AAAAAAAAACIAAAAA|-|Relations take all personal systems. Good daughters sha|-|Jewelry|-|semi-precious|-|2.77|-|3767.74|-|1.23003158278314895 +AAAAAAAAAEEAAAAA|-|Benefits shall prove therefore about|-|Jewelry|-|semi-precious|-|3.49|-|14334.86|-|4.67981615896395465 +AAAAAAAAAEJDAAAA|-|Words |-|Jewelry|-|semi-precious|-|3.10|-|1032.92|-|0.33721122542648118 +AAAAAAAAAJCDAAAA|-|Concerned, social materials shall not get individual charac|-|Jewelry|-|semi-precious|-|4.26|-|1945.32|-|0.63507700600883164 +AAAAAAAABIABAAAA|-|Dependent, marginal authorities might replace provisions. However forward industries influ|-|Jewelry|-|semi-precious|-|2.20|-|10579.94|-|3.45396984503993079 +AAAAAAAACJAAAAAA|-|Very happy relations could know settings; rights achieve properly male principles. Methods try different, economic years. Whole ideas change home during a cattle. Sufficien|-|Jewelry|-|semi-precious|-|2.37|-|9344.79|-|3.05073779891291396 +AAAAAAAACOADAAAA|-|Golden meetings might carry only rules. National, big parties begin|-|Jewelry|-|semi-precious|-|0.46|-|4754.16|-|1.55206223083448842 +AAAAAAAACOFCAAAA|-|Years learn here. Days make too. Only moving systems avoid old groups; short movements cannot see respectiv|-|Jewelry|-|semi-precious|-|1.62|-|6374.80|-|2.08114289572157789 +AAAAAAAADCFAAAAA|-|Young estimates need now patients; real chemicals could recognise widely mothers. A|-|Jewelry|-|semi-precious|-|6.06|-|5624.29|-|1.83612837688679070 +AAAAAAAADCJCAAAA|-|Unacceptable, poor years will go over key papers. Wrong, severe days act. Main, democratic hands impress kind, white changes. Royal, evolutionary responde|-|Jewelry|-|semi-precious|-|8.63|-|6482.72|-|2.11637489379308958 +AAAAAAAADEFEAAAA|-|Exactly available words could not go like the women. Frequently bright times man|-|Jewelry|-|semi-precious|-|1.02|-|587.25|-|0.19171600136670901 +AAAAAAAADEJAAAAA|-|Various parties ought to expect by a authorities. Therefore safe roots criticize women; simple, other blocks support with a stories. Tears nee|-|Jewelry|-|semi-precious|-|3.22|-|53.64|-|0.01751153054629250 +AAAAAAAADONBAAAA|-|In brief important mistakes win patient men. Low methods come on the hopes; regional women may swim also|-|Jewelry|-|semi-precious|-|3.18|-|2966.19|-|0.96835433987895889 +AAAAAAAAEAKCAAAA|-|Extreme, important accidents might close then able politicians; positions help nearly now apparent ears. Enough daily friends receive always by a men. Regulations need to a indi|-|Jewelry|-|semi-precious|-|3.01|-|1512.05|-|0.49362993591576392 +AAAAAAAAEAMBAAAA|-|Improved, bloody projects win as still pure dogs. New, old creditors squeeze right in a women. Old others may not feel then substa|-|Jewelry|-|semi-precious|-|0.89|-|3951.36|-|1.28997690789333219 +AAAAAAAAECMCAAAA|-|Unlikely hundreds might not go together contemporary things. Questions get voluntary, substantial scots. Long christian areas used to seem during a names. Only popul|-|Jewelry|-|semi-precious|-|5.63|-|7067.32|-|2.30722576548143030 +AAAAAAAAEJJBAAAA|-|Only final visitors ought to bring then fierce children. Fully unhappy shares cannot manage young examples. Working-class projects would not stand. Parties might seem |-|Jewelry|-|semi-precious|-|40.98|-|4263.68|-|1.39193815360955281 +AAAAAAAAENPAAAAA|-|Guilty, internal drawings remember already perhaps comprehensive benefits. Also hard paintings can ignore priorities. Awkward, a|-|Jewelry|-|semi-precious|-|1.73|-|803.41|-|0.26228446599919572 +AAAAAAAAFJMCAAAA|-|Sales break clear in a days. Investors celebrate very as to the things. International, alone facilities|-|Jewelry|-|semi-precious|-|4.46|-|2546.43|-|0.83131779882542160 +AAAAAAAAFPJCAAAA|-|Papers may wish now academic chapters. Sorry members consume fond, noble affairs. Expensive, emotional lives kno|-|Jewelry|-|semi-precious|-|0.24|-|5048.83|-|1.64826138642874665 +AAAAAAAAGDFCAAAA|-|Interested police cannot sound recently in no eyes. Available, pleasant colum|-|Jewelry|-|semi-precious|-|7.72|-|2644.40|-|0.86330147980268253 +AAAAAAAAGEGBAAAA|-|Materials suppose never technical services. National pa|-|Jewelry|-|semi-precious|-|2.60|-|10279.93|-|3.35602737152775307 +AAAAAAAAGIGDAAAA|-|Wages close problems; good centuries pursue perhaps components. Material, clear elections might not keep greatly for instance overall women. Daily signs should not re|-|Jewelry|-|semi-precious|-|4.88|-|953.12|-|0.31115939586656057 +AAAAAAAAGNAAAAAA|-|Extra, olympic actors get black times. Most final questions would not stop all. Old, primary p|-|Jewelry|-|semi-precious|-|0.90|-|8916.23|-|2.91082837439913479 +AAAAAAAAHCPBAAAA|-|Small, equal committees might set impossible, european users; lesser, molecular particles must turn no|-|Jewelry|-|semi-precious|-|1.22|-|2485.57|-|0.81144919798561247 +AAAAAAAAHNEBAAAA|-|Issues will wear rough, english molecules. Colourful requirements should look ultimately tired resources. International plans shall not defeat ful|-|Jewelry|-|semi-precious|-|1.41|-|13694.09|-|4.47062780273450189 +AAAAAAAAIBMCAAAA|-|Others reflect much up to a paintings; twice narrow cases cannot wear however hard major wings. Popular bacteria go|-|Jewelry|-|semi-precious|-|5.14|-|7654.93|-|2.49905929389878557 +AAAAAAAAIFDBAAAA|-|Mere requirements facilitate favorable images. Looks shall believe quite|-|Jewelry|-|semi-precious|-|null|-|1576.27|-|0.51459545589493813 +AAAAAAAAINNBAAAA|-|Most only rules would not ask parallel high lakes. Months know germans. Early managers must arise very. Cu|-|Jewelry|-|semi-precious|-|71.11|-|11939.40|-|3.89778463468315980 +AAAAAAAAJCNBAAAA|-|Other, wealthy wounds must say then. Techniques speak right since a problems. So additional drawings used to place unnecessarily successful, economic industries. Fin|-|Jewelry|-|semi-precious|-|41.59|-|18424.01|-|6.01477654549214224 +AAAAAAAAKEGAAAAA|-|Available,|-|Jewelry|-|semi-precious|-|3.34|-|20427.03|-|6.66869052600733251 +AAAAAAAAKKCEAAAA|-|Other, personal workers will grant late including a changes. Areas explain with a |-|Jewelry|-|semi-precious|-|0.96|-|4632.13|-|1.51222382530570255 +AAAAAAAAKLCDAAAA|-|For instance minimum years send brightly results; special men must appear to a reports. Together marine games should not try only interested independent feet. Members acquire reportedly me|-|Jewelry|-|semi-precious|-|3.64|-|7573.54|-|2.47248838653184399 +AAAAAAAALCFEAAAA|-|Later different hands tea|-|Jewelry|-|semi-precious|-|5.95|-|19891.59|-|6.49388862601279752 +AAAAAAAALJIDAAAA|-|Much impossible minutes reflect no longer t|-|Jewelry|-|semi-precious|-|7.50|-|818.84|-|0.26732180597550619 +AAAAAAAAMCOBAAAA|-|C|-|Jewelry|-|semi-precious|-|2.24|-|3875.44|-|1.26519175876815458 +AAAAAAAAMDNAAAAA|-|Dramatic, clinical sites talk. Suddenly rural months should not understand that is procedures. So othe|-|Jewelry|-|semi-precious|-|8.59|-|6845.00|-|2.23464628242677428 +AAAAAAAAMEGEAAAA|-|Literary, great problems want rather so appropriate weeks. No doubt worthwhile shoes may recognise really. Wide weekends might not remember from a faces. Years deal too |-|Jewelry|-|semi-precious|-|6.34|-|14723.74|-|4.80677149078427956 +AAAAAAAAMGDEAAAA|-|Concerned, open numbers come still. Men used to know. Indeed adult members bring hard, ideal symptoms. Strangers would not supply yet articles. Professional eyes seem then in a s|-|Jewelry|-|semi-precious|-|9.06|-|7729.88|-|2.52352777291527743 +AAAAAAAAMJKBAAAA|-|Comparisons ask. However systematic subjects shall provide. Usual purposes should no|-|Jewelry|-|semi-precious|-|1.15|-|6658.16|-|2.17364974314136617 +AAAAAAAAMMMCAAAA|-|Minutes work more far faint events; similar countries assess. Wi|-|Jewelry|-|semi-precious|-|3.53|-|2044.02|-|0.66729900572768081 +AAAAAAAAMOADAAAA|-|Essential programmes shall speak as in the awards. Social, past differences like houses. Likely, new days spend financial concerns. Highly vast names examine |-|Jewelry|-|semi-precious|-|0.17|-|9868.17|-|3.22160254271079929 +AAAAAAAAMPBEAAAA|-|Opening, safe police win later industrial, new sales. Direct planes could not see never guilty firms. Animals use already m|-|Jewelry|-|semi-precious|-|80.04|-|9135.31|-|2.98235011399797449 +AAAAAAAAOBEEAAAA|-|Probably old studies would feel mad, american actions|-|Jewelry|-|semi-precious|-|5.12|-|510.75|-|0.16674150310437910 +AAAAAAAAOFEAAAAA|-|Heavy, formal factors could want then truly serious players. Be|-|Jewelry|-|semi-precious|-|3.50|-|8219.93|-|2.68351147060749667 +AAAAAAAAOHNDAAAA|-|Laws wo|-|Jewelry|-|semi-precious|-|3.75|-|178.65|-|0.05832279888320573 +AAAAAAAAOLPAAAAA|-|Open, strong years justify suddenly highly natural themes. Words study religious, effective chemicals. Sometimes effective years enquire; great, good y|-|Jewelry|-|semi-precious|-|9.99|-|2676.56|-|0.87380056299374828 +AAAAAAAAPNMAAAAA|-|Men relax early things. Common foreigners ought to look at the teeth. Only small examples may hear |-|Jewelry|-|semi-precious|-|9.44|-|8894.07|-|2.90359393150379844 +AAAAAAAAABGDAAAA|-|Real, british images change most children; doubtless complete du|-|Jewelry|-|womens watch|-|1.84|-|4368.31|-|1.77132215598077246 +AAAAAAAAACHCAAAA|-|Weeks give however then available factors. Ill, traditional clothes feel cases. |-|Jewelry|-|womens watch|-|3.17|-|6847.28|-|2.77652885720198971 +AAAAAAAAADLAAAAA|-|Also aware programmes should send for certain white letters. Eyes would not treat visible centuries; wide, full languages see on behalf of the ages. Guards illuminate feet. Nationally criminal cou|-|Jewelry|-|womens watch|-|3.48|-|364.55|-|0.14782272594270796 +AAAAAAAAAEABAAAA|-|Contracts will improve just by a services. Strange, educational passengers resist only english days. Difficulties should debate then impressive, linguistic applications; fine, new eyes build; roya|-|Jewelry|-|womens watch|-|0.14|-|688.98|-|0.27937704490469601 +AAAAAAAAAHABAAAA|-|Fatal, certain hands include somewhere really brown visitors. New shops forget successful factors. Prisons deal for a amounts. Modern days get in a days. Vid|-|Jewelry|-|womens watch|-|9.80|-|272.93|-|0.11067139374994729 +AAAAAAAAAMHAAAAA|-|Supreme islands hear cards. British, electric lessons could not resume alone relations. Male, historical consumers woul|-|Jewelry|-|womens watch|-|6.94|-|1736.65|-|0.70420062270855514 +AAAAAAAAAPLCAAAA|-|Unlikely models may not agree so on an functions; wooden causes shall mean yet thoroughly impossible pieces. Even true preferences might not know as to a govern|-|Jewelry|-|womens watch|-|2.00|-|7205.95|-|2.92196728022728408 +AAAAAAAAAPOCAAAA|-|Bright, other minutes must not make from the leaders. Heavy uses could obtain other fears;|-|Jewelry|-|womens watch|-|1.93|-|2756.49|-|1.11773931102404351 +AAAAAAAABENBAAAA|-|Stairs enter normally co|-|Jewelry|-|womens watch|-|3.27|-|8309.83|-|3.36958365853927547 +AAAAAAAABFDEAAAA|-|Statistical, guilty samples think earlier. Dramatically faint rul|-|Jewelry|-|womens watch|-|8.09|-|2516.69|-|1.02050192333768671 +AAAAAAAABOCCAAAA|-|Likely families must use more |-|Jewelry|-|womens watch|-|3.89|-|2028.60|-|0.82258450650768719 +AAAAAAAACGHBAAAA|-|Almost minute times move. Following, pretty days might not understand to a foundations. Planned, young daughters go happy, other police. All natural matters would not avoid present, public questi|-|Jewelry|-|womens watch|-|4.67|-|9342.52|-|3.78833294081543809 +AAAAAAAACMACAAAA|-|Ev|-|Jewelry|-|womens watch|-|8.63|-|7686.70|-|3.11690837334745100 +AAAAAAAADHADAAAA|-|Legs shall say. Limits implement as well small quarters. Properly foreign things can become english, volu|-|Jewelry|-|womens watch|-|4.73|-|3143.71|-|1.27475457899698378 +AAAAAAAADNDAAAAA|-|Statistical, different names might not start no doubt professional, round publications. Necessarily clear relations obtain initiatives. Little players want by a p|-|Jewelry|-|womens watch|-|20.86|-|4075.86|-|1.65273552533492157 +AAAAAAAAEHHCAAAA|-|However subsequent steps share terribly existing communications; less great responsibilities speed at all long-term mountains. Of |-|Jewelry|-|womens watch|-|2.97|-|8032.68|-|3.25720108140302116 +AAAAAAAAELCAAAAA|-|International places|-|Jewelry|-|womens watch|-|5.12|-|20606.94|-|8.35598421104876240 +AAAAAAAAEMHDAAAA|-|Old, upper claims walk from a communities. Years go mercifully definite, concerned conclusions. Private materials show also; following, other children split softly so |-|Jewelry|-|womens watch|-|6.60|-|null|-|null +AAAAAAAAENJDAAAA|-|Months understand backs. Natural, responsible initiatives realise clear|-|Jewelry|-|womens watch|-|4.16|-|5484.65|-|2.22399098571299740 +AAAAAAAAFGODAAAA|-|Even subject skills should ro|-|Jewelry|-|womens watch|-|3.67|-|21380.70|-|8.66973901128310532 +AAAAAAAAFMLDAAAA|-|Given groups please unfortu|-|Jewelry|-|womens watch|-|84.79|-|8739.54|-|3.54382835354638296 +AAAAAAAAFODDAAAA|-|Posts tell more enquiries. Priorities might not move subsequently. Only competitive methods would confess b|-|Jewelry|-|womens watch|-|1.91|-|139.70|-|0.05664746897324455 +AAAAAAAAGBMBAAAA|-|Definitions look seldom indirect others; professional wee|-|Jewelry|-|womens watch|-|4.49|-|3645.54|-|1.47824347917481709 +AAAAAAAAGKOBAAAA|-|So public letters go perhaps developing members. Successful, political actions sense so. Left examples might provide about nearl|-|Jewelry|-|womens watch|-|13.93|-|3138.44|-|1.27261762723256718 +AAAAAAAAGMICAAAA|-|Actual, similar carers shall not find exclusively main, legal children. Profound, left politicians may|-|Jewelry|-|womens watch|-|3.74|-|1291.04|-|0.52350857797578846 +AAAAAAAAHOHDAAAA|-|Interests talk very monthly, separate n|-|Jewelry|-|womens watch|-|4.11|-|1099.07|-|0.44566595364655613 +AAAAAAAAIFFEAAAA|-|Arms could exa|-|Jewelry|-|womens watch|-|5.91|-|2447.38|-|0.99239715544552079 +AAAAAAAAIHOCAAAA|-|Criminal, deep systems can eat to a pupils. Long rules ought to produce m|-|Jewelry|-|womens watch|-|4.84|-|4266.46|-|1.73002262330414428 +AAAAAAAAIPAAAAAA|-|N|-|Jewelry|-|womens watch|-|5.75|-|498.33|-|0.20206967225080142 +AAAAAAAAIPDDAAAA|-|Social environments should take eventual varieties. Common, steady areas dance between a years. Literary, considerable opportunities vote perhaps special words. Rea|-|Jewelry|-|womens watch|-|7.13|-|3040.82|-|1.23303333287918040 +AAAAAAAAJGAEAAAA|-|Probably international books assign really good, careful industries. New, primary parties withhold mainly prices. Important, single judges require home. Near main facts tell solutions; here western at|-|Jewelry|-|womens watch|-|9.42|-|2265.34|-|0.91858108349212466 +AAAAAAAAJGKAAAAA|-|Yet british features vary also possible, poor facts. Parents add all. Very special concepts will use so economic years. Centres know. Far southern details may preclude yesterday other y|-|Jewelry|-|womens watch|-|3.03|-|5744.51|-|2.32936257688971415 +AAAAAAAAKHKBAAAA|-|Alive funds must go. Private, extra pupils may go then tomorrow green teachers; hours may not work yesterday concerned, particular block|-|Jewelry|-|womens watch|-|1.42|-|11955.39|-|4.84783524758796131 +AAAAAAAAKJFEAAAA|-|Terms would consider black, interesting abilities. Sides will expect private, clinical examples; otherwise powerful acts shall not transfer short bodies. Lovely|-|Jewelry|-|womens watch|-|3.54|-|2322.85|-|0.94190102580172591 +AAAAAAAALBHAAAAA|-|Human patients ought to forget too adult tools. Public years mean then motives. Unfortunately european animals spend certainly clear patients. Metropolitan times expand less different c|-|Jewelry|-|womens watch|-|3.15|-|2973.26|-|1.20563817895053042 +AAAAAAAALGLAAAAA|-|Normal, wrong walls shall look high dangers. Beautiful,|-|Jewelry|-|womens watch|-|1.97|-|109.76|-|0.04450698779172027 +AAAAAAAALPBBAAAA|-|Others convey coherent, great projects. Ba|-|Jewelry|-|womens watch|-|86.65|-|9947.99|-|4.03384720738115304 +AAAAAAAAMBMBAAAA|-|Other, difficult bars can need hours. Male deal|-|Jewelry|-|womens watch|-|7.70|-|4486.10|-|1.81908525813079734 +AAAAAAAAMEGBAAAA|-|About busy stars might not make already alone general players. Probably high policies look together political interests; today good points shall not describe aloud central |-|Jewelry|-|womens watch|-|6.17|-|15147.37|-|6.14216300716718213 +AAAAAAAAMHGDAAAA|-|Similar obligations might resign streets. Blue hours know so from a communities; true, full keys assume eventually. As great lives annoy here. In particular other interpretations anticipate al|-|Jewelry|-|womens watch|-|4.19|-|4708.62|-|1.90931571479455094 +AAAAAAAAMOHCAAAA|-|Instead content accounts receive just. About c|-|Jewelry|-|womens watch|-|83.33|-|1121.04|-|0.45457465009138206 +AAAAAAAANPMDAAAA|-|Exciting children would go more available, economic months. Regulations might satisfy co|-|Jewelry|-|womens watch|-|4.04|-|4569.12|-|1.85274934455999393 +AAAAAAAAOBOAAAAA|-|Primitive members afford still smooth sessions; nice countries take even open, gross aspects. Coastal relationships could fly practically stupid documents. Possible, important topics|-|Jewelry|-|womens watch|-|8.38|-|9473.56|-|3.84146883440351229 +AAAAAAAAOLHAAAAA|-|Generous, easy wives might worry. Back, major ways ought to establish. Scott|-|Jewelry|-|womens watch|-|1.97|-|10956.47|-|4.44277948733918931 +AAAAAAAAOMMAAAAA|-|Girls make over similar debts. Political, different feet should show fully at a speakers; more able legs must go there determined living authorities; then above f|-|Jewelry|-|womens watch|-|0.94|-|2444.54|-|0.99124555335615776 +AAAAAAAAPBFEAAAA|-|Necessary, electrical years will attend. Delightful workers grow too exceptions; just general variations might carry again. Political heads could not come free, visible parties. Rough,|-|Jewelry|-|womens watch|-|3.64|-|644.91|-|0.26150693783489724 +AAAAAAAAPHJDAAAA|-|Trees make over. Visib|-|Jewelry|-|womens watch|-|0.48|-|4664.56|-|1.89144966266168656 +AAAAAAAAPIEEAAAA|-|Modern papers finish simply in a centres; final letters must not |-|Jewelry|-|womens watch|-|93.76|-|311.96|-|0.12649781260482012 +AAAAAAAAPMEAAAAA|-|Good ages used to a|-|Jewelry|-|womens watch|-|3.25|-|1879.23|-|0.76201591351890022 +AAAAAAAAPPDBAAAA|-|Much clear ideas should not develop. Just relevant arguments would not issue partic|-|Jewelry|-|womens watch|-|3.57|-|5730.04|-|2.32349508314567085 +AAAAAAAAALBCAAAA|-|Enough economic decisions might not believe yet english suppliers. Impossible developments buy a little for an figures. Relationships|-|Sports|-|archery|-|13.15|-|6808.47|-|2.61824141465108746 +AAAAAAAAANOBAAAA|-|Special, respectable chemicals must te|-|Sports|-|archery|-|2.53|-|13116.96|-|5.04421226888298372 +AAAAAAAABAFBAAAA|-|Eyes can go extremely hard numbers. Early, real others would discuss also. Good members |-|Sports|-|archery|-|4.61|-|7519.82|-|2.89179568313020995 +AAAAAAAACAJAAAAA|-|Political forms keep students. Courses shall float sudden|-|Sports|-|archery|-|2.79|-|2429.51|-|0.93428386984285214 +AAAAAAAACFJDAAAA|-|American, wooden opponents simplify vehicles. High tories m|-|Sports|-|archery|-|7.95|-|15097.33|-|5.80577643092417273 +AAAAAAAACJBCAAAA|-|Local minutes must understand never extra conditions. Strongly young |-|Sports|-|archery|-|0.63|-|1960.54|-|0.75393840658474562 +AAAAAAAACKCDAAAA|-|Texts convince much skilled, average weeks; d|-|Sports|-|archery|-|20.80|-|728.29|-|0.28006865564161118 +AAAAAAAACKNAAAAA|-|Relative organizations may know sure able operators. Possible transactions might reflect other students. Reforms|-|Sports|-|archery|-|1.69|-|6715.24|-|2.58238921186721372 +AAAAAAAACLABAAAA|-|Thin, different methods might improve too mor|-|Sports|-|archery|-|6.66|-|6560.51|-|2.52288678414278183 +AAAAAAAACPBBAAAA|-|Other, black houses flow. New soldiers put only eastern hours. Applications reserve there methods; sources cry pretty scarcely special workers. Never british opportunities |-|Sports|-|archery|-|0.56|-|172.20|-|0.06622062983356279 +AAAAAAAACPKCAAAA|-|Even large observations see badly sometimes ordinary pilots; red companies shall argue for a members. Political, dry issues will help subsequently atlantic details; too major goals help|-|Sports|-|archery|-|6.89|-|5535.64|-|2.12876636081221564 +AAAAAAAADGNDAAAA|-|Entirely social buildings step all including the standards. Massive months read children; irish years come for a words.|-|Sports|-|archery|-|5.76|-|163.94|-|0.06304419311796913 +AAAAAAAAEAFBAAAA|-|Fair systems govern traditionally to a papers. Highly british studies used to make of course conservative cheap requirements. Dirty, fat components believe between|-|Sports|-|archery|-|9.86|-|141.60|-|0.05445320083874850 +AAAAAAAAEJNCAAAA|-|Racial, stupid walls should know nevertheless on the hours. Straight fine services see indirectly german, present questions. As young services can hire.|-|Sports|-|archery|-|3.13|-|3563.31|-|1.37029403305593863 +AAAAAAAAEKFBAAAA|-|Right, grand studies will come all aware, chinese products. Vast symptoms see only corporate factors. Classes s|-|Sports|-|archery|-|0.97|-|9073.00|-|3.48908115261274803 +AAAAAAAAEPAAAAAA|-|Players must argue away significantly national sides. Elections might|-|Sports|-|archery|-|3.79|-|8268.12|-|3.17955931439882224 +AAAAAAAAFADCAAAA|-|Materials go furt|-|Sports|-|archery|-|3.67|-|5044.08|-|1.93973376614911386 +AAAAAAAAFHBAAAAA|-|Previously white patients should set sometimes level theoretical studies. Federal, european trends keep. Social, other hills can leave opportunities. Organisers lower experiences. Recent criteri|-|Sports|-|archery|-|2.18|-|4510.83|-|1.73466901087183535 +AAAAAAAAFLFBAAAA|-|Scientific, elegant blues must eliminate. Basically local musicians might slow never now spiritual bedrooms. Wrong studies ought to impose relations. S|-|Sports|-|archery|-|1.70|-|3297.51|-|1.26807891453235564 +AAAAAAAAGAMCAAAA|-|Persons must get for a functions. Also unable pounds shall not co|-|Sports|-|archery|-|1.30|-|147.58|-|0.05675284872727757 +AAAAAAAAGBKDAAAA|-|National interests |-|Sports|-|archery|-|3.15|-|6718.33|-|2.58357749146178810 +AAAAAAAAGECEAAAA|-|Deaths achieve out of the sets. Publi|-|Sports|-|archery|-|5.93|-|2798.76|-|1.07628135861197560 +AAAAAAAAGGNDAAAA|-|Entire churches invest to a sources. Anyway international circumstances should sleep just results; once likely men rest. Recently mean ideas o|-|Sports|-|archery|-|3.58|-|2033.93|-|0.78216100834714500 +AAAAAAAAGHFCAAAA|-|Official, polite miles must|-|Sports|-|archery|-|4.24|-|2398.89|-|0.92250874971797587 +AAAAAAAAGPAEAAAA|-|Present, conventional students know sideways. Students stop here as a rebels. Flat, superb hours must keep at all detailed years; new, good unions go daily, crucial implications; un|-|Sports|-|archery|-|2.67|-|1554.30|-|0.59771617276600840 +AAAAAAAAHCAEAAAA|-|So blue parents will get at a conferences. Toxic methods |-|Sports|-|archery|-|1.14|-|8031.82|-|3.08868861271664519 +AAAAAAAAHCEAAAAA|-|Differences give financial, current reasons. Working, legal memories cannot launch into a activities; small, difficult parties coul|-|Sports|-|archery|-|1.62|-|7470.03|-|2.87264861484093532 +AAAAAAAAHFAEAAAA|-|Competitive holidays should not keep all democratic, o|-|Sports|-|archery|-|61.08|-|3385.02|-|1.30173145411850593 +AAAAAAAAHKMCAAAA|-|Crude, silly estates walk. Specific eyes mus|-|Sports|-|archery|-|3.16|-|432.32|-|0.16625146741954626 +AAAAAAAAHMKCAAAA|-|Normally eastern men protect also only explicit quantities. Royal, modest miles build by a opportunities. Shoulders judge more slightl|-|Sports|-|archery|-|5.58|-|13044.98|-|5.01653189178995324 +AAAAAAAAHOLCAAAA|-|Statutory, royal cases follow here hi|-|Sports|-|archery|-|1.70|-|7733.40|-|2.97392926106198893 +AAAAAAAAIFBCAAAA|-|Minutes please further charges. Necessary, underlying vo|-|Sports|-|archery|-|83.01|-|19151.40|-|7.36479541344073432 +AAAAAAAAIICEAAAA|-|Penalties clear actually |-|Sports|-|archery|-|16.47|-|9279.63|-|3.56854206284799239 +AAAAAAAAJDNAAAAA|-|Months could not change curiously public contexts. Confident hotels would motivate in a studies. Workers sing fully again due positions. Irrelevant hands might create otherwise here strategic po|-|Sports|-|archery|-|0.40|-|2630.20|-|1.01146051444969138 +AAAAAAAAJJNDAAAA|-|In short major reasons ought to sell already professional local institutions; corporate, able jobs will insure so su|-|Sports|-|archery|-|9.22|-|10030.65|-|3.85735168780503262 +AAAAAAAAKALBAAAA|-|Desperate individuals would em|-|Sports|-|archery|-|6.44|-|3779.52|-|1.45343899459086668 +AAAAAAAAKDCBAAAA|-|Abilities provide natura|-|Sports|-|archery|-|3.63|-|851.35|-|0.32739217891291337 +AAAAAAAAMBKCAAAA|-|New jobs answer only final sales. Public, dead animals modify for the relationships. Societies should not come early hard actors. Homes might convince p|-|Sports|-|archery|-|0.37|-|1787.44|-|0.68737167589839417 +AAAAAAAAMEDAAAAA|-|Favorite things may earn straight damp, particular enquir|-|Sports|-|archery|-|7.73|-|6840.83|-|2.63068566309135513 +AAAAAAAAMOFDAAAA|-|Quite political women like home seriously formal chains. Certainly male lips |-|Sports|-|archery|-|2.22|-|5002.25|-|1.92364776762450334 +AAAAAAAANDOBAAAA|-|Real pupils could adopt fine years. Big neighbours must understand for a visitors. Duties would not give almost at last blue priests. Previous, small miles make finally|-|Sports|-|archery|-|7.47|-|8352.72|-|3.21209279456095588 +AAAAAAAANKJCAAAA|-|Domestic, chief devices can capture provincial lin|-|Sports|-|archery|-|3.78|-|5380.79|-|2.06921778630741193 +AAAAAAAANOHAAAAA|-|Strings ought to include even. Difficult, medical |-|Sports|-|archery|-|64.26|-|3107.39|-|1.19496703216326762 +AAAAAAAAOAMAAAAA|-|Increased miles can give for a republics. At best parliamentary sales can sit. Assistant,|-|Sports|-|archery|-|8.45|-|1188.94|-|0.45721460879393813 +AAAAAAAAODBCAAAA|-|Home early women might build. Policies may analyse then from the systems; basic, critical men could swim only. |-|Sports|-|archery|-|27.08|-|1920.82|-|0.73866382228167295 +AAAAAAAAOGLDAAAA|-|Right developments would not seek variables; numbers like impatiently |-|Sports|-|archery|-|5.12|-|12486.73|-|4.80185322393521207 +AAAAAAAAOHEBAAAA|-|Pink police wait for the homes. Star, direct thoughts make barriers. Independent governments must infer in a ideas. Standard, active eyes|-|Sports|-|archery|-|32.04|-|3731.34|-|1.43491106227158065 +AAAAAAAAOOCCAAAA|-|Impossible, eastern days select above now young dealers. Different descriptions could see |-|Sports|-|archery|-|5.42|-|68.10|-|0.02618829786100828 +AAAAAAAAOPBCAAAA|-|Else secondary notes call pretty, digital members; high, high powers become thus notes; muc|-|Sports|-|archery|-|0.65|-|7993.45|-|3.07393317969275551 +AAAAAAAAAADBAAAA|-|Early authorities face autonomous, major areas. Recommendations satisfy still priorities; new girls show on a visits. Inherent times would tell thereof hot, in|-|Sports|-|athletic shoes|-|5.38|-|8910.53|-|2.96967399984762579 +AAAAAAAAAHPBAAAA|-|Special names thwart again selective, modern m|-|Sports|-|athletic shoes|-|5.52|-|5150.26|-|1.71646279339783753 +AAAAAAAAAJMCAAAA|-|Chan|-|Sports|-|athletic shoes|-|2.96|-|5711.91|-|1.90364777588646828 +AAAAAAAAAKKAAAAA|-|Spanish affairs may not cost real |-|Sports|-|athletic shoes|-|1.13|-|4221.60|-|1.40696184825781823 +AAAAAAAAALCAAAAA|-|Negative, available standards provide smoothly good teachers; apart civil bombs compete ideas. Green, visual thoughts used to stop meanw|-|Sports|-|athletic shoes|-|2.08|-|3659.21|-|1.21953024084789915 +AAAAAAAAAMBEAAAA|-|Right, new shoes move acute, prime premises. Certain stores might put very red relationsh|-|Sports|-|athletic shoes|-|83.44|-|2378.15|-|0.79258250886733239 +AAAAAAAAAMHDAAAA|-|Confidential, full terms might not suffer as. Political, external benefits make well in a workers|-|Sports|-|athletic shoes|-|2.06|-|10278.54|-|3.42560016007957053 +AAAAAAAABCCCAAAA|-|Degrees know as after a heads; new, complex ma|-|Sports|-|athletic shoes|-|1.41|-|1213.89|-|0.40456152121984152 +AAAAAAAACPGAAAAA|-|Simple hours might give nevertheless difficult, old places. Advisers could see british, dir|-|Sports|-|athletic shoes|-|78.33|-|9455.30|-|3.15123326791551750 +AAAAAAAADOGCAAAA|-|However local things might not feel regional, responsible roots. Local, suitable nations set strong days. Patients might seem to a rooms. Sure othe|-|Sports|-|athletic shoes|-|2.00|-|7664.61|-|2.55443761885904779 +AAAAAAAAEBPDAAAA|-|Numbers point police; rigid books protest. Inevitable limitations would catch particular, growin|-|Sports|-|athletic shoes|-|0.61|-|17883.18|-|5.96005116200664434 +AAAAAAAAEGJBAAAA|-|Other families must keep. In order sick boys cannot blame lately p|-|Sports|-|athletic shoes|-|2.05|-|4901.83|-|1.63366680799829949 +AAAAAAAAELKDAAAA|-|Important projects finish soon at a services. Aware, local operations continue successfully presidential practices. Great miles|-|Sports|-|athletic shoes|-|52.99|-|3343.65|-|1.11436137576446227 +AAAAAAAAEPOCAAAA|-|Blue, united ministers know childr|-|Sports|-|athletic shoes|-|7.54|-|47.50|-|0.01583065373134507 +AAAAAAAAFHMBAAAA|-|Items used to thin|-|Sports|-|athletic shoes|-|4.26|-|483.44|-|0.16111939452382027 +AAAAAAAAGBDDAAAA|-|Mo|-|Sports|-|athletic shoes|-|0.89|-|8751.31|-|2.91660964854015710 +AAAAAAAAGKOCAAAA|-|Then necessary leaders may see days. Horses may come over into the details. Top lines produce old, preliminary officers; oft|-|Sports|-|athletic shoes|-|3.80|-|8554.09|-|2.85088077424761235 +AAAAAAAAGNGAAAAA|-|Groups shall |-|Sports|-|athletic shoes|-|2.40|-|2308.14|-|0.76924979165193305 +AAAAAAAAGNJDAAAA|-|Evident, ambitious hands could supplement as right performances. Yet other standards must indicate. Already free |-|Sports|-|athletic shoes|-|8.56|-|159.60|-|0.05319099653731945 +AAAAAAAAHFNDAAAA|-|Homes cannot inform almost fresh hotels. Plans could kill today hi|-|Sports|-|athletic shoes|-|3.62|-|null|-|null +AAAAAAAAHJFEAAAA|-|Woods wear indeed from a numbers. Counties must not receive as greatly public windows. Above hostile groups breed of course usually true members. Sources introduce similarly words. Largel|-|Sports|-|athletic shoes|-|8.59|-|2238.29|-|0.74597039874383929 +AAAAAAAAHOFCAAAA|-|Military, considerable sizes wash social consultants. Equal ways stand detailed writings. Tough, potential directions interpret then. Free wives would restore still. Better fresh men carry others. St|-|Sports|-|athletic shoes|-|8.09|-|12921.86|-|4.30655770999828762 +AAAAAAAAIGBBAAAA|-|At all strong persons shall not look. Children ought to compete relatively ill healthy things. Times go deep complete, early years. Soft measures will know for a syste|-|Sports|-|athletic shoes|-|2.89|-|9278.86|-|3.09242988803428540 +AAAAAAAAIJBEAAAA|-|Additional, human standards should not dream also silly forms. More independent friends may believ|-|Sports|-|athletic shoes|-|0.83|-|11009.16|-|3.66909894385210397 +AAAAAAAAIKCCAAAA|-|Employees behave most philosophical planes. Mature men shall not preach equally possible guidelines. Financial organisations should continue courses; bad corners communicate between a obje|-|Sports|-|athletic shoes|-|81.54|-|16991.50|-|5.66287479739262801 +AAAAAAAAIKFCAAAA|-|Better silent colleges protect never concessions. Certainly material words |-|Sports|-|athletic shoes|-|1.57|-|7712.35|-|2.57034825905135124 +AAAAAAAAIKKAAAAA|-|Static, socialist sequences say children. Great directions must not discuss ancient clothes. New, only details give thoughtfully; only areas shall work. Very young years|-|Sports|-|athletic shoes|-|5.16|-|10047.80|-|3.34869984340650606 +AAAAAAAAJFCDAAAA|-|Existing theories wait supplies. Proper partners measure things. Areas must not thank a little. Hard white rules formulate then major, institutional differences.|-|Sports|-|athletic shoes|-|1.47|-|15048.08|-|5.01517776424377234 +AAAAAAAAJLCAAAAA|-|Absolute companies might not raise in order powerful, recent waves. Major chil|-|Sports|-|athletic shoes|-|0.18|-|4923.95|-|1.64103889348329639 +AAAAAAAAKFJBAAAA|-|Other, young drawings back tomorrow forces. Very free prices carry subsequent, little years. Tall, alleged offences might increase hardly like a scientists; yo|-|Sports|-|athletic shoes|-|4.34|-|3306.41|-|1.10195014323908773 +AAAAAAAAKJABAAAA|-|Electrical genes carry still british ingredients. Ready men experience consequences. Slightly local trades ought to deal with a relations; states know v|-|Sports|-|athletic shoes|-|3.16|-|2603.20|-|0.86758647986184205 +AAAAAAAAKOMBAAAA|-|Disciplinary proposals would forget common, good men. Anyway irish powers ought|-|Sports|-|athletic shoes|-|8.08|-|5365.30|-|1.78813066241654163 +AAAAAAAAMJFAAAAA|-|Successful fo|-|Sports|-|athletic shoes|-|0.94|-|20014.60|-|6.67040425623956052 +AAAAAAAAMLIAAAAA|-|Certain industries|-|Sports|-|athletic shoes|-|63.64|-|4534.14|-|1.51112421704086222 +AAAAAAAAMNDDAAAA|-|Past vital samples wake therein ethnic, big relations; words will become considerable profits. Days handle the|-|Sports|-|athletic shoes|-|7.67|-|6073.20|-|2.02405739455168222 +AAAAAAAANCCCAAAA|-|New rules continue wet cuts. German, following procedures shall see findings. As good charges cannot pay notably routine, short plates. Problems used to alleviate a|-|Sports|-|athletic shoes|-|30.73|-|4348.85|-|1.44937133641179003 +AAAAAAAANCNAAAAA|-|Supposedly parental instructions see. Broken, raw habits should not issue at all friendly beliefs. Certain constraints know |-|Sports|-|athletic shoes|-|0.59|-|13195.69|-|4.39781892918258703 +AAAAAAAANGOBAAAA|-|Also other measurements pay at least around the artists. Perfect, good cul|-|Sports|-|athletic shoes|-|2.83|-|293.80|-|0.09791675928987753 +AAAAAAAAOJBBAAAA|-|Other, difficult surroundings fill continuous months. Enough good experts shall move thoughts. Ideas could handle available, good police; golden, medical quantities cannot encompass narrowly|-|Sports|-|athletic shoes|-|2.55|-|882.80|-|0.29421686555855646 +AAAAAAAAOJFBAAAA|-|Late, chief standards guarantee publicly police. Also political years might come curious years. Systems may not follow so with a times. Central, silent towns must apologis|-|Sports|-|athletic shoes|-|5.13|-|10068.92|-|3.35573865197084307 +AAAAAAAAPCODAAAA|-|Never national communities could turn so. National, whole styles buy far really high leaders. Indeed beautiful others liv|-|Sports|-|athletic shoes|-|5.39|-|2503.64|-|0.83440542964094278 +AAAAAAAAPDABAAAA|-|More than hot women govern only full polic|-|Sports|-|athletic shoes|-|1.64|-|8622.63|-|2.87372357438964165 +AAAAAAAAPDJBAAAA|-|Essential women may suppose only conventional specialists. Sales used to keep as general offices. Chemical, nice systems locate too at least suitable police|-|Sports|-|athletic shoes|-|2.38|-|5466.94|-|1.82200492863241349 +AAAAAAAAPIFAAAAA|-|Notably international minutes write too national, important visits. Human, clean patients|-|Sports|-|athletic shoes|-|1.21|-|17522.07|-|5.83970153318714919 +AAAAAAAAAIJDAAAA|-|Only days used to wish unwittingly fe|-|Sports|-|baseball|-|4.15|-|1127.00|-|0.53429042273276324 +AAAAAAAAALECAAAA|-|Men stop easily shoulders; pregnant colours want just general, o|-|Sports|-|baseball|-|3.39|-|158.48|-|0.07513251658801093 +AAAAAAAAAPKAAAAA|-|Men would come also down a purposes. Eyes may not create here. Votes discuss involuntarily exotic women. Dogs arise windows. Patients apol|-|Sports|-|baseball|-|95.57|-|10569.94|-|5.01101837698309096 +AAAAAAAABDOBAAAA|-|Eggs shall not encourage as. Economic classes act other girls. Technical features wash even. Social goods can monitor probably |-|Sports|-|baseball|-|2.18|-|4024.05|-|1.90772970328107891 +AAAAAAAACDCAAAAA|-|New, nuclear views may make interested counties. Sometimes industrial activities must seek certain, anonymous provisions. Faces wil|-|Sports|-|baseball|-|8.66|-|2478.43|-|1.17497907046456292 +AAAAAAAACDIAAAAA|-|Established experts shall go fingers. Friends will answer also gradual tears. Slow, productive lives |-|Sports|-|baseball|-|4.04|-|12809.56|-|6.07278192317719142 +AAAAAAAACEFDAAAA|-|Abruptly real years cope together; significant accounts provide at a others. Twice competent languages cannot impose most protests. Identical leaders |-|Sports|-|baseball|-|6.09|-|3516.01|-|1.66687708006443912 +AAAAAAAACGKBAAAA|-|Serious activi|-|Sports|-|baseball|-|0.64|-|13996.12|-|6.63530867029146609 +AAAAAAAACMPDAAAA|-|Models pay hours; good children indicate very. Alread|-|Sports|-|baseball|-|37.99|-|6848.39|-|3.24669848104598799 +AAAAAAAADDLCAAAA|-|Most other delegates enhance natural, successful shows. American, similar times can derive easy, small departments. Artificial, other manager|-|Sports|-|baseball|-|4.91|-|3236.02|-|1.53413885871488599 +AAAAAAAADPABAAAA|-|Cars might recognise independently voluntary individuals. Internal servants used to vary for a parts. Authorities must concentrate sort of |-|Sports|-|baseball|-|0.21|-|876.12|-|0.41535272862877421 +AAAAAAAAENLBAAAA|-|Times leave from the damage|-|Sports|-|baseball|-|5.57|-|6465.86|-|3.06534789062188513 +AAAAAAAAFOIBAAAA|-|Rather american exercises might remember times. Below western accidents give|-|Sports|-|baseball|-|0.71|-|1341.60|-|0.63602842159563014 +AAAAAAAAFOMDAAAA|-|Later federal objectives|-|Sports|-|baseball|-|5.97|-|3218.15|-|1.52566701323641706 +AAAAAAAAGFBEAAAA|-|Real camps see for example as golden terms; civil authorities offer therefore ago following blocks. Financial, good theories give meanwhile general pubs. Socially important prayers cook m|-|Sports|-|baseball|-|6.20|-|3531.42|-|1.67418268380384629 +AAAAAAAAGFIDAAAA|-|Times should follow dear, used numbers; just alive savings must enquire at least through the goods. Schools could come cells; now deep others cannot restore par|-|Sports|-|baseball|-|3.17|-|3112.50|-|1.47558024911776894 +AAAAAAAAGKDAAAAA|-|Modes know still events. Separate, special powers must park formal, new shapes. Yet other colleges meet right in private profound proposals. Particular,|-|Sports|-|baseball|-|9.33|-|6313.68|-|2.99320209068269089 +AAAAAAAAGPIDAAAA|-|Central animals will appeal also precious types; also wet groups cannot keep members. Systems consider also hard levels|-|Sports|-|baseball|-|14.33|-|2123.24|-|1.00658988213230899 +AAAAAAAAHDFBAAAA|-|Residents will happen here police. Owners might not match lines. Temporary, good symptoms used to achieve about in a issues. Troops can arrange. Even true comments shall not get ba|-|Sports|-|baseball|-|3.86|-|388.27|-|0.18407182114858029 +AAAAAAAAHMMAAAAA|-|Relevant numbers happen by the variables. Basic, italian fingers l|-|Sports|-|baseball|-|8.19|-|519.86|-|0.24645627254822919 +AAAAAAAAHNDCAAAA|-|Fascinating companies could tell partly about a |-|Sports|-|baseball|-|8.54|-|5643.96|-|2.67569988845324440 +AAAAAAAAIHNBAAAA|-|Most federal months c|-|Sports|-|baseball|-|7.86|-|8893.23|-|4.21612033377080041 +AAAAAAAAJCEBAAAA|-|Cities ought to assess to the parties. Likely organs help domestic, passive stages. Therefore private obligati|-|Sports|-|baseball|-|1.03|-|159.60|-|0.07566348843668945 +AAAAAAAAJFKBAAAA|-|Hundreds would give seldom national, philosophical words. Obvious things li|-|Sports|-|baseball|-|2.21|-|2311.54|-|1.09585952419138558 +AAAAAAAAKAKDAAAA|-|Domestic mines calc|-|Sports|-|baseball|-|85.51|-|6110.92|-|2.89707722279156838 +AAAAAAAAKNOBAAAA|-|Moreover afraid operations|-|Sports|-|baseball|-|7.84|-|5970.98|-|2.83073418662721799 +AAAAAAAAKOODAAAA|-|Services discuss more certain sports. Other times will not prosecute there. Available path|-|Sports|-|baseball|-|22.08|-|3001.47|-|1.42294292379743291 +AAAAAAAALKHAAAAA|-|Properly common methods remember thus successful levels. Statistical families exist; trees will not go simply. Bottom, full things could see in the feet. Used, de|-|Sports|-|baseball|-|2.57|-|7535.93|-|3.57264882465351598 +AAAAAAAALOGAAAAA|-|Good effe|-|Sports|-|baseball|-|9.77|-|6774.76|-|3.21179182281545263 +AAAAAAAAMBKDAAAA|-|Full, other speeches can ride late good aspirations; either british hands maintain later hardly nice pr|-|Sports|-|baseball|-|4.85|-|917.33|-|0.43488964816809734 +AAAAAAAAMECCAAAA|-|Nevertheless new consumers will not indulge less. Consequently strong hours cannot give here|-|Sports|-|baseball|-|4.49|-|2704.46|-|1.28213582667599723 +AAAAAAAAMFFDAAAA|-|Other, national shadows can fly. Designs will not react in a years. Protests look simply superb quarters. Importantly following organisations go also. Right m|-|Sports|-|baseball|-|1.92|-|2121.70|-|1.00585979584037602 +AAAAAAAAMHEDAAAA|-|Financial, busy reasons should not terminate. Physi|-|Sports|-|baseball|-|6.32|-|9555.87|-|4.53026603538538624 +AAAAAAAAMMEBAAAA|-|Able stages convince otherwise by a hopes. Yesterday olympic drivers come alleged offic|-|Sports|-|baseball|-|1.40|-|5167.67|-|2.44989936898262523 +AAAAAAAAMNHAAAAA|-|Other arms put possible years. Villages sit new leaves. Easy, revolutionary payments may test prime, polish times. Inevitably particular police beat indeed. Better other prices re|-|Sports|-|baseball|-|2.28|-|14313.84|-|6.78593400579337695 +AAAAAAAANBEBAAAA|-|Anxious, just years must come various schools; rarely surprising students ought to talk complex hundreds. Thin, other makers shall look actually american, ta|-|Sports|-|baseball|-|7.88|-|1449.46|-|0.68716290695140285 +AAAAAAAANCKAAAAA|-|Too particular pages used to give here by a markets; capital, different researchers gain specialist, small directors. Required patie|-|Sports|-|baseball|-|60.56|-|2767.38|-|1.31196506660354423 +AAAAAAAANEODAAAA|-|New friends would leave long motives. Dogs shall face occasionally increased schools. New, green parents decide also probably beautiful men. Real tanks shall |-|Sports|-|baseball|-|0.54|-|3482.68|-|1.65107592674617559 +AAAAAAAANNKBAAAA|-|Important, private results identify sh|-|Sports|-|baseball|-|1.25|-|19935.37|-|9.45100023481281844 +AAAAAAAAOJDAAAAA|-|Competitive, medical designers remind entirely rights; else obvious jobs would not say etc again mixed authorities. By now littl|-|Sports|-|baseball|-|6.45|-|10418.73|-|4.93933243659141294 +AAAAAAAAPLODAAAA|-|At least middle departments arrange international, environmental sites. More key kids might take up to the relations. Policie|-|Sports|-|baseball|-|4.87|-|5042.39|-|2.39050637505187050 +AAAAAAAAACCEAAAA|-|Categories aid please with a authorities. Even so wet historians get specific, elderly parents. Able, swiss levels ought to face far |-|Sports|-|basketball|-|4.12|-|6666.70|-|2.65430351357689366 +AAAAAAAAAJHBAAAA|-|Whole standar|-|Sports|-|basketball|-|3.09|-|5694.97|-|2.26741549502977516 +AAAAAAAAAKBCAAAA|-|Annual arms know there bad areas. Enormous part|-|Sports|-|basketball|-|6.51|-|1899.04|-|0.75609050121095357 +AAAAAAAAAKPAAAAA|-|Just other years run. Much responsible hotels can turn so nuclear beds. Really angry sons used to assist other, commercial years. Net, expensive ministers leave relatively financial |-|Sports|-|basketball|-|2.35|-|64.26|-|0.02558470364384946 +AAAAAAAABEJCAAAA|-|Others ought to ensure still buildings; new patients keep notably in a drivers. Relative, good im|-|Sports|-|basketball|-|1.20|-|7358.79|-|2.92985467362780826 +AAAAAAAABHCAAAAA|-|Favorite, pure features see green decisions. Imp|-|Sports|-|basketball|-|8.03|-|2357.91|-|0.93878662572158539 +AAAAAAAABIHDAAAA|-|Also federal cells shou|-|Sports|-|basketball|-|6.62|-|1212.78|-|0.48286051797677788 +AAAAAAAACEKAAAAA|-|Cold, new vehicles entitle too authorities; estimates may not mark perhaps front, white members. Officers must happen now dynamic, important pupils. Powerful chee|-|Sports|-|basketball|-|4.61|-|5955.56|-|2.37116771915910493 +AAAAAAAACFNCAAAA|-|Only, other sports could lose free members. There innocent seasons come better as other letters; good products answer undoubtedly asleep words. Free, go|-|Sports|-|basketball|-|7.42|-|null|-|null +AAAAAAAACGADAAAA|-|Formerly modest pairs ought to sell now. Men might become angry, late movements. Famous roles transfer then here broad companies. Residential, potential hours can take today|-|Sports|-|basketball|-|1.39|-|2708.22|-|1.07826028792944260 +AAAAAAAACMFBAAAA|-|Again joint edges may not escape so customers. Current, possible tests maintain clearly. Unchanged, good steps demand after a environments. |-|Sports|-|basketball|-|5.27|-|3951.02|-|1.57307307486651243 +AAAAAAAACPCEAAAA|-|Old patients incorporate following, vocational churches. Bad pools would strike both difficult, personal knees. Subsequently equal minist|-|Sports|-|basketball|-|0.80|-|3743.80|-|1.49056977127051982 +AAAAAAAADGNAAAAA|-|So early systems would place only to a m|-|Sports|-|basketball|-|2.69|-|892.90|-|0.35550236357910336 +AAAAAAAAECICAAAA|-|Already important consequences get western fields. Big,|-|Sports|-|basketball|-|2.86|-|14935.39|-|5.94642899090122576 +AAAAAAAAECLAAAAA|-|In particular other years cou|-|Sports|-|basketball|-|3.38|-|1565.85|-|0.62343305634487512 +AAAAAAAAEHFAAAAA|-|Areas should indicate prepared, general statements. Other, average characters ought to believe top ears; only, old rates might not suffer unfor|-|Sports|-|basketball|-|8.57|-|7790.46|-|3.10172129395056729 +AAAAAAAAEMBAAAAA|-|Smal|-|Sports|-|basketball|-|9.71|-|10306.58|-|4.10349820855315833 +AAAAAAAAEONAAAAA|-|Commercial facts see both old, national charges. New, sharp tourists can provide too often increased poli|-|Sports|-|basketball|-|2.00|-|3364.63|-|1.33960568660450053 +AAAAAAAAFKMBAAAA|-|Decisions bring young farmers; easy other minerals credit preliminary, basic offices.|-|Sports|-|basketball|-|0.22|-|12139.53|-|4.83327540344879894 +AAAAAAAAFMCDAAAA|-|Properly large others say briefly other police. Results used to prefer worried, old opportunities. Very big contents create forces. Possible, famous clu|-|Sports|-|basketball|-|4.35|-|9107.11|-|3.62593698104478438 +AAAAAAAAGDHDAAAA|-|Beaches get too already le|-|Sports|-|basketball|-|1.68|-|3427.80|-|1.36475641379376244 +AAAAAAAAGFIBAAAA|-|Resources meet then following, social eyes. English, exciting countries could justify then really beautiful conditions. Ways rally mutual, coherent clothes. Maximum, northern matches migh|-|Sports|-|basketball|-|1.85|-|9617.46|-|3.82912953480511073 +AAAAAAAAGFPDAAAA|-|Indeed steep recordings should see difficult strengths. Fresh, other p|-|Sports|-|basketball|-|50.26|-|2605.31|-|1.03728733660686949 +AAAAAAAAGNBCAAAA|-|Minutes shall not receive economic, prospective cities. Often sound priorities might sign now in a rights. Utterly future pounds protect merely ever ordinary years. Mature, sure resources can see ar|-|Sports|-|basketball|-|5.00|-|471.62|-|0.18777245459869719 +AAAAAAAAHPIBAAAA|-|Succ|-|Sports|-|basketball|-|9.92|-|3792.14|-|1.50981602981617315 +AAAAAAAAIAKBAAAA|-|Young lakes can put j|-|Sports|-|basketball|-|47.26|-|2509.49|-|0.99913722295679705 +AAAAAAAAIBEDAAAA|-|Often separate sectors see most. Essential, easy ears ought to meet mainl|-|Sports|-|basketball|-|3.26|-|439.65|-|0.17504380574258348 +AAAAAAAAICDAAAAA|-|Levels tear only. Colleagues may not see hot forests. So effective residents must help completely in a hands. However professional classes ought to seem very; political|-|Sports|-|basketball|-|71.09|-|4262.32|-|1.69701515772257120 +AAAAAAAAIFOBAAAA|-|Different events see shortly eyes. Well-known lines visit about neighbours. Regional, genuine items d|-|Sports|-|basketball|-|87.80|-|10183.84|-|4.05463007090538238 +AAAAAAAAILICAAAA|-|Guns consult now|-|Sports|-|basketball|-|1.58|-|1462.68|-|0.58235658770285911 +AAAAAAAAIPLBAAAA|-|Electronic games give also for a votes; seldom political ways could not turn proposals. Notably empty needs|-|Sports|-|basketball|-|5.61|-|10795.63|-|4.29821030498989313 +AAAAAAAAJGLCAAAA|-|Smooth years help more british, curious arms. Inter alia acute members must improve also in a years. Now regional|-|Sports|-|basketball|-|3.91|-|4550.46|-|1.81173623627748534 +AAAAAAAAJNMAAAAA|-|Women may not represent very common muscles. More late stones smile again on the surveys. Topics must not find as variations. Economic boots|-|Sports|-|basketball|-|60.56|-|3092.69|-|1.23133453333795180 +AAAAAAAAKALCAAAA|-|Vast, substantial obligations should watch little, different rates. Officers designate again years. More american owners should manage twice other examples. Judicial changes should like also. Previou|-|Sports|-|basketball|-|6.84|-|14845.86|-|5.91078320009459890 +AAAAAAAAKDDAAAAA|-|Gene|-|Sports|-|basketball|-|0.62|-|1491.06|-|0.59365590126358814 +AAAAAAAAKLFDAAAA|-|Economic, rural principles prevent again in order visible classes. There ill animals deal years. Processes influence to a customers. Projects can notice once resour|-|Sports|-|basketball|-|1.00|-|2379.84|-|0.94751791347305783 +AAAAAAAAKMCCAAAA|-|Themes shall miss wide|-|Sports|-|basketball|-|8.52|-|602.37|-|0.23982972197238715 +AAAAAAAALAEEAAAA|-|Redundant, new writers draw sharp|-|Sports|-|basketball|-|4.80|-|12520.47|-|4.98494420217410259 +AAAAAAAALJEEAAAA|-|Clear members work national, personal operations. He|-|Sports|-|basketball|-|4.17|-|3796.80|-|1.51167137869541900 +AAAAAAAALKKAAAAA|-|Times remove other effects. Almost english conservatives can measure however new, normal r|-|Sports|-|basketball|-|7.65|-|609.84|-|0.24280385418868898 +AAAAAAAAMLCAAAAA|-|Penal|-|Sports|-|basketball|-|0.50|-|3035.70|-|1.20864433320314040 +AAAAAAAANNHBAAAA|-|Fortunately favorite decisio|-|Sports|-|basketball|-|2.86|-|13715.36|-|5.46068193228613620 +AAAAAAAANOEDAAAA|-|Ancient, similar ways equip immediately. Never european leader|-|Sports|-|basketball|-|0.67|-|6831.00|-|2.71971849659408112 +AAAAAAAAODIAAAAA|-|Typical, social authorities can|-|Sports|-|basketball|-|2.96|-|783.58|-|0.31197731218872641 +AAAAAAAAOIKAAAAA|-|Important, british teams might require effectively. Objects would work slightly. Advantages will not adjust of course. Fina|-|Sports|-|basketball|-|4.91|-|3242.22|-|1.29086893632370981 +AAAAAAAAOMBBAAAA|-|Still appropriate roses arrange perhaps always black women. Agencies cannot find total genes. Local lines appear much. Audien|-|Sports|-|basketball|-|85.21|-|10175.18|-|4.05118214788086112 +AAAAAAAAOPCEAAAA|-|Nevertheless good passengers shall clear initially. About dir|-|Sports|-|basketball|-|3.70|-|4389.55|-|1.74767095984841879 +AAAAAAAAPLEBAAAA|-|Comparatively unable miles show already; interesting drugs will not run parts. Yet political priests will run strangely left, d|-|Sports|-|basketball|-|4.52|-|9615.83|-|3.82848056084091100 +AAAAAAAAPNOBAAAA|-|However comprehensive times ought to level even for a blacks. New employers see; far presidenti|-|Sports|-|basketball|-|4.48|-|3359.12|-|1.33741191571938366 +AAAAAAAAPPGBAAAA|-|Areas expect. Organic, democratic resources would last previously. Cheap, residential fields cannot achieve seriously about |-|Sports|-|basketball|-|0.77|-|845.33|-|0.33656267555641555 +AAAAAAAAABNCAAAA|-|Often dead patients could sign really facilities. Mixed achievements would not make typical, particular resources. Christian, young arts can see details. Costs might not follow |-|Sports|-|camping|-|0.69|-|16124.48|-|6.10050675375305820 +AAAAAAAAAFBBAAAA|-|Jobs notify about future boxes. Now main policies will think above offers. Criminal men used to think soon national women. Sure talks ought to appreciate there companies. So appropri|-|Sports|-|camping|-|0.94|-|1328.84|-|0.50275093489261135 +AAAAAAAAAHIBAAAA|-|Vast sequences should imagine thoroughly other preferences. Main weeks keep. Royal things will not control successfully determined politicians. Then key cuts will continue here bank|-|Sports|-|camping|-|7.47|-|3931.59|-|1.48747068730203927 +AAAAAAAAAJOAAAAA|-|Average parents require also times. Children would not describe lightly purposes; large miles love now correct relations. Usual, german goals proceed literary, wooden visitors. Initial councils wil|-|Sports|-|camping|-|2.32|-|9131.34|-|3.45473474746568264 +AAAAAAAAALJDAAAA|-|Meanwhile likely women must keep heavy, smooth parents; complex subjects could lie somewhat sometimes coloured hours. Recent transactions serve det|-|Sports|-|camping|-|0.86|-|6247.49|-|2.36366412678143379 +AAAAAAAAAMHBAAAA|-|Semantic functions shall incl|-|Sports|-|camping|-|60.78|-|8537.01|-|3.22987700452091450 +AAAAAAAABCABAAAA|-|Cells give only serious walls; arrangemen|-|Sports|-|camping|-|0.18|-|11099.88|-|4.19950862947819066 +AAAAAAAABGCBAAAA|-|Sorry eyes could shake obviously across a commentators; more other numbers may control schools. Children maintain. Powerful elements gather very then active opportun|-|Sports|-|camping|-|3.69|-|9946.97|-|3.76331873427106222 +AAAAAAAABHCDAAAA|-|A bit important |-|Sports|-|camping|-|3.97|-|1669.64|-|0.63168859376155114 +AAAAAAAABHEEAAAA|-|Straightforward deal|-|Sports|-|camping|-|4.48|-|937.01|-|0.35450667763141218 +AAAAAAAACLCCAAAA|-|Usual schools ought to claim here indeed particu|-|Sports|-|camping|-|0.36|-|2167.14|-|0.81991184871254159 +AAAAAAAACMBCAAAA|-|Just small t|-|Sports|-|camping|-|2.35|-|6695.56|-|2.53318612446161528 +AAAAAAAADBIBAAAA|-|Equal, different facts emphasise necessary inhabitants. Complex, active moves might put in a reports. Commercial groups can restrict curiously to a players; identical purposes cou|-|Sports|-|camping|-|8.94|-|1232.54|-|0.46631696614531410 +AAAAAAAADCLDAAAA|-|Always opposite skills take well in the prices. Colonial, weak issues shall deny more just respective funds; mental, creative patients would not play even in|-|Sports|-|camping|-|16.73|-|4211.70|-|1.59344700075796275 +AAAAAAAADJFCAAAA|-|Procedures find groups. Possible|-|Sports|-|camping|-|4.18|-|7014.53|-|2.65386466040476588 +AAAAAAAADKIBAAAA|-|Wild changes shall delay soon representatives; other countries die also legal, superb boys. Never video-taped sounds think substantially previous approa|-|Sports|-|camping|-|75.50|-|14640.88|-|5.53920419888815483 +AAAAAAAAEAFCAAAA|-|Aware, single times would ring to the men. Again double months cover that. Accurate politicians send so social hotels. Other, urban feelings upset just wild eyebrows. True, magnificent p|-|Sports|-|camping|-|24.01|-|1812.60|-|0.68577582296314630 +AAAAAAAAEBGCAAAA|-|Comprehensive, ill employees shall come standard pupils. Again possible girls used to go too. Farmers think about a shoulders. N|-|Sports|-|camping|-|3.00|-|2598.81|-|0.98322909989785625 +AAAAAAAAFDBBAAAA|-|Labour, bright taxes could not shock still with a reasons. Dominant weapons will cause home; women say therefore bloody, complete areas; dem|-|Sports|-|camping|-|30.04|-|983.36|-|0.37204265324342908 +AAAAAAAAFJODAAAA|-|Unable school|-|Sports|-|camping|-|2.63|-|15.61|-|0.00590585931615068 +AAAAAAAAFLMDAAAA|-|Still royal companies reach years. Complex, british plants must tell however such as a detectives. Ite|-|Sports|-|camping|-|6.35|-|1875.66|-|0.70963382991231104 +AAAAAAAAFNHDAAAA|-|Just capitalist exceptions communicate |-|Sports|-|camping|-|7.91|-|465.35|-|0.17605968179184604 +AAAAAAAAFPNBAAAA|-|Available tests forgive also policies. Almost local rights used to argue there new only men. Chi|-|Sports|-|camping|-|2.78|-|5416.58|-|2.04929913226620269 +AAAAAAAAGDEAAAAA|-|Succ|-|Sports|-|camping|-|9.35|-|3044.80|-|1.15196415412015219 +AAAAAAAAGGIDAAAA|-|Too top theories shall get more real, various matters. At last silent stations used to terminate official members. Public consequences must include perh|-|Sports|-|camping|-|80.34|-|3857.18|-|1.45931854177258560 +AAAAAAAAGJAEAAAA|-|Certain women may include most. Even close types glimpse recent manufacturers; finally early police ring impossible, u|-|Sports|-|camping|-|8.05|-|12695.32|-|4.80312452873247850 +AAAAAAAAGJNBAAAA|-|Liberal colleagues get forms. Social, o|-|Sports|-|camping|-|0.63|-|4862.20|-|1.83955600044764976 +AAAAAAAAGKBDAAAA|-|Russian, international animals contact much with a costs. Aware minutes refuse usually national shoulders. Minds begin often easy police; exhi|-|Sports|-|camping|-|1.33|-|272.65|-|0.10315391047716090 +AAAAAAAAHEBBAAAA|-|Residents will l|-|Sports|-|camping|-|7.50|-|688.75|-|0.26058043587436115 +AAAAAAAAHGIBAAAA|-|Bold campaigns get with a numbers. Public, medical emotions recognize sources. Very single countries shall fit enough along with|-|Sports|-|camping|-|4.72|-|1557.09|-|0.58910662924952305 +AAAAAAAAHGJDAAAA|-|Democrats may say again. There private services can think about fa|-|Sports|-|camping|-|1.65|-|17069.33|-|6.45797960287957745 +AAAAAAAAHKNBAAAA|-|Different, ltd. students may not try scottish sheets. Almost likely schools may not order. Partly effective c|-|Sports|-|camping|-|3.91|-|11186.12|-|4.23213651592436838 +AAAAAAAAIIOBAAAA|-|Local, female policies achieve new, ill makers. Objectives may not put. Here other acts should hear under wishes. Advanced things ring please main keys. Per|-|Sports|-|camping|-|2.23|-|5430.93|-|2.05472828544921116 +AAAAAAAAIOCEAAAA|-|Matches know significant, annual feet. Industrial prices cannot bring private, only legs. Bright, le|-|Sports|-|camping|-|8.56|-|8457.58|-|3.19982560122291013 +AAAAAAAAJMICAAAA|-|Available implications try only; magistrates must reduce quite black, ugly girls. Animals read. Chief pupils will manipulate easy more real seconds. Men might throw only british policies. Aspects ex|-|Sports|-|camping|-|6.42|-|8563.17|-|3.23977433185662889 +AAAAAAAAKNACAAAA|-|Difficulties ensure conservatives. Physical differences shall prevent only. R|-|Sports|-|camping|-|8.82|-|4157.40|-|1.57290323644873907 +AAAAAAAALALAAAAA|-|Crucial sources make to a police. Great farmers make recent limitations. Yet indian colleagues should get. Mea|-|Sports|-|camping|-|7.95|-|12686.84|-|4.79991622078879126 +AAAAAAAALDKBAAAA|-|Good, white statements de|-|Sports|-|camping|-|8.79|-|1607.13|-|0.60803867282288498 +AAAAAAAALHICAAAA|-|Conventional workers shall not take numbers. French, premier things could remember as to a gardens. Red districts ought to implement flowers. Fiscal, curious terms study much explicit words. Third|-|Sports|-|camping|-|3.61|-|7432.94|-|2.81216514704606018 +AAAAAAAAMBMAAAAA|-|Yesterday complete r|-|Sports|-|camping|-|3.44|-|3421.27|-|1.29439713661542732 +AAAAAAAAMHDEAAAA|-|Girls can keep feelings. Traditional views ask so services; old, diplomatic centres portray relatively respectable women. Comm|-|Sports|-|camping|-|9.55|-|5113.48|-|1.93462482357143846 +AAAAAAAAMKFEAAAA|-|Questions will encourage finally final, small institutions. Additional holes enjoy alread|-|Sports|-|camping|-|21.00|-|6681.46|-|2.52785155582883344 +AAAAAAAANGMAAAAA|-|Grounds will take then by the boards. Historical candidates feel suitable numbers. Normally inevitable savings return systems. Psychological rooms would turn almost|-|Sports|-|camping|-|2.39|-|13311.97|-|5.03642678032148002 +AAAAAAAANJJAAAAA|-|Accounts listen firmly incredible trends. Votes must not exert away natural fears. Able terms reflect well golden others. British feet could not re|-|Sports|-|camping|-|8.64|-|1709.72|-|0.64685238885388420 +AAAAAAAAOHBEAAAA|-|Important bonds answer associated |-|Sports|-|camping|-|76.93|-|7444.08|-|2.81637983460415874 +AAAAAAAAPBAAAAAA|-|Just available years undertake social units. Alone long-term years communicate very huge workers. Relevant, false farmers start hardly bottom windows. Associations shall |-|Sports|-|camping|-|7.57|-|4977.80|-|1.88329189647244272 +AAAAAAAAAACAAAAA|-|Indeed available factors must not provide ot|-|Sports|-|fishing|-|7.93|-|5765.13|-|1.45130185259979319 +AAAAAAAAACDCAAAA|-|Regardless valid resources mu|-|Sports|-|fishing|-|0.79|-|1770.28|-|0.44564661050494297 +AAAAAAAAAKNAAAAA|-|White, favorable childr|-|Sports|-|fishing|-|6.72|-|1915.64|-|0.48223923500671586 +AAAAAAAAAMDEAAAA|-|Ends would help good, new skills. Researchers keep far relevant activities. |-|Sports|-|fishing|-|8.43|-|1532.74|-|0.38584878425183942 +AAAAAAAABEFDAAAA|-|Members support general, mysterious programmes. Front times want with the services. Now new details should impose never cheap live activiti|-|Sports|-|fishing|-|4.96|-|8503.69|-|2.14070125928371700 +AAAAAAAABHGCAAAA|-|Tests shall see famous, good words; sexual, significant theo|-|Sports|-|fishing|-|8.63|-|1435.50|-|0.36136978860962426 +AAAAAAAACCABAAAA|-|Errors face fierce services. Partial years will not let scarcely black changes. Clever, natu|-|Sports|-|fishing|-|1.51|-|129.20|-|0.03252453966448168 +AAAAAAAACIECAAAA|-|Still difficult futures will not contribute hands. Lovely r|-|Sports|-|fishing|-|8.00|-|12567.87|-|3.16380949158706965 +AAAAAAAACJCDAAAA|-|Emissions confirm as. High changes must not catch hesitantly. Children think below|-|Sports|-|fishing|-|1.52|-|7395.58|-|1.86174794931770464 +AAAAAAAACKCCAAAA|-|Groups ought to becom|-|Sports|-|fishing|-|2.35|-|909.84|-|0.22904123195303416 +AAAAAAAACKICAAAA|-|Parts play greatly locations. Letters might not sit informal, possible types. African, long implications must r|-|Sports|-|fishing|-|2.47|-|3001.55|-|0.75560396307991481 +AAAAAAAACPLBAAAA|-|Powerful, marked figures collect modern, adequate police. Physical, vital details remember obviously very supreme countries. Le|-|Sports|-|fishing|-|2.32|-|null|-|null +AAAAAAAADCPCAAAA|-|Usually english commentators will indicate still dangerous, spiritu|-|Sports|-|fishing|-|9.90|-|3227.28|-|0.81242876446121086 +AAAAAAAADDDBAAAA|-|Early, associated parents continue stories. Alive, key costs will not supply. For example excellent wi|-|Sports|-|fishing|-|0.65|-|822.90|-|0.20715513691874595 +AAAAAAAADEDDAAAA|-|Just left grounds would not shoot other, accessible readers. Long, true winners shall vary; male conditions must hear never local, clean studies. Major, generous pp. must not get always gre|-|Sports|-|fishing|-|3.62|-|653.07|-|0.16440248543872331 +AAAAAAAADFMCAAAA|-|Groups deserve also only members. Inevitable, rare dreams worry much old enquiries. Please clear nerves turn necessar|-|Sports|-|fishing|-|2.58|-|587.51|-|0.14789854720030676 +AAAAAAAADFPCAAAA|-|Foreign advances expand never new, colonial players. Colours confess lines. Urgent, massive items sit then men. Different countries cut however. Effectively old ideas suggest only actually particul|-|Sports|-|fishing|-|4.19|-|3967.81|-|0.99884824865423424 +AAAAAAAADGICAAAA|-|Sole, public skills require long opportunities. Parents destroy how|-|Sports|-|fishing|-|4.84|-|2931.70|-|0.73802006915140052 +AAAAAAAADKFBAAAA|-|Courses try military parents. Fast, w|-|Sports|-|fishing|-|1.64|-|13333.47|-|3.35654004551220259 +AAAAAAAADLIAAAAA|-|New parties strengthen please at all current things. Similar teams must lead most real firms. Simply tiny planes will set moving advantages. Concerned, average memories use|-|Sports|-|fishing|-|2.13|-|5375.92|-|1.35332293555015762 +AAAAAAAADOHBAAAA|-|International, new heads succeed altogether. Inc men see about accord|-|Sports|-|fishing|-|4.11|-|50.50|-|0.01271276511653502 +AAAAAAAAECGCAAAA|-|Birds assist; urban explanations could pr|-|Sports|-|fishing|-|4.03|-|6523.44|-|1.64219723706552929 +AAAAAAAAEGNDAAAA|-|Deep patterns shall find british, american expectations. Sufficient patients must see. English, large assets could not meet for the proceedings. White, chinese matches shal|-|Sports|-|fishing|-|9.76|-|3033.80|-|0.76372251109988024 +AAAAAAAAFEICAAAA|-|Points can appoint even pregnant ideas. Other, basic bodies shall frighten too modern laws; features accompa|-|Sports|-|fishing|-|1.97|-|16383.12|-|4.12425260269321314 +AAAAAAAAFFMAAAAA|-|Home available features need with a questions. Hard waters can operate still more content bands. Organic, large ideas contribute points. Difficult, right produc|-|Sports|-|fishing|-|2.47|-|20043.74|-|5.04576947875044948 +AAAAAAAAFJCAAAAA|-|Collective, full signals will assume only services. Political villages think children. So old|-|Sports|-|fishing|-|2.56|-|9547.80|-|2.40354334217134834 +AAAAAAAAGCDDAAAA|-|Labour, special servants propose as in a casualties. Previous, italian weekends say. Sufficiently local children can achieve|-|Sports|-|fishing|-|4.76|-|3346.30|-|0.84239061206853756 +AAAAAAAAGCGCAAAA|-|European banks protect with a numbers. Further central elements seem on a elements; patients encourage leaves. Trustees ought to emphasi|-|Sports|-|fishing|-|2.12|-|7980.98|-|2.00911532950027102 +AAAAAAAAGDBBAAAA|-|Early days may not make just sacred, negative units. Safe forces solve more relevant magistrates; certain, usual samples pull. Reserves must hurt e|-|Sports|-|fishing|-|3.84|-|234.96|-|0.05914834241150632 +AAAAAAAAGEEAAAAA|-|Areas should d|-|Sports|-|fishing|-|4.05|-|1317.12|-|0.33156905327308137 +AAAAAAAAGKEAAAAA|-|Late americans will produce far stones. Very russian things say different grants; excellent stories might blame today; possible, good efforts will forget pretty britis|-|Sports|-|fishing|-|6.51|-|11402.19|-|2.87036362938820737 +AAAAAAAAGOEBAAAA|-|Ma|-|Sports|-|fishing|-|61.12|-|216.04|-|0.05438546090645993 +AAAAAAAAGOPCAAAA|-|Members shall not assume politely goods. Other, pretty terms would not meet here in a disciplines. Emotional bases ought to fo|-|Sports|-|fishing|-|3.05|-|1352.40|-|0.34045036720003891 +AAAAAAAAHACEAAAA|-|Shoes give more now annual ch|-|Sports|-|fishing|-|1.18|-|766.84|-|0.19304270894977657 +AAAAAAAAHPCBAAAA|-|Automatically private stands go always easy terms. Well distinctive depar|-|Sports|-|fishing|-|1.17|-|4016.02|-|1.01098453392687094 +AAAAAAAAIEMCAAAA|-|New rules could become later economic things; consumers understand actually; political, ju|-|Sports|-|fishing|-|15.02|-|1288.06|-|0.32425354922780399 +AAAAAAAAIFABAAAA|-|Children could repay questions. Items help claims. Slightly alone areas come a|-|Sports|-|fishing|-|2.56|-|6284.14|-|1.58195635206777027 +AAAAAAAAIHJBAAAA|-|Beds used to accept formerly; corresp|-|Sports|-|fishing|-|3.35|-|4312.88|-|1.08571545377824890 +AAAAAAAAIJJAAAAA|-|Men could require evolutionary falls; taxes teach dead parents; only financial servants might not buy eastern things. Different payments develop. New inhabitants might not eat w|-|Sports|-|fishing|-|2.64|-|2987.14|-|0.75197641960804808 +AAAAAAAAIKOAAAAA|-|Independently mean findings must not take today police. White, yellow features try even grateful examples. Sweet |-|Sports|-|fishing|-|6.47|-|656.82|-|0.16534650265034720 +AAAAAAAAINJCAAAA|-|Social, american friends disagree new, certain hands. Sessions notice. True results read. Offences make so strong patients. Operations would see different edge|-|Sports|-|fishing|-|1.58|-|829.08|-|0.20871087728350211 +AAAAAAAAIOABAAAA|-|Problems may become there clearly effect|-|Sports|-|fishing|-|4.87|-|3196.50|-|0.80468027118820199 +AAAAAAAAJFODAAAA|-|Settlements must make significa|-|Sports|-|fishing|-|7.42|-|6759.74|-|1.70168290829398921 +AAAAAAAAJHDDAAAA|-|Shortly new terms would recover yet satisfactory, previou|-|Sports|-|fishing|-|2.86|-|823.83|-|0.20738925318722867 +AAAAAAAAJHKCAAAA|-|Public, certain lives could not choose indeed in a tools. Then bad things gain women.|-|Sports|-|fishing|-|2.62|-|8393.31|-|2.11291442733197173 +AAAAAAAAJJEAAAAA|-|Circumstances cannot take lines. Modern goods would make corresponding tools. Subsequently toxic practices see annually alm|-|Sports|-|fishing|-|3.56|-|13738.34|-|3.45846117843757952 +AAAAAAAAKCPBAAAA|-|Conditions make patients. New, various eggs will not watch appropri|-|Sports|-|fishing|-|3.96|-|6875.80|-|1.73089961164894079 +AAAAAAAAKNDCAAAA|-|Already accurate |-|Sports|-|fishing|-|7.42|-|10781.81|-|2.71419045665561336 +AAAAAAAAKNMAAAAA|-|Deeply standard recommendations can hear. Financial, various stations can eat urban objectives. Never remote benefi|-|Sports|-|fishing|-|4.22|-|8138.05|-|2.04865580508154144 +AAAAAAAAKOGBAAAA|-|Points should not consider as tiny, working hundreds. Widespread cases accept again other samples; white houses use medical stages; important |-|Sports|-|fishing|-|4.04|-|4162.24|-|1.04779365304250957 +AAAAAAAALBICAAAA|-|Sectors might not know properly. Large, electric workers used to drop even as ca|-|Sports|-|fishing|-|6.89|-|10251.93|-|2.58079956596354251 +AAAAAAAALLADAAAA|-|Downwards managerial boundaries throw still. Effective animals shall understand then full thousands. Past sales ought to aid at least bad products. For long similar courses will get by a|-|Sports|-|fishing|-|3.50|-|6675.16|-|1.68039091475821630 +AAAAAAAALOIBAAAA|-|Old others will cut other activities. Sharp passages avoid allegedly orthodox, additional firms. High officers must form.|-|Sports|-|fishing|-|0.25|-|11695.34|-|2.94416060154488543 +AAAAAAAAMCBEAAAA|-|Coming patterns find ago international machines. Proposals would believe markedly a|-|Sports|-|fishing|-|8.72|-|9606.84|-|2.41840594915115483 +AAAAAAAAMEDDAAAA|-|Rapidly full number|-|Sports|-|fishing|-|9.57|-|6651.90|-|1.67453549066691720 +AAAAAAAAMFCAAAAA|-|Great yea|-|Sports|-|fishing|-|4.74|-|15928.14|-|4.00971688244131007 +AAAAAAAAMIHCAAAA|-|Interactions feed ago areas. Strongly legal members prevent more voluntary, persi|-|Sports|-|fishing|-|3.59|-|3585.80|-|0.90268184465091653 +AAAAAAAAMKKCAAAA|-|Other, future parents suffer once again deaf, complex products. Here territorial groups stand ago.|-|Sports|-|fishing|-|3.54|-|9525.92|-|2.39803531641392683 +AAAAAAAAMLEEAAAA|-|There fundamental categories take else like |-|Sports|-|fishing|-|0.96|-|5124.40|-|1.29000581313212022 +AAAAAAAAMMCCAAAA|-|Old, helpful matters will tell away rar|-|Sports|-|fishing|-|0.88|-|6712.76|-|1.68985626066676515 +AAAAAAAAMMNDAAAA|-|Yesterday only objects los|-|Sports|-|fishing|-|8.13|-|null|-|null +AAAAAAAAMNPAAAAA|-|Members should say earnings. Detailed departments would not move just at the hopes. Figures can take. Actually open houses want. Good teachers combine the|-|Sports|-|fishing|-|2.66|-|1660.17|-|0.41792774779243463 +AAAAAAAANCGBAAAA|-|Members like very. Then interested principles could remember yet important, new agents. Necessarily due assets generate across. Areas give anyway as social projects. Main, |-|Sports|-|fishing|-|1.79|-|2081.25|-|0.52392955245125775 +AAAAAAAANECDAAAA|-|Blind sessions hurt traditionally public, various clothes. High, southern schools might not tal|-|Sports|-|fishing|-|1.43|-|595.58|-|0.14993007223972136 +AAAAAAAANMFBAAAA|-|Practical roads mean either dishes. Necessary issues determine simply fund|-|Sports|-|fishing|-|3.40|-|2425.72|-|0.61064571482141259 +AAAAAAAAOAGAAAAA|-|Big affa|-|Sports|-|fishing|-|5.10|-|8225.45|-|2.07065769956045552 +AAAAAAAAOBLAAAAA|-|Otherwise diverse frames make just. International, red wars find clothes. Necessary, important cups see usu|-|Sports|-|fishing|-|30.34|-|5861.45|-|1.47554924935275663 +AAAAAAAAOGFEAAAA|-|True, aware questions may not discuss countries. Values make then considerable companies; apparent ingredients greet to a hours. Really eastern workers would engage inc days. Brothers w|-|Sports|-|fishing|-|9.20|-|322.85|-|0.08127358847273925 +AAAAAAAAOLJBAAAA|-|General, local thanks must soar actually about p|-|Sports|-|fishing|-|11.91|-|3774.61|-|0.95021248191137154 +AAAAAAAAONIAAAAA|-|Maybe gastric variations will see as. However physical plants would not choose for example wi|-|Sports|-|fishing|-|3.36|-|1435.90|-|0.36147048377886414 +AAAAAAAAPBKCAAAA|-|Ill, simple objects shall bear solid trees. Ears should use there minimum, inappropriate personnel. Available practices should not apply increasingly pr|-|Sports|-|fishing|-|7.87|-|14366.01|-|3.61646952062957036 +AAAAAAAAPDKAAAAA|-|Sure reliable suppliers show upright other women. Maybe|-|Sports|-|fishing|-|1.11|-|13110.99|-|3.30053339238098058 +AAAAAAAAPEFEAAAA|-|Much common times achieve existing, continuing positions. Los|-|Sports|-|fishing|-|8.20|-|855.13|-|0.21526865018024939 +AAAAAAAAPHKCAAAA|-|Good, whole facilities maintain for a points. More worthwhile directors battle annual hours. Yes|-|Sports|-|fishing|-|8.90|-|502.69|-|0.12654613656298991 +AAAAAAAAPLGCAAAA|-|Rules offer. Important, italian goo|-|Sports|-|fishing|-|4.06|-|7648.84|-|1.92550309572193553 +AAAAAAAAPLIAAAAA|-|Vital, similar activities change thickly. Seats would sit essentially brilliant words. Hig|-|Sports|-|fishing|-|68.38|-|6959.10|-|1.75186938064314609 +AAAAAAAAPMMBAAAA|-|Even useless times make old, old studies. Early public employees must open together warm consequences. Sufficient, evident men would operate stars. Various, other sections control l|-|Sports|-|fishing|-|89.62|-|384.92|-|0.09689896135953784 +AAAAAAAAAEPDAAAA|-|New lakes would guess plants. Standard children could take usually available, thin types. Ju|-|Sports|-|fitness|-|9.45|-|11235.99|-|2.99393368169862881 +AAAAAAAAAFDDAAAA|-|Sure, major findings come parties. Urban, future years punish. Dealers ought to see specific functions. Wounds should not see as british couples. Fully psych|-|Sports|-|fitness|-|0.38|-|6634.87|-|1.76792260999625145 +AAAAAAAAAOIBAAAA|-|Ideas used to arrive quiet, wide students. Private poems shall im|-|Sports|-|fitness|-|6.33|-|101.05|-|0.02692570913071714 +AAAAAAAAAPKDAAAA|-|Rocks should see; only financial posts drop extra sides. Genuine, valuable competitors beat large hands. Looks drive slowly rivers. Examples close violent dea|-|Sports|-|fitness|-|3.27|-|15708.15|-|4.18558216607297765 +AAAAAAAACABCAAAA|-|Increases|-|Sports|-|fitness|-|7.61|-|6644.68|-|1.77053657542497322 +AAAAAAAACCGAAAAA|-|Again scottish accidents would destroy italian places; please careful services pick sometimes overall men; immensely extra sets move optimistic, substantial actors. Human, likely reports|-|Sports|-|fitness|-|2.38|-|12773.39|-|3.40358816183286460 +AAAAAAAACDFDAAAA|-|So sexual ministers would look now nuclear pools. Messages get so other, difficult police. Departments would not hear dead personnel. Quite straightforward rooms feel sheer|-|Sports|-|fitness|-|4.41|-|1640.22|-|0.43705182217105257 +AAAAAAAACHFDAAAA|-|Other, spiritual pieces will not work largely then rich changes. Chief bodies get virtually scots. |-|Sports|-|fitness|-|1.10|-|7863.63|-|2.09533710135161997 +AAAAAAAACPJDAAAA|-|Rough towns must come; di|-|Sports|-|fitness|-|5.32|-|68.70|-|0.01830575177912189 +AAAAAAAADKMDAAAA|-|Physical questions confirm much to the marks. Irish, pleased eyes would know in an subsi|-|Sports|-|fitness|-|2.86|-|18730.50|-|4.99091533768329866 +AAAAAAAADOCAAAAA|-|Little, national services will buy young molecules. In part video-taped activities join now|-|Sports|-|fitness|-|5.91|-|4998.46|-|1.33188599764002355 +AAAAAAAAEBBEAAAA|-|Now open statements would not make also leaves. Heavy, unable damages defend well by the shows. Immediately public w|-|Sports|-|fitness|-|3.42|-|7714.64|-|2.05563733486586494 +AAAAAAAAEDMBAAAA|-|Almost other bodies call cars. So international benefits ought to suppose in a points. Officers can ensure also for a books. Carefully different police sleep. Irish, u|-|Sports|-|fitness|-|1.34|-|6360.75|-|1.69488079518267222 +AAAAAAAAEHBEAAAA|-|Days must appear on the police. Direct, late developments should serve always for the papers. Meetings take yesterday women. Medium periods |-|Sports|-|fitness|-|3.50|-|4258.35|-|1.13467682807312538 +AAAAAAAAEHOBAAAA|-|Politely direct positions would fall too. Then white implications say appearances; programmes control particular activities. Effective employ|-|Sports|-|fitness|-|4.64|-|3136.98|-|0.83587739761382527 +AAAAAAAAEPLCAAAA|-|Overall net men ought to run basic, moral beings. Guilty users may |-|Sports|-|fitness|-|6.99|-|32.90|-|0.00876650994953581 +AAAAAAAAFFPDAAAA|-|Corporate heroes examine forth technical, formal shares; buildings may not emphasize abo|-|Sports|-|fitness|-|68.11|-|1592.50|-|0.42433638585519090 +AAAAAAAAFHBDAAAA|-|Below old resources could cover lo|-|Sports|-|fitness|-|2.86|-|2331.00|-|0.62111655599902668 +AAAAAAAAFKKAAAAA|-|Running children may continue common, small wives; great, subtle teams shall change bad, good lines; others may want; parties used to like near a sty|-|Sports|-|fitness|-|2.32|-|23393.47|-|6.23340691517226538 +AAAAAAAAFLCBAAAA|-|Labour, dominant dreams come. Please various symptoms cannot persuade so owners. Primary colours would argue once small posts. Live, asia|-|Sports|-|fitness|-|48.03|-|5629.05|-|1.49991254806791983 +AAAAAAAAFMOAAAAA|-|Deep, light measures could ask around experimental sections. Days attend social, wise cases. Children should find; as|-|Sports|-|fitness|-|3.91|-|19038.27|-|5.07292350689815085 +AAAAAAAAFOGAAAAA|-|Principal eyes should pay frequently relevant areas. Light police m|-|Sports|-|fitness|-|3.17|-|4837.50|-|1.28899671370454378 +AAAAAAAAGAEDAAAA|-|Private, main colleagues focus legislative, increased |-|Sports|-|fitness|-|3.57|-|3871.06|-|1.03147981778875685 +AAAAAAAAGCOBAAAA|-|Little european weeks guide. Wide, local police may take european, alone others; com|-|Sports|-|fitness|-|1.68|-|2496.73|-|0.66527685064755464 +AAAAAAAAGEBAAAAA|-|Total, urban theories used to keep social, special standards. Countries give. Significant, new feet he|-|Sports|-|fitness|-|1.08|-|2842.20|-|0.75733053430306033 +AAAAAAAAGEHCAAAA|-|Lightly co|-|Sports|-|fitness|-|6.02|-|16.72|-|0.00445519897739328 +AAAAAAAAGGHAAAAA|-|Empty, new rates shall draw formerly cities. Short memories know over the im|-|Sports|-|fitness|-|2.92|-|1939.32|-|0.51674978952382343 +AAAAAAAAGJLAAAAA|-|Increased, practical police get. Divisions used to speed briefly under a stories. Rates continue on a troubles. Head, pink principles would not|-|Sports|-|fitness|-|4.49|-|1658.30|-|0.44186940575426252 +AAAAAAAAGMEAAAAA|-|Branches attend fair true banks. Rigid cigarettes like by a places. Stations shall not let thus. Kids hold into a achievements. Streets used to set twice actual, wonderful areas; surroundings r|-|Sports|-|fitness|-|9.66|-|1661.52|-|0.44272740460038730 +AAAAAAAAGMFAAAAA|-|Decisions want a little eggs. Super, worried aims can pull from a meanings. Meanings create etc forms. Thus social coupl|-|Sports|-|fitness|-|5.85|-|6515.90|-|1.73622195076536162 +AAAAAAAAIDFBAAAA|-|Rounds play generally other, old organizations. Right models tell well in a representatives. Important, german beliefs might care discreetly emotional politicians; surely effective issues sit forward|-|Sports|-|fitness|-|2.32|-|12377.11|-|3.29799568272034023 +AAAAAAAAIJGDAAAA|-|More other friends could not recognize regularly communications. Officers encourage. Apparent questions rely clear, white individuals; cul|-|Sports|-|fitness|-|4.49|-|3474.60|-|0.92583937600781557 +AAAAAAAAIKIAAAAA|-|Great,|-|Sports|-|fitness|-|4.04|-|499.29|-|0.13304044841044789 +AAAAAAAAILIBAAAA|-|Nuclear others ought to come|-|Sports|-|fitness|-|2.37|-|7890.94|-|2.10261410398754164 +AAAAAAAAILNAAAAA|-|Angry solutions must not encourage usually trees. Dirty, neat servants stop also on the birds. Windows make st|-|Sports|-|fitness|-|3.18|-|2253.39|-|0.60043665213326758 +AAAAAAAAIPIBAAAA|-|Late general supporters see more informal, blank employees; very similar methods shall help complex, likely schemes. More than new groups reconsider unanimously. Physical incenti|-|Sports|-|fitness|-|6.85|-|686.28|-|0.18286566711755128 +AAAAAAAAJDJBAAAA|-|Conscious, central results play above about the hands. Stages stay so available universities. Tomorrow professional birds decide; enthusiastically big views appear new window|-|Sports|-|fitness|-|9.62|-|2016.19|-|0.53723251353053522 +AAAAAAAAJPAEAAAA|-|Please positive sys|-|Sports|-|fitness|-|0.31|-|8141.48|-|2.16937280923850524 +AAAAAAAAKCDBAAAA|-|Following sounds start labour creatures. Financial, new books ought to tell only relations. Personal, other partners organise iri|-|Sports|-|fitness|-|3.56|-|21486.43|-|5.72525843085120840 +AAAAAAAAKEBEAAAA|-|Vehicles m|-|Sports|-|fitness|-|3.88|-|12374.04|-|3.29717765276456288 +AAAAAAAAKHJDAAAA|-|Other heads can justify parallel important yards; easy decisions will disappear fin|-|Sports|-|fitness|-|1.41|-|9463.74|-|2.52170124224377037 +AAAAAAAAKNFEAAAA|-|Weak, victorian eyes should compare grudgingly socially alone heads. Today certain parties come either high terms. Typical roads give|-|Sports|-|fitness|-|5.99|-|2512.40|-|0.66945226739251593 +AAAAAAAAKPDEAAAA|-|Advisory, experimen|-|Sports|-|fitness|-|0.22|-|9511.19|-|2.53434473455700667 +AAAAAAAALCIBAAAA|-|Special miles must ease under across a conditions. Points might continue australian, australian places. Entirely |-|Sports|-|fitness|-|3.17|-|5610.05|-|1.49484982195724565 +AAAAAAAALLDDAAAA|-|Men mean also weapons. Individual proposals ought to mean farmers. Sometimes valuable eyes might take rights. Rough, different rewards cost real, alone ministers. Requirements may no|-|Sports|-|fitness|-|64.89|-|null|-|null +AAAAAAAAMCDCAAAA|-|Just relationships might not return more home contemporary women. Difficult years |-|Sports|-|fitness|-|7.90|-|7644.48|-|2.03694255255402808 +AAAAAAAAMCIAAAAA|-|Crucially favorable workers will show reasonably final|-|Sports|-|fitness|-|9.73|-|1514.15|-|0.40345930213038449 +AAAAAAAAMCMCAAAA|-|Crops shall not know however police. Free students get then literary authoritie|-|Sports|-|fitness|-|6.86|-|235.94|-|0.06286839992381397 +AAAAAAAAMFDAAAAA|-|Enough living relations deliver simply in a courses; hands make once loyal colleagues; difficulties intend properly russian, good countries; soft, left|-|Sports|-|fitness|-|2.85|-|9625.29|-|2.56474773714795002 +AAAAAAAAMFIAAAAA|-|Problems pay beautifully. Churches will mean now villages. Opportunities might crumble in a things. Mild, important firms must get f|-|Sports|-|fitness|-|4.78|-|13625.60|-|3.63066741545274041 +AAAAAAAAMJPBAAAA|-|Brown payments might win also. Above, rough requirements shall point thus forces. Ideas see; traditional policies go high tasks; married tasks ought to say then in the conditions. I|-|Sports|-|fitness|-|5.89|-|1323.80|-|0.35273878027949872 +AAAAAAAANBGCAAAA|-|So close miles would seem american, emotional horses. Other, alive operations ought to want further red layers. Parameters might faint bad, significant stations. So prime newspapers wou|-|Sports|-|fitness|-|2.97|-|12049.19|-|3.21061835923548359 +AAAAAAAANNEBAAAA|-|Royal speeches take evil, front margins. For example hard events ought to go angles. Possible, foreign lakes shall not reconsider. Other honours hear momen|-|Sports|-|fitness|-|8.13|-|4804.68|-|1.28025152049652660 +AAAAAAAAOBMCAAAA|-|Never possible materials seem only other groups. Only good children discuss less red, new d|-|Sports|-|fitness|-|1.42|-|4594.08|-|1.22413519844873809 +AAAAAAAAONLDAAAA|-|All right other details might distrib|-|Sports|-|fitness|-|8.04|-|11330.64|-|3.01915405150785570 +AAAAAAAAOPFEAAAA|-|Just white figures cease equally important others; good paths criticize later budgets; odds must generate loans. Widespread stair|-|Sports|-|fitness|-|58.19|-|13392.61|-|3.56858507037242586 +AAAAAAAAPDHAAAAA|-|Points force into the symptoms. Local, strong negotiations get examples. For the time being fat result|-|Sports|-|fitness|-|5.61|-|11034.21|-|2.94016753040326905 +AAAAAAAAPFFDAAAA|-|Subject, dead qualifications benefit more real nurses. Up to special writers give most responses; social circumstances de|-|Sports|-|fitness|-|2.69|-|93.28|-|0.02485532061072038 +AAAAAAAAABADAAAA|-|Other, present cases detect twice good members; techniques can carry. Supposed requirement|-|Sports|-|football|-|3.29|-|1729.18|-|0.52889071413826688 +AAAAAAAAAEMDAAAA|-|Effective, chronic duties help at all limited processes. So civil copies blame only statistical trusts. Prime, full children avoid still once useful images. Darling procedures t|-|Sports|-|football|-|2.04|-|1419.60|-|0.43420190945458753 +AAAAAAAAAEPAAAAA|-|Grants point. Additional angles should not deliver general cells. Random teams might not achieve very stations. So european dealers shall protect elected, separ|-|Sports|-|football|-|52.27|-|13385.31|-|4.09405970741165470 +AAAAAAAAAFMAAAAA|-|Public, huge properties set for example in the plans. Pains would suggest with the ministers. Welsh, correct fields could not stop classes. Spanish, other patte|-|Sports|-|football|-|0.12|-|14761.87|-|4.51509730989038604 +AAAAAAAAAGCCAAAA|-|Changes consider up to a qualifications. Creditors stay even under the banks|-|Sports|-|football|-|35.67|-|1206.94|-|0.36915726443865869 +AAAAAAAAAGCDAAAA|-|Political, other customs note attractive policies|-|Sports|-|football|-|6.36|-|9989.92|-|3.05553841877893284 +AAAAAAAAAPFDAAAA|-|Odd, only premises present previously obvious strengths. Widely different times should not ke|-|Sports|-|football|-|7.53|-|10761.09|-|3.29141013370855686 +AAAAAAAABDPAAAAA|-|Sophisticated, unfair questions may remove separate premises. Typical patterns intervene typically walls. Naked areas ought to return now military, necessary children; young met|-|Sports|-|football|-|33.19|-|13248.10|-|4.05209236168309457 +AAAAAAAACDLAAAAA|-|Consistent, recent conditions might not keep personal employers. W|-|Sports|-|football|-|0.53|-|6855.62|-|2.09687467913148729 +AAAAAAAACIJDAAAA|-|Rather aware thanks may not work with a chi|-|Sports|-|football|-|1.99|-|366.38|-|0.11206177485627767 +AAAAAAAADEKCAAAA|-|Awful eyes get now like a gentlemen. Final countries may become french, turkish sciences. French lives repeat great, big standards. Large, able roads cl|-|Sports|-|football|-|6.18|-|3201.28|-|0.97915038651647081 +AAAAAAAADGHAAAAA|-|Thanks may add suddenly strong weeks. Times abandon as files. Systems feel cheap targets. Green, formal events understand french, rea|-|Sports|-|football|-|0.97|-|20146.60|-|6.16208240984628989 +AAAAAAAADGKDAAAA|-|Miserable officers introduce clearly. Much mathematical eyes could change so before prominent plans. Prices i|-|Sports|-|football|-|4.67|-|8765.43|-|2.68101327359152238 +AAAAAAAADLIDAAAA|-|Else social offenders will not support mines. Gently intelligent expressions speed days. Sometimes old houses offer really important, local month|-|Sports|-|football|-|2.19|-|3272.24|-|1.00085436474618167 +AAAAAAAADPEAAAAA|-|Critics can cover only str|-|Sports|-|football|-|1.79|-|6996.32|-|2.13990948376677925 +AAAAAAAAEAEDAAAA|-|Patients stop extensive, tiny words. Y|-|Sports|-|football|-|4.82|-|2351.28|-|0.71916755822934810 +AAAAAAAAEAPAAAAA|-|Quite hard supporters offer bare, increased measurements. Dependent, important expectations cope before concerned bases. Lips kill maybe a|-|Sports|-|football|-|65.48|-|12196.26|-|3.73037431685306263 +AAAAAAAAEBCDAAAA|-|Financial results remind thick computers. Quite awful pictures see more bars. Concerned, general answers help natural|-|Sports|-|football|-|1.13|-|2283.79|-|0.69852492166335056 +AAAAAAAAEFBDAAAA|-|Increased, difficult ranks support very ranks; perhaps serious rates come runs. Blue, red churches mark |-|Sports|-|football|-|1.91|-|8878.92|-|2.71572556910011715 +AAAAAAAAEHLDAAAA|-|Schools give through the goods. Most political personnel would brin|-|Sports|-|football|-|85.01|-|3284.09|-|1.00447883123465509 +AAAAAAAAEHMCAAAA|-|Chairs may not tell on the flowers. Rats use thus experimental standards. Cogniti|-|Sports|-|football|-|4.20|-|1734.48|-|0.53051178353817482 +AAAAAAAAEHPDAAAA|-|Never racial rules go forms; assets ought to understand just facts. Crimes alleviate however c|-|Sports|-|football|-|3.02|-|3902.76|-|1.19370656814806004 +AAAAAAAAEJGBAAAA|-|Results might try by the illustrations. Most previous han|-|Sports|-|football|-|1.56|-|1645.10|-|0.50317382448840656 +AAAAAAAAGDLDAAAA|-|Well terrible problems dismiss less rates. Following, professional hands t|-|Sports|-|football|-|50.01|-|695.80|-|0.21281888461432939 +AAAAAAAAGHKDAAAA|-|Social pieces become; reservations rescue probably old hopes. Different, high records buy just general centuries. Recently industrial relationships cannot|-|Sports|-|football|-|34.68|-|4363.58|-|1.33465396453779167 +AAAAAAAAHAFEAAAA|-|Economic, crude hands put available payments; irish months pay main, tropical members. Neither soft syste|-|Sports|-|football|-|4.23|-|7762.14|-|2.37414483618894904 +AAAAAAAAHAGAAAAA|-|International, profitable schools sit rather di|-|Sports|-|football|-|81.85|-|878.61|-|0.26873354442511634 +AAAAAAAAIEDEAAAA|-|Supreme, extra blues prove great, appropriate organs. Anyway powerful aspects resolve once. Families like by now at last tall lists;|-|Sports|-|football|-|8.08|-|3047.93|-|0.93224642567196462 +AAAAAAAAILFEAAAA|-|Particular, complete artists belong much enough active cheeks; profits may see able, complete processes. Here available officials take aside at a eyebrows. |-|Sports|-|football|-|1.12|-|92.80|-|0.02838400760593528 +AAAAAAAAILPAAAAA|-|Changes set shortly. Mental, different jobs need more with a solicitors. Other, federal pieces thank then to a chang|-|Sports|-|football|-|1.84|-|5793.63|-|1.77205213346955618 +AAAAAAAAJLIAAAAA|-|Standards must pa|-|Sports|-|football|-|3.63|-|7891.28|-|2.41364387435953613 +AAAAAAAAJLOAAAAA|-|Very aspects use then. Popular, weste|-|Sports|-|football|-|6.30|-|2603.06|-|0.79617753058950311 +AAAAAAAAJPFCAAAA|-|Models may register still digital, professional birds. There necessary things can fail never irish forces. All corporate readers identify more|-|Sports|-|football|-|68.59|-|3454.98|-|1.05674761420640379 +AAAAAAAAKFLCAAAA|-|Soon leading minutes may cut residents; social, international customers may become probably planes; ago open mi|-|Sports|-|football|-|7.10|-|71.68|-|0.02192419897837760 +AAAAAAAAKGGAAAAA|-|Utterly bad years l|-|Sports|-|football|-|3.77|-|1435.05|-|0.43892747968639464 +AAAAAAAAKKBBAAAA|-|National restriction|-|Sports|-|football|-|4.69|-|2885.93|-|0.88269675722194829 +AAAAAAAAKPEAAAAA|-|New details sit intermittently museums. Free, concerned things used to secure attempts. European members may watch with a p|-|Sports|-|football|-|84.33|-|1898.95|-|0.58081693150097844 +AAAAAAAALDPCAAAA|-|Successive, joint|-|Sports|-|football|-|4.67|-|8794.75|-|2.68998115185667349 +AAAAAAAALHDBAAAA|-|Democrats take before. Joint years woul|-|Sports|-|football|-|65.80|-|7526.32|-|2.30201642375757341 +AAAAAAAALHEAAAAA|-|Hours take so. Now new things want common, recent drugs. Ships will st|-|Sports|-|football|-|3.32|-|12476.95|-|3.81622676399648907 +AAAAAAAALMIDAAAA|-|Quiet, small objectives should stay as matches. In particular formal students allow then. Professional, other demands drop|-|Sports|-|football|-|1.58|-|2166.42|-|0.66262588100916280 +AAAAAAAAMABAAAAA|-|Nice stories care substantially for a corporations. Trains must get under more important trials. Main rises may not lose big goal|-|Sports|-|football|-|2.48|-|797.50|-|0.24392506536350631 +AAAAAAAAMDLAAAAA|-|Voluntary parties could draw thus only performances. Small, economic payments buil|-|Sports|-|football|-|2.26|-|2085.12|-|0.63775928813887683 +AAAAAAAAMEPDAAAA|-|Major, grateful charts talk system|-|Sports|-|football|-|0.19|-|10917.47|-|3.33924085687036892 +AAAAAAAAMGICAAAA|-|Probably traditional legs take. Still local results may not respect onto a councillors. Favorite, different elements should pose more efforts. Like long-term cars think weeks. Predominantly available |-|Sports|-|football|-|2.80|-|5090.47|-|1.55698210342441123 +AAAAAAAAMLEBAAAA|-|Secret, desirable forces begin only. Available times cope in particular early wide roads. Particularly equal de|-|Sports|-|football|-|1.54|-|9296.66|-|2.84349642402795556 +AAAAAAAAMNFCAAAA|-|Dangerous, evolutionary materials mu|-|Sports|-|football|-|8.92|-|11167.25|-|3.41563910492867188 +AAAAAAAAMNHCAAAA|-|Afterwards written skills influence; english, level departments like just. Really legal rocks would |-|Sports|-|football|-|4.68|-|13366.92|-|4.08843490245612507 +AAAAAAAANIEAAAAA|-|Very questions make secret stocks. Aggressive, major years qualify for example senio|-|Sports|-|football|-|4.39|-|13157.26|-|4.02430784389297431 +AAAAAAAAOCEAAAAA|-|Both possible men can need early in the doubts. Churches will keep soon into a authorities. Letters draw|-|Sports|-|football|-|9.87|-|13238.84|-|4.04926007816551957 +AAAAAAAAOEDBAAAA|-|Confidential companies can write highly; potentially new children mix sympathetically military, economic gains. Various, traditional designers make in a measurements. Individuals tell only se|-|Sports|-|football|-|0.98|-|9058.77|-|2.77073487694416306 +AAAAAAAAOHIAAAAA|-|Issues neglect other periods. Special|-|Sports|-|football|-|95.82|-|4714.66|-|1.44203604848490113 +AAAAAAAAOIPBAAAA|-|Really different purposes answ|-|Sports|-|football|-|5.00|-|2910.25|-|0.89013532473246926 +AAAAAAAAONAEAAAA|-|Historical marks could not reach widely for the relationships; southern, open eyebrows talk in reply to a cars. Here single systems shall improve both how|-|Sports|-|football|-|8.94|-|4921.08|-|1.50517211367905157 +AAAAAAAAAANBAAAA|-|Initiatives get clearly hands; priva|-|Sports|-|golf|-|1.22|-|5341.18|-|2.13466445152902328 +AAAAAAAAABLBAAAA|-|Indeed russian letters participate better legal minds. Fat, sexual appointments discuss sometimes for the ages. Cold personnel provide however to the proposals. U|-|Sports|-|golf|-|2.37|-|555.30|-|0.22193207679465336 +AAAAAAAAACMCAAAA|-|Origins could allow industrial muscles; serv|-|Sports|-|golf|-|0.84|-|15846.89|-|6.33339313602813681 +AAAAAAAAAFJCAAAA|-|General muscles get now with a hearts. Eyes promote to the resources. Other products use through a methods. Great, emotional meetings ought to go black, glorious years. For instance|-|Sports|-|golf|-|4.56|-|11581.04|-|4.62849677407158714 +AAAAAAAAAGKBAAAA|-|Likely, various days develop no longer. Officials say before agricultural, rare ho|-|Sports|-|golf|-|4.85|-|4797.20|-|1.91725654384893048 +AAAAAAAAAGNAAAAA|-|Payable islands see reasonably here useful suggestions. Wise, constant parts extract on a areas. In order necessary men could not leave. Private, personal children could ask now western|-|Sports|-|golf|-|8.04|-|5686.94|-|2.27285144031439938 +AAAAAAAAAKMDAAAA|-|Impressive problems decide more british students. Proposed homes shall not mention very proper, personal things. Plants ought to know else by a stars. Burning sets m|-|Sports|-|golf|-|1.95|-|1739.44|-|0.69518734316530135 +AAAAAAAAAPGBAAAA|-|Significant, light sales must see with a systems; dramatic visitors shall not share a little positively busy things. Forward welsh acts let public edges. Nation|-|Sports|-|golf|-|2.13|-|1388.88|-|0.55508197878364516 +AAAAAAAABEEBAAAA|-|Educational terms must apply automatic, other objectives. Indeed financial sources pass very unacceptabl|-|Sports|-|golf|-|6.99|-|5660.14|-|2.26214050990183552 +AAAAAAAABPHCAAAA|-|More black mothers shall repea|-|Sports|-|golf|-|14.90|-|4012.40|-|1.60360213385713513 +AAAAAAAACGKCAAAA|-|Capital risks should focus woods. Large teachers will prevent at all classical, commercial boys; journalists look almost in a ideas; relat|-|Sports|-|golf|-|1.82|-|5015.65|-|2.00456261655880267 +AAAAAAAACLNCAAAA|-|Directly other photographs assure. Friends dare. Centres would try now both similar managers; medical moves show particular, urban circumstances; english, essential act|-|Sports|-|golf|-|1.75|-|3697.68|-|1.47782064059437031 +AAAAAAAADJICAAAA|-|Stairs say long words. Newspapers will go exceedingly. Other, empty numbers must not provide therefore environmental months. Entirely bare groups buy. New days|-|Sports|-|golf|-|20.77|-|15795.84|-|6.31299041223853290 +AAAAAAAAEIPBAAAA|-|Industries give much proposals. Possible, strong goals ought to live most total criteria. The|-|Sports|-|golf|-|0.87|-|2388.22|-|0.95447978469750954 +AAAAAAAAEKPDAAAA|-|Mainly catholic activities could assume just fat, o|-|Sports|-|golf|-|5.83|-|4809.38|-|1.92212442192449122 +AAAAAAAAENADAAAA|-|Slowly italian horses can know either commercial, wild schools; reliable, proper features might tell economic stages; particularly select regions lose legally present|-|Sports|-|golf|-|8.82|-|3397.68|-|1.35792216582686444 +AAAAAAAAENGDAAAA|-|Select, general goals clean national tests. Conservatives develop rates. Ter|-|Sports|-|golf|-|0.98|-|6129.30|-|2.44964573797491236 +AAAAAAAAEPAEAAAA|-|Models feel figures. Homes get still at the positions. Political, other makers will make there in the servants; necessary, technical markets should not cope also; warm, |-|Sports|-|golf|-|4.64|-|2329.43|-|0.93098368025890397 +AAAAAAAAFCFEAAAA|-|Judicial models should not pick. Close dogs can refuse exactly. European, r|-|Sports|-|golf|-|5.70|-|4632.74|-|1.85152819998138376 +AAAAAAAAFIJAAAAA|-|Pages could watch fundamental, literary components. Financial, royal elements should overcome environmental trustees. Shared areas |-|Sports|-|golf|-|3.07|-|14343.38|-|5.73249795003582766 +AAAAAAAAFOBCAAAA|-|Demands could treat lines. Conditions suck studies. Documents could not hide local things; gold calls see together. Preferences may refuse indeed in a pieces. Old, unknown boys emerge more opposite, |-|Sports|-|golf|-|2.87|-|2407.29|-|0.96210133107689733 +AAAAAAAAGCBCAAAA|-|Safe, high opinions ought to amend simply. Particular levels may not live partly likely, broad targets. Always lar|-|Sports|-|golf|-|4.99|-|4685.71|-|1.87269827400949972 +AAAAAAAAGMBDAAAA|-|Poor years produce questions. Marine events ensure inner systems. Individuals could kill to a managers. Drugs should not authorise thankfully traditional, strong holders. Just amazing injuri|-|Sports|-|golf|-|3.38|-|1530.85|-|0.61182193365945452 +AAAAAAAAGOPDAAAA|-|International, difficult boys lend better to the leaves. Here high governments bear in a countries; closely common images afford in public efforts.|-|Sports|-|golf|-|8.90|-|432.62|-|0.17290159384639463 +AAAAAAAAHCABAAAA|-|Wishes might behave environmental regions. Statements conflict now nuclear|-|Sports|-|golf|-|7.46|-|11204.96|-|4.47819204610304179 +AAAAAAAAHLDBAAAA|-|Horses say. Other peasants can keep at first large kilometres. Necessarily new miles separate for an poems; interestingly indian teeth used to make further.|-|Sports|-|golf|-|3.40|-|4693.00|-|1.87561180694635011 +AAAAAAAAIALAAAAA|-|In general specific branches must attract now desperately economic letters. Organi|-|Sports|-|golf|-|3.62|-|21044.66|-|8.41074212000246671 +AAAAAAAAIGIDAAAA|-|Red enterprises find forward from the heads. More growing bank|-|Sports|-|golf|-|2.10|-|6054.93|-|2.41992290608004766 +AAAAAAAAIKJCAAAA|-|Full, important friends must come such as|-|Sports|-|golf|-|4.14|-|3066.76|-|1.22566615492665431 +AAAAAAAAILKDAAAA|-|Teeth should focus more top, decent girls; projects seek only wh|-|Sports|-|golf|-|3.21|-|11481.06|-|4.58853860904740302 +AAAAAAAAINAEAAAA|-|Never straightforward fingers might find then old, senior towns. Now old papers get|-|Sports|-|golf|-|0.63|-|2444.12|-|0.97682086716252146 +AAAAAAAAKDHDAAAA|-|Human problems take then disastrous babies. Supporters use young, effective years. New things should |-|Sports|-|golf|-|7.25|-|1083.81|-|0.43315721979256844 +AAAAAAAAKMBDAAAA|-|Here german thanks trust further remarkable towns. Other years|-|Sports|-|golf|-|3.32|-|4085.24|-|1.63271348353068556 +AAAAAAAAKMJAAAAA|-|Collective, important matters ask generally then beautif|-|Sports|-|golf|-|9.15|-|799.66|-|0.31959338110861247 +AAAAAAAAMJDBAAAA|-|Deeply central residents should not use less little, other miles. Pleased, able schools fall very conditions; significantly strong companies encompass. Almost corporate machines pr|-|Sports|-|golf|-|2.77|-|8770.37|-|3.50517995382230143 +AAAAAAAAMOCBAAAA|-|Women shall aim later human ministers. Separate, basi|-|Sports|-|golf|-|4.75|-|11.02|-|0.00440427063979305 +AAAAAAAAMPJBAAAA|-|Also new opportunities shall not|-|Sports|-|golf|-|3.76|-|18209.57|-|7.27766556390710602 +AAAAAAAAMPMCAAAA|-|Impossible members go so free, partial rats. Facilities release equally. Bars say now in the countries. Never severe occupations argue |-|Sports|-|golf|-|2.07|-|1250.04|-|0.49959296466124345 +AAAAAAAANGBCAAAA|-|Certainly persistent players move often respective minutes; amer|-|Sports|-|golf|-|7.78|-|7916.02|-|3.16372908076357264 +AAAAAAAANMHCAAAA|-|Impossible, natural cases may wait then products. Political sectors go here sure consultants. Me|-|Sports|-|golf|-|2.14|-|1598.83|-|0.63899092804177135 +AAAAAAAANOGBAAAA|-|Classical, small perceptions finance again ideas. Obligations determine. Clear, useful crowds could take thus formal, genetic individuals. Int|-|Sports|-|golf|-|0.68|-|3276.69|-|1.30956711095312933 +AAAAAAAAOFDEAAAA|-|Nations may take certainly only apparent cases. New connections might worry most unknown proceedings. Shops hide p|-|Sports|-|golf|-|4.25|-|2191.60|-|0.87589832433488619 +AAAAAAAAPEOBAAAA|-|Sales include easier from the times. Significant, young features should not keep hardly social|-|Sports|-|golf|-|4.30|-|9357.12|-|3.73968138738841499 +AAAAAAAAPJLCAAAA|-|Likely, exciting negotiations disrupt even communications; all normal girls may think about years; allegedly old hands end darkly musical years. Individual, similar |-|Sports|-|golf|-|4.26|-|869.00|-|0.34730591524320866 +AAAAAAAAPNFBAAAA|-|Basic differences stem |-|Sports|-|golf|-|0.88|-|2598.05|-|1.03834077456572872 +AAAAAAAAACGAAAAA|-|Technical, new gr|-|Sports|-|guns|-|73.57|-|10767.60|-|4.24019619039188146 +AAAAAAAAAHPAAAAA|-|Str|-|Sports|-|guns|-|0.71|-|6887.96|-|2.71242447263751103 +AAAAAAAAAIBBAAAA|-|P|-|Sports|-|guns|-|3.56|-|3837.81|-|1.51129939275677649 +AAAAAAAAAOGCAAAA|-|Also great dreams allow normal years. Above mean candidates jump concerned, other bones; hospitals need normal occasions. Comprehensive stores will estimate|-|Sports|-|guns|-|6.90|-|20488.18|-|8.06808413983275175 +AAAAAAAACBCDAAAA|-|Cars may regard even coming, steady blocks. Level results bring finally willing feet; full, ethical terms reveal years. Local shares avoid both. Faint plants may draw now re|-|Sports|-|guns|-|2.47|-|3757.11|-|1.47952036748051950 +AAAAAAAADDFCAAAA|-|Again dull trials ensure suddenly; communities should produce terms. Too extra notes might choose properly social, absolute talks|-|Sports|-|guns|-|6.99|-|11612.96|-|4.57309230944437978 +AAAAAAAADKLBAAAA|-|Only other packages shall not lift procedures. Available, only types result obviously rough parts. Deep, back boundaries assert english, blue police; findings will declare restaurants. Little, daily s|-|Sports|-|guns|-|2.81|-|6447.61|-|2.53901810608980634 +AAAAAAAADMJBAAAA|-|Complicated, right projects forget naturally british, true weapons. Employers step also as continuous tickets. Ev|-|Sports|-|guns|-|5.02|-|5197.04|-|2.04655347610555960 +AAAAAAAAEHJCAAAA|-|Almost positive couples draw into a orders. Glasses adopt shortly mathematical years. Ever big women set details. Successful, joint factors shall allow never at all overseas deals. Topics would use n|-|Sports|-|guns|-|0.19|-|5483.13|-|2.15921346794303624 +AAAAAAAAEOAEAAAA|-|Days could murder entirely so medical values. Shadows ought to think important characteris|-|Sports|-|guns|-|3.80|-|9540.53|-|3.75698567557482232 +AAAAAAAAEOEAAAAA|-|Activities would not serve weak, slow years; reasonable activities get rar|-|Sports|-|guns|-|8.80|-|2734.48|-|1.07681671669664475 +AAAAAAAAEPIBAAAA|-|Cult|-|Sports|-|guns|-|4.23|-|17310.10|-|6.81658123215038701 +AAAAAAAAFJLAAAAA|-|Other aspects might appear quite good|-|Sports|-|guns|-|0.21|-|3505.50|-|1.38043832845004833 +AAAAAAAAFKFCAAAA|-|Strong chips meet to a connections; necessary, suprem|-|Sports|-|guns|-|2.74|-|885.99|-|0.34889589348836352 +AAAAAAAAGEDBAAAA|-|Little thousa|-|Sports|-|guns|-|6.47|-|2761.01|-|1.08726402203219739 +AAAAAAAAGHFBAAAA|-|Almost busy pounds lose at last for an factors. Good mothers would|-|Sports|-|guns|-|6.73|-|3264.94|-|1.28570769250882921 +AAAAAAAAHCLCAAAA|-|Major, late transactions ought to determine interested, industrial group|-|Sports|-|guns|-|3.27|-|9530.14|-|3.75289417529452108 +AAAAAAAAHMCBAAAA|-|Films exclude british, young members; spots decide other, poor agents. Black, |-|Sports|-|guns|-|7.63|-|2129.10|-|0.83842283414719666 +AAAAAAAAIDBCAAAA|-|Especially normal books go therefore. Afraid books plead quickly windows. Even general readers may|-|Sports|-|guns|-|7.69|-|10509.62|-|4.13860569546290029 +AAAAAAAAIKEAAAAA|-|Magnificent, compulsory topics must move physically otherwise happy allegations. Blue, slow operations can see thousands; ev|-|Sports|-|guns|-|4.55|-|19745.96|-|7.77580374156083766 +AAAAAAAAIKNBAAAA|-|Teachers tell high so other others. American beliefs die far imperial neighbours. Provincial, common players would play at least english applications. Mos|-|Sports|-|guns|-|0.41|-|792.00|-|0.31188337074096086 +AAAAAAAAJJDBAAAA|-|Institut|-|Sports|-|guns|-|48.91|-|105.04|-|0.04136392583665471 +AAAAAAAAJLEBAAAA|-|Golden, royal counties work then jobs. Patterns would take efficiently compl|-|Sports|-|guns|-|42.09|-|5141.36|-|2.02462713004134660 +AAAAAAAAKEEEAAAA|-|Biological thanks move effectively. Tickets could reach rapidly confident, social areas. Social bodies want; apparently white rivers take questions; only, capabl|-|Sports|-|guns|-|0.58|-|23915.15|-|9.41759797193900254 +AAAAAAAAKFPCAAAA|-|Round prisoners go at all into a lives. Streets find again places. Kindly liable men offer plainly on a contents. Early accurate regions should no|-|Sports|-|guns|-|2.79|-|1476.10|-|0.58127657013981353 +AAAAAAAAKINBAAAA|-|All attractive ways develop originally lucky sites. New, single sounds might excuse enough senior savings. Other bacteria live across a concerns. Dark minutes s|-|Sports|-|guns|-|5.96|-|8841.98|-|3.48190217982848620 +AAAAAAAALHLCAAAA|-|Literary arms keep most royal patterns. Fields send; mass rates can deny at a firms. Usually early we|-|Sports|-|guns|-|6.12|-|3059.69|-|1.20488185684647793 +AAAAAAAALKBAAAAA|-|Alone, fortunate minutes can put particularly out of a consequences. Darling costs run already in a laws. Molecules discover. Temporary, political ty|-|Sports|-|guns|-|5.47|-|1433.73|-|0.56459159738944168 +AAAAAAAALKKDAAAA|-|Good definitions deliver a bit international childre|-|Sports|-|guns|-|4.27|-|3041.28|-|1.19763214364528969 +AAAAAAAAMGEDAAAA|-|Fields divorce hardl|-|Sports|-|guns|-|4.38|-|1239.45|-|0.48808566144556052 +AAAAAAAAMKABAAAA|-|Highly consi|-|Sports|-|guns|-|2.11|-|2568.71|-|1.01153779451516864 +AAAAAAAAMNAAAAAA|-|About amazing operators must not think recently broad worried others. Protective servants used to benefit bad drugs. Men shoul|-|Sports|-|guns|-|6.31|-|2645.85|-|1.04191491979163040 +AAAAAAAAMOBCAAAA|-|Women know. Once again wide residents might recover also with a charges; issues shall go all black drinks. Also english managers might not walk with a ti|-|Sports|-|guns|-|3.20|-|9341.65|-|3.67866829581098104 +AAAAAAAAODBBAAAA|-|Matters reserve more proper, concerned birds. True months result together more chemical columns. Social views reduce in a affairs. Medieval, serious sports may n|-|Sports|-|guns|-|2.52|-|1151.00|-|0.45325474712480549 +AAAAAAAAOGDCAAAA|-|Hours may consider merely negotiations.|-|Sports|-|guns|-|3.73|-|984.27|-|0.38759778449394639 +AAAAAAAAOJFDAAAA|-|In order national clothes might ensure less similar masses. Holy holes could bear human police; most little governments would go very political, proper beliefs. |-|Sports|-|guns|-|94.53|-|3664.64|-|1.44310640877797322 +AAAAAAAAOMBCAAAA|-|More than great events open to a ministers. Properly labour |-|Sports|-|guns|-|0.46|-|17588.90|-|6.92637047932536162 +AAAAAAAAOPNCAAAA|-|Legal, independent teachers cut. Perhaps common wives might carry already states. Courts rally regions. Besides financial ways could not suffer notably political|-|Sports|-|guns|-|4.59|-|2998.24|-|1.18068333016461929 +AAAAAAAAPGHDAAAA|-|In full possible products bear to a components. Lovely boards help alongside at the possibilities. True, dry papers should disagree into a c|-|Sports|-|guns|-|0.52|-|6632.30|-|2.61174757546120541 +AAAAAAAAPOBEAAAA|-|Resources go in a records. Permanent, flat applications would work|-|Sports|-|guns|-|7.43|-|922.97|-|0.36345832663230384 +AAAAAAAACOPBAAAA|-|Difficult aspects pass problems; small, free days steer branches. Ago electric parents must want almost guests. Hands can remedy tomorrow cold patients. Limitations shall not make; heavy s|-|Sports|-|hockey|-|6.33|-|2590.96|-|1.36102091487021564 +AAAAAAAADECEAAAA|-|Groups shall not find socially widespread, fresh sets. Families will take most significant relationships. Suddenly human kids show well services; so other neighbours might contain. Studies obta|-|Sports|-|hockey|-|2.29|-|511.16|-|0.26851030152725609 +AAAAAAAADGAEAAAA|-|All british ways trap stages. Accidents welcom|-|Sports|-|hockey|-|3.21|-|1634.85|-|0.85878015973831014 +AAAAAAAAEAAEAAAA|-|Progressive rights will not set just other laws. Possible contracts hold especially rich schools. Significant, african areas must say recent, nervous cases. |-|Sports|-|hockey|-|6.93|-|447.66|-|0.23515400575493282 +AAAAAAAAEBBBAAAA|-|Directly primary years ought to replace ago potential videos. Unpleasant, local expenses should work socially likely questions. Likely, po|-|Sports|-|hockey|-|9.45|-|1488.96|-|0.78214472682139295 +AAAAAAAAEDJBAAAA|-|Most massive clients hel|-|Sports|-|hockey|-|0.80|-|97.85|-|0.05140021324916270 +AAAAAAAAELABAAAA|-|Glorious organizations ought to talk above versions. Constant, new laws shall go no longer international films. Local, complete standards may show partly still exact |-|Sports|-|hockey|-|0.98|-|2314.01|-|1.21554018866320889 +AAAAAAAAFALAAAAA|-|Military, special factors may adopt often young names. Actually large-scale workers make here advantages. Precious, odd customers study in the careers; usual women win then firms. S|-|Sports|-|hockey|-|3.48|-|1091.14|-|0.57317147352776079 +AAAAAAAAFIKCAAAA|-|Parts work only windows. Positive, vital eyes could happen without a minds; common payments must not investigate only important seeds. Here different|-|Sports|-|hockey|-|8.94|-|4314.87|-|2.26658393604920469 +AAAAAAAAGBOBAAAA|-|Pale, specialist limits look fair dead, english trees. Poorly medical shares find closely; just routine companies take completely even easy theories. Perhaps high counties issu|-|Sports|-|hockey|-|7.31|-|3476.16|-|1.82601293089636614 +AAAAAAAAGCPDAAAA|-|Therefore final books see between a marke|-|Sports|-|hockey|-|1.92|-|6724.90|-|3.53256304628813767 +AAAAAAAAGKCBAAAA|-|Good others cover civil pupils. Valuable ideas should not remov|-|Sports|-|hockey|-|8.33|-|13968.93|-|7.33782300319495531 +AAAAAAAAGMBEAAAA|-|Automatically big banks must struggle so so good levels. Strong, clear families please to the soldiers; most chemical daughters would continue sometimes. Com|-|Sports|-|hockey|-|4.23|-|11606.04|-|6.09660634622700372 +AAAAAAAAHIDBAAAA|-|Main months answer weapons. Little, norma|-|Sports|-|hockey|-|1.15|-|2511.54|-|1.31930190683497290 +AAAAAAAAIEODAAAA|-|Women should hear among a pages. Everywhere main techniques go just unlikely principles. Broad, willing differences can make also short, modern roots. Together sorry thoug|-|Sports|-|hockey|-|9.62|-|1154.25|-|0.60632290386148239 +AAAAAAAAIFDEAAAA|-|Level, high comparisons lift sure associations. Long possible examples introduce just huge children. Theorie|-|Sports|-|hockey|-|5.35|-|4956.24|-|2.60349302926959798 +AAAAAAAAIHPBAAAA|-|New, gastric companies make ago at the cases. Only, new children may get greatly even adverse practices; here black fields might protect independent resources. Extra objectives oug|-|Sports|-|hockey|-|4.29|-|18476.06|-|9.70540034751481939 +AAAAAAAAIIAEAAAA|-|Followe|-|Sports|-|hockey|-|2.09|-|10463.09|-|5.49621928712500563 +AAAAAAAAIIPBAAAA|-|Careful, general groups will catch obliga|-|Sports|-|hockey|-|3.84|-|11357.02|-|5.96579713719985506 +AAAAAAAAIKDBAAAA|-|Dependent|-|Sports|-|hockey|-|9.63|-|938.50|-|0.49299029263504546 +AAAAAAAAJBHCAAAA|-|Then suspicious authorities can advertise perhaps important massive mammals. Easy lawyers will put. Respectively responsible pounds might acknowledge ti|-|Sports|-|hockey|-|4.00|-|2313.45|-|1.21524602290521675 +AAAAAAAAJIMCAAAA|-|Flights might work bits. Appropriate powers ought to lie just very parental pounds|-|Sports|-|hockey|-|3.03|-|null|-|null +AAAAAAAAJNLBAAAA|-|Little hearts must not get here. Best professional hospitals achieve there foreign shoulders. Women should not forestall certainly able deals. Projects sound years. Facilities shall find dry, |-|Sports|-|hockey|-|47.20|-|6105.43|-|3.20715793538922280 +AAAAAAAAKAEAAAAA|-|Only different attacks tell a|-|Sports|-|hockey|-|9.83|-|3300.15|-|1.73355558256744302 +AAAAAAAAKMDDAAAA|-|Strong settlements should close here. Forms may seem quickly other unions. Places employ difficult banks. Women must not accept too areas. Vast possibilities know; never healthy subjects cancel most j|-|Sports|-|hockey|-|32.21|-|12639.38|-|6.63941571116200412 +AAAAAAAAKOHBAAAA|-|Blue teams want otherwise new, advanced males. Primary documents happen at all very low tears. Principles cope for an girls. Central situations stop human, other students. Things thi|-|Sports|-|hockey|-|0.14|-|5893.50|-|3.09583195486908941 +AAAAAAAAKPLBAAAA|-|Immediately important patterns might go. Well international roads might launch however natural developers. Contemporary members find cert|-|Sports|-|hockey|-|2.06|-|9506.95|-|4.99396277311320770 +AAAAAAAAKPNAAAAA|-|Legal, professional eyes address only. Seconds stand literally. Sides might contribute within a contracts. German bags care just others. Political, br|-|Sports|-|hockey|-|5.83|-|218.69|-|0.11487698145589568 +AAAAAAAALLPDAAAA|-|Forces trust together from the systems. Reasons exploit even mar|-|Sports|-|hockey|-|3.36|-|9056.43|-|4.75730642080852929 +AAAAAAAALMPCAAAA|-|Annual priests look often practical genes. Needs may n|-|Sports|-|hockey|-|0.72|-|2288.09|-|1.20192451643614402 +AAAAAAAAMCCBAAAA|-|Over normal dreams hear already future, domestic commentators. Years can retain more also important states; orders must pick. Certain practitioners might not portra|-|Sports|-|hockey|-|7.83|-|5753.13|-|3.02209615585238048 +AAAAAAAAMCIDAAAA|-|Thin, nuclear links lay relations. Only theories might blame ideas. There other readers could hear errors. P|-|Sports|-|hockey|-|4.01|-|2998.46|-|1.57507903340914055 +AAAAAAAAMDLCAAAA|-|As public organizations rest still sure services. Other |-|Sports|-|hockey|-|1.83|-|1874.20|-|0.98450975648013021 +AAAAAAAAMHJBAAAA|-|Structu|-|Sports|-|hockey|-|1.02|-|3803.26|-|1.99783725132356206 +AAAAAAAAMJNDAAAA|-|Terms could include tory rates. Able, progressive offences may take secondly strong provisions. Specific, specific |-|Sports|-|hockey|-|1.54|-|689.07|-|0.36196571224936683 +AAAAAAAAMPHBAAAA|-|Australian, heavy employees might not practise very now little workers. Popular arrangements advertise as pictures. Rules receive notabl|-|Sports|-|hockey|-|3.19|-|6030.42|-|3.16775548269816818 +AAAAAAAANACBAAAA|-|As national managers shall respect years. Other police could not consider. Therefore true bodies continue in the factors. Special relations would reach on |-|Sports|-|hockey|-|3.94|-|9509.71|-|4.99541259006331183 +AAAAAAAANMPDAAAA|-|Tonight certain authorities hang with a cattle. Internationa|-|Sports|-|hockey|-|0.61|-|8264.35|-|4.34122996796850073 +AAAAAAAAAAEAAAAA|-|Rights achieve now flat, small discussions. Clear allegations used to wait more in a programmes. Right attacks place worldwide possible proposals. Beautiful services go loy|-|Sports|-|optics|-|1.16|-|2854.21|-|1.32449387661553510 +AAAAAAAAACEBAAAA|-|At least clear environments used to demons|-|Sports|-|optics|-|35.87|-|1050.99|-|0.48771107220006980 +AAAAAAAAACFDAAAA|-|Late global concepts shall understand very quiet, upper heads. Already english buildings make women. Others try. Please minimal agreements conflict largely forthcoming police. |-|Sports|-|optics|-|8.96|-|728.14|-|0.33789278690735290 +AAAAAAAAAJKAAAAA|-|Religious topics sit with a initiatives. Arts mus|-|Sports|-|optics|-|0.72|-|125.40|-|0.05819177009666006 +AAAAAAAABKPCAAAA|-|Solid police must lift increasingly western girls. However central days choose widely over a drivers. Able years release commonly christian, aware muscles; sometimes important|-|Sports|-|optics|-|2.47|-|9019.12|-|4.18531545067136086 +AAAAAAAACEKDAAAA|-|Examples aim scarce. Tasks feel in terms of a police. Democrats agree |-|Sports|-|optics|-|8.42|-|1725.70|-|0.80080971017389362 +AAAAAAAACFEAAAAA|-|Patients study out of the bones. Personal, main acres reflect never nat|-|Sports|-|optics|-|52.36|-|1709.70|-|0.79338492292073125 +AAAAAAAACNBAAAAA|-|Proud surfaces see sound, possible failures. Effective, clear executives could see very; discreetly local friends might not attend young fields. T|-|Sports|-|optics|-|4.64|-|9583.79|-|4.44735011431156050 +AAAAAAAADIDCAAAA|-|Identical solicitors must maintain sources. Factors take already unusual minutes. Just various sales sell agricultural, long states. |-|Sports|-|optics|-|3.77|-|5534.75|-|2.56839632809002592 +AAAAAAAADJDEAAAA|-|New hotels join increases. Agencies might not prov|-|Sports|-|optics|-|40.19|-|2085.39|-|0.96772356811701687 +AAAAAAAAECNBAAAA|-|Eyes should not go more awkward attitudes. Councils help ever local, simple blacks; extreme resources can relax today from a police. Usually ordinary times could grasp governments. Suddenly eng|-|Sports|-|optics|-|1.91|-|9633.90|-|4.47060361989005839 +AAAAAAAAEHNCAAAA|-|Cruelly shared examples shall not investigate then in vit|-|Sports|-|optics|-|0.55|-|13131.95|-|6.09387093557284716 +AAAAAAAAEJAEAAAA|-|Great weeks cannot die political sh|-|Sports|-|optics|-|2.41|-|0.00|-|0E-17 +AAAAAAAAENMCAAAA|-|Organisms need also men. Secondary, likely hands may fight ever similar persons. Small arms|-|Sports|-|optics|-|9.57|-|6198.11|-|2.87622800760613768 +AAAAAAAAGELBAAAA|-|Old eyes know. Small companies could demonstrate most great bishops. Very previous miles believe public rebels. Here detailed years must not help once more from the firms. International, unk|-|Sports|-|optics|-|12.58|-|5896.14|-|2.73609906967879767 +AAAAAAAAGEMBAAAA|-|Also difficult women shall not appear once white noble limits. Always significant miners would fit now in a ministers. Territories provide faintly pretty|-|Sports|-|optics|-|4.04|-|281.68|-|0.13071337959192348 +AAAAAAAAGLNBAAAA|-|Grounds stop obviously only living children. Large, red standards dust just between the years. Small concessions could go now between a differences. Very possible representatives shall hear only|-|Sports|-|optics|-|1.21|-|6336.47|-|2.94043385537785926 +AAAAAAAAHKEEAAAA|-|Bombs shall not help. Angles pull sometimes. Measures train still african pictures. Teachers wear by the motives. Attractive months shall give |-|Sports|-|optics|-|0.92|-|1156.44|-|0.53664506069044303 +AAAAAAAAINLCAAAA|-|Full, bright roles c|-|Sports|-|optics|-|2.37|-|3378.16|-|1.56763245669643651 +AAAAAAAAIOPAAAAA|-|Deep n|-|Sports|-|optics|-|5.04|-|4968.25|-|2.30551245440774584 +AAAAAAAAKBOAAAAA|-|Massive|-|Sports|-|optics|-|0.47|-|7523.86|-|3.49144123891113824 +AAAAAAAAKCNBAAAA|-|Neighbours may occur police. Important benefits must tell; successful products join only local years. Real materials must de|-|Sports|-|optics|-|0.26|-|1093.33|-|0.50735891546875072 +AAAAAAAAKFFCAAAA|-|Gently large days persuade private, comprehensive indicat|-|Sports|-|optics|-|3.31|-|9676.14|-|4.49020505823840704 +AAAAAAAAKFIDAAAA|-|Black, different |-|Sports|-|optics|-|2.92|-|1134.60|-|0.52651022608987640 +AAAAAAAAKHPDAAAA|-|Reasons convert. Elderly nerves ought to ind|-|Sports|-|optics|-|1.68|-|7020.21|-|3.25772285765768659 +AAAAAAAAKJNAAAAA|-|Often handsome measures intend yesterday. Farmers shall not stay merely easy entries. O|-|Sports|-|optics|-|4.14|-|9231.01|-|4.28364283636339675 +AAAAAAAAKLNBAAAA|-|Then successful minutes cannot plan really. Well pos|-|Sports|-|optics|-|5.80|-|994.06|-|0.46129275105491145 +AAAAAAAAMGJCAAAA|-|Sections find actually tonight previous sides. Concerned, helpful ideas cannot mean on the solicitors. Only satisfied bodies change centur|-|Sports|-|optics|-|3.23|-|5947.71|-|2.76003008709414663 +AAAAAAAAMHNCAAAA|-|Initially local categories c|-|Sports|-|optics|-|6.18|-|15088.98|-|7.00202914795136894 +AAAAAAAAMJMBAAAA|-|Simply recent expenses might not care too for a results. Socially slight members wou|-|Sports|-|optics|-|2.43|-|3077.40|-|1.42806501830511690 +AAAAAAAAMMEEAAAA|-|Even little women should not believe yet historical aims. Possible, |-|Sports|-|optics|-|0.50|-|4138.00|-|1.92023560334911735 +AAAAAAAAMOJAAAAA|-|Now early troubles require by a years. Services should stay both alive effects. Difficult, able rates creep friends. Then high result|-|Sports|-|optics|-|2.11|-|13270.49|-|6.15816031220116681 +AAAAAAAANFCCAAAA|-|Physical, nationa|-|Sports|-|optics|-|52.14|-|8418.19|-|3.90645436291868201 +AAAAAAAANFDEAAAA|-|Rules share briefly ago specific subsidies. Maybe new subjects should scor|-|Sports|-|optics|-|1.12|-|8498.07|-|3.94352261328009513 +AAAAAAAANHEEAAAA|-|Exchanges see with a costs. Possible controls achieve yet high similar machines. Rights would not sum suit|-|Sports|-|optics|-|4.85|-|3637.16|-|1.68782120035700233 +AAAAAAAANIBDAAAA|-|Legal, local prices ask central instruments. Structures cover for a parents. International tourists should |-|Sports|-|optics|-|1.84|-|5826.17|-|2.70362954692231199 +AAAAAAAANJMDAAAA|-|Wings can go yellow, expected eyes.|-|Sports|-|optics|-|8.93|-|1712.15|-|0.79452184346887174 +AAAAAAAANPBCAAAA|-|Hot grounds shall pass. Impressive methods could change very basic voices. Concrete, desirable centres pay again in a ingredients. Positio|-|Sports|-|optics|-|1.04|-|10200.24|-|4.73341324569980685 +AAAAAAAAOANBAAAA|-|Peculiar, ordinary teachers try mutually rather essential responsibilities. Then leading customers treat relatively literary families. Roles mig|-|Sports|-|optics|-|3.24|-|7.94|-|0.00368455067438182 +AAAAAAAAOBEAAAAA|-|Grey, available points fall little rig|-|Sports|-|optics|-|4.02|-|5217.29|-|2.42107926800321809 +AAAAAAAAOHABAAAA|-|Common seconds endorse capital directors; practical problems may not see ideas. National, strategic soldiers used to decide a|-|Sports|-|optics|-|2.93|-|4700.26|-|2.18115190840930940 +AAAAAAAAOKNBAAAA|-|Miles shall not predict from a |-|Sports|-|optics|-|5.14|-|87.32|-|0.04052077643413362 +AAAAAAAAOLFEAAAA|-|Manufacturers ought to remain then regular sales|-|Sports|-|optics|-|0.09|-|1425.30|-|0.66140932949577017 +AAAAAAAAONIDAAAA|-|Technologies should agree immediately bad, particular issues. Beautifully good problems must look then buildings. Equally only services coul|-|Sports|-|optics|-|2.05|-|278.46|-|0.12921914115722456 +AAAAAAAAOODEAAAA|-|White, new losses arouse vast, sensitive workshops; economic, genera|-|Sports|-|optics|-|0.25|-|1891.76|-|0.87786972087765255 +AAAAAAAAAHCBAAAA|-|Dutch, busy firms must not return thereof full, naval plants. Parts shall get ashore early politicians. Good organisms try rather also close boys. Positive, big ingredients foster greatly local grou|-|Sports|-|outdoor|-|4.44|-|11184.00|-|4.14819593163755301 +AAAAAAAAANICAAAA|-|Experienced|-|Sports|-|outdoor|-|2.06|-|9159.79|-|3.39740733303418649 +AAAAAAAAAOFEAAAA|-|Educational, top boundaries used to appease then satisfied, helpful books. Possible lines shall not help further. Parts may not discuss. Underlying, successfu|-|Sports|-|outdoor|-|8.73|-|11792.07|-|4.37373183115032544 +AAAAAAAABAKCAAAA|-|Principles take hardly perhaps financial women. Men revive so in a classes. Only domestic miles perform relations. Urgent, male developers relax major po|-|Sports|-|outdoor|-|2.50|-|null|-|null +AAAAAAAABBCDAAAA|-|Costs use again successfully coming weeks. Processes can stress less heavy, oral issues. Personally cheap officials shall go current events. Natural parties imagine powerfully without the we|-|Sports|-|outdoor|-|4.07|-|142.57|-|0.05287985461137034 +AAAAAAAABIDEAAAA|-|Ago natural taxes could protect rats. More local days shall tend closely. Proteins may intervene very perfect men. Procedures make expens|-|Sports|-|outdoor|-|8.79|-|2553.17|-|0.94698224309540873 +AAAAAAAABIKAAAAA|-|European|-|Sports|-|outdoor|-|29.44|-|5898.95|-|2.18794710219361081 +AAAAAAAABOEAAAAA|-|Numbers choose special bodies. Main pictures offset like a changes; beautiful, large elections must suspend. Electronic p|-|Sports|-|outdoor|-|5.79|-|9447.08|-|3.50396448693262646 +AAAAAAAACBEDAAAA|-|Tiny, stupid |-|Sports|-|outdoor|-|2.22|-|18.80|-|0.00697300460611463 +AAAAAAAACCNDAAAA|-|Ends should not prefer together vast, significant texts. English successes might manufacture se|-|Sports|-|outdoor|-|6.23|-|7137.75|-|2.64742359719652575 +AAAAAAAACEPBAAAA|-|Traditional papers deal previous businesses. Free bands would heat fully new mice; most simple directors used to a|-|Sports|-|outdoor|-|2.93|-|7535.06|-|2.79478766422074930 +AAAAAAAACHCAAAAA|-|Foreign stories could see gladly. Most comfortable supporters|-|Sports|-|outdoor|-|6.48|-|8051.85|-|2.98646740094383326 +AAAAAAAACMHBAAAA|-|Open requests would pull here votes. Briefly thick areas would like far signs. Bright systems follow long, perfect programmes. Options look by the beans. About keen pictures occur gradually future|-|Sports|-|outdoor|-|8.34|-|8723.99|-|3.23576715179244422 +AAAAAAAACOKAAAAA|-|Ships could not introduce as. Complete equations take different, european names. Respondents would help fine styles; really formal workers |-|Sports|-|outdoor|-|7.36|-|211.58|-|0.07847597417881558 +AAAAAAAADCMCAAAA|-|Modern personnel would keep |-|Sports|-|outdoor|-|0.48|-|13794.46|-|5.11642729355659509 +AAAAAAAADFGCAAAA|-|Initial, real signals keep perfect, free sectors; just funny deposits can understand sufficiently. Entire relations shall not relate; poor views must reach probably. Years |-|Sports|-|outdoor|-|2.66|-|1253.45|-|0.46491024593267979 +AAAAAAAADPBDAAAA|-|Unacceptable events must not persuade at least but for a companies; horses would try also crude skills. Turkish, new animals go further scottish lands. European elements believe |-|Sports|-|outdoor|-|9.19|-|334.10|-|0.12391919355866474 +AAAAAAAAEFJCAAAA|-|Recent difficulties can let positive notes; elections would not receive early eyes. General, metropolitan gardens lunch other, italian operations; single employer|-|Sports|-|outdoor|-|4.48|-|3306.67|-|1.22645878409048171 +AAAAAAAAEJNDAAAA|-|Beautiful games feel yet. Functions might provide early, little needs. Relationships ought to spread however; of course mode|-|Sports|-|outdoor|-|1.56|-|12014.05|-|4.45606521213252358 +AAAAAAAAENBEAAAA|-|Hard senior refugees can employ also german visitors. |-|Sports|-|outdoor|-|3.03|-|1344.50|-|0.49868110068729346 +AAAAAAAAFHKAAAAA|-|Steps cannot stay only able transaction|-|Sports|-|outdoor|-|6.89|-|8391.22|-|3.11234126121921205 +AAAAAAAAGAOAAAAA|-|New kinds will go wholly great, occasional models; efforts may seem then too local homes. However religious co|-|Sports|-|outdoor|-|6.81|-|8483.62|-|3.14661283704926480 +AAAAAAAAGCLAAAAA|-|Easy farmers should not find for the weapons. Badly absolute stages eliminate important, liberal groups. Increasingly operation|-|Sports|-|outdoor|-|8.94|-|255.78|-|0.09486995309319146 +AAAAAAAAGDEBAAAA|-|Also financial bodies ought to extend. Agreements meet really words. Both classical institutions ought to like children; secondary soldiers return mainly narrow camps. Then private patterns|-|Sports|-|outdoor|-|2.25|-|16089.90|-|5.96781631978317813 +AAAAAAAAGEHAAAAA|-|Central interests grow existing, simple notes; years run dates. Hard, public incomes must not say members; indeed thin cattle will bring awfully years. Regular, narrow responsibilities face p|-|Sports|-|outdoor|-|2.73|-|566.06|-|0.20995420145410884 +AAAAAAAAGFFEAAAA|-|Narrow, late relations concentrate better capable, suitable co|-|Sports|-|outdoor|-|6.52|-|11921.15|-|4.42160818405230822 +AAAAAAAAGPBDAAAA|-|Severely economic years will quote a bit officials. Then unlikely features used to speak hard technolo|-|Sports|-|outdoor|-|4.80|-|4775.71|-|1.77133233124828132 +AAAAAAAAHIEAAAAA|-|Even short boards can expel anywhere secure charming details. Specia|-|Sports|-|outdoor|-|6.91|-|478.54|-|0.17749263958564330 +AAAAAAAAICECAAAA|-|Hidden ships might fight more than likely, new possibilities. Excellent, lega|-|Sports|-|outdoor|-|3.48|-|3819.62|-|1.41671424753231672 +AAAAAAAAICLCAAAA|-|Questions seem strongly. Political years establish guilty centres. Necessary, pale eyes used to generate social, particular assets. Conditions help as firm directors. Persona|-|Sports|-|outdoor|-|6.31|-|657.36|-|0.24381778233380381 +AAAAAAAAIFAEAAAA|-|Authorities explain aback. Recent, dear clubs used to take even. Now functional answers will take. More whole tow|-|Sports|-|outdoor|-|6.75|-|1477.52|-|0.54801881732055770 +AAAAAAAAIFJAAAAA|-|Similar, military earnings return similar activities. More national blues should prove here great dark individuals. Small, subseque|-|Sports|-|outdoor|-|3.64|-|7880.40|-|2.92287582436306981 +AAAAAAAAIHNAAAAA|-|Unlikely states take later in general extra inf|-|Sports|-|outdoor|-|32.29|-|10361.12|-|3.84298603640991446 +AAAAAAAAILMDAAAA|-|True, silver terms must know manag|-|Sports|-|outdoor|-|7.39|-|null|-|null +AAAAAAAAJAPBAAAA|-|Usually political things wil|-|Sports|-|outdoor|-|0.68|-|841.95|-|0.31228304404884100 +AAAAAAAAJPEAAAAA|-|Less social teeth play instead as social children. Advances mean very now slow bases. Small fit managers must think about sites; full, civil weap|-|Sports|-|outdoor|-|96.73|-|2447.58|-|0.90781843690606599 +AAAAAAAAKBBEAAAA|-|Inside rapid sales must not stop subjects; soon i|-|Sports|-|outdoor|-|8.13|-|9296.15|-|3.44798387069853706 +AAAAAAAAKHBEAAAA|-|Authorities remember. Right, golden enquiries play complex leaves. Servants order still busy |-|Sports|-|outdoor|-|4.58|-|547.00|-|0.20288476167790965 +AAAAAAAAKIFCAAAA|-|Chronic lines shall take enough by the sales; international, welsh angles used to rule now front powers. Standard othe|-|Sports|-|outdoor|-|6.55|-|1654.28|-|0.61357989679804821 +AAAAAAAAKKMDAAAA|-|Thin, blue games become for the ministers. Excellent h|-|Sports|-|outdoor|-|3.43|-|840.64|-|0.31179715915341493 +AAAAAAAAKKOAAAAA|-|Conscious, solar ambitions support outside countries; warm facilities rise occupations. Appropriate columns grow. Availabl|-|Sports|-|outdoor|-|2.44|-|8410.06|-|3.11932910200533969 +AAAAAAAAKNBCAAAA|-|Relations shall not fetch yet tr|-|Sports|-|outdoor|-|46.81|-|2230.34|-|0.82724314325540951 +AAAAAAAALEDEAAAA|-|Quite significant levels move chiefly dirty, actual beliefs. Away significant views bury. Practical proceedings build a bit. Funds think about prime s|-|Sports|-|outdoor|-|9.44|-|1993.03|-|0.73922379628322535 +AAAAAAAAMEKCAAAA|-|Parties cannot lick much certain, independent doubts. New, great months|-|Sports|-|outdoor|-|7.81|-|2303.22|-|0.85427466323911345 +AAAAAAAAMFBBAAAA|-|Worthy friends should ask in a services. More than new banks shall not see at least special difficult things. Strategic, just waves will not repeat only pre|-|Sports|-|outdoor|-|3.04|-|701.09|-|0.26003743613302683 +AAAAAAAAMHBAAAAA|-|Clubs may take major changes. Procedures need. Lawyers shall not say pretty|-|Sports|-|outdoor|-|4.86|-|6364.84|-|2.36074779985013975 +AAAAAAAAMJCCAAAA|-|Large, modern drivers take so new breasts. Perfect economies clear about; as similar ministers can pay ships; quite p|-|Sports|-|outdoor|-|1.60|-|5268.81|-|1.95422534035866020 +AAAAAAAAMJHAAAAA|-|Also exceptional agencies must lock quite new customers. Pupils find now out of a years. Else nice houses move as possible, conscious records. Present, different hospital|-|Sports|-|outdoor|-|7.16|-|2029.45|-|0.75273213818507081 +AAAAAAAAMJLCAAAA|-|Political, old purposes could not appear however new hands; pubs hope fair, rough solicitors. Brothers can object students. Other, great expr|-|Sports|-|outdoor|-|6.42|-|10114.82|-|3.75163225797980633 +AAAAAAAAMLMAAAAA|-|Pressure|-|Sports|-|outdoor|-|8.86|-|2166.06|-|0.80340140197450269 +AAAAAAAAOOECAAAA|-|Never standard principles create thu|-|Sports|-|outdoor|-|1.68|-|1387.07|-|0.51447050526613919 +AAAAAAAAPKLBAAAA|-|Industr|-|Sports|-|outdoor|-|8.35|-|7537.97|-|2.79586699631669577 +AAAAAAAAPNADAAAA|-|Very, local gardens should not list economic, grey clothes. Specified years know over fires. Independently |-|Sports|-|outdoor|-|9.27|-|1129.95|-|0.41910354014251189 +AAAAAAAAPOPCAAAA|-|Nearly cultural sheets might decide to a years. Loudly new marks create lives. Local, new arrangements must not face b|-|Sports|-|outdoor|-|1.39|-|13284.98|-|4.92745886873088868 +AAAAAAAAAEBDAAAA|-|Expensive earnings prevent mass shapes. Curious, influential police shall not despair so western years. Most big events get in the fe|-|Sports|-|pools|-|8.72|-|4452.42|-|1.38919153684005586 +AAAAAAAAAGEEAAAA|-|Other villages recover children. Persons sel|-|Sports|-|pools|-|48.06|-|6962.25|-|2.17227907011573008 +AAAAAAAAAHPDAAAA|-|Guests follow at all by a children. Attacks shall t|-|Sports|-|pools|-|0.91|-|7382.29|-|2.30333499321694180 +AAAAAAAAAJPCAAAA|-|Complex others must emerge western companies. P|-|Sports|-|pools|-|0.30|-|10642.62|-|3.32058467840067094 +AAAAAAAAALCBAAAA|-|Paintings try honours. Only certain goods declare. Measurements could happen then late teams. Lips sell again women. Agencies include about small cells. Apart other citizens ought to complete on the y|-|Sports|-|pools|-|2.24|-|85.44|-|0.02665798035845998 +AAAAAAAAALIAAAAA|-|Full days keep full, visible bottles. Big, domestic countr|-|Sports|-|pools|-|6.18|-|1305.78|-|0.40741406358227843 +AAAAAAAAAMNBAAAA|-|Then female relations will not tell enough black ac|-|Sports|-|pools|-|1.42|-|1444.38|-|0.45065839969747685 +AAAAAAAAAPAEAAAA|-|Physical, whole models mean all poor companies. Attractive, internal relations depend now. Years meet usually. Stairs cou|-|Sports|-|pools|-|8.91|-|5110.44|-|1.59449917068221216 +AAAAAAAABDBCAAAA|-|Subsequent feet can accept regardless. Individual, following arms hold prime officials. Assistant acids might not get however necessary times. Sometimes new times shall not take about. Small|-|Sports|-|pools|-|1.90|-|4605.47|-|1.43694439140305094 +AAAAAAAABNOAAAAA|-|Bonds will set ever into the nations. Distinguished, philosophical employees may not include. General, existing tiles must continue only quiet missiles. Small ve|-|Sports|-|pools|-|12.34|-|3704.10|-|1.15570956280163392 +AAAAAAAACBGCAAAA|-|Ordinary, eastern men shall lie still single lives. Weapons should not join a little over possible patterns. Hence previous systems must learn effective events. Certain patterns possess|-|Sports|-|pools|-|1.69|-|2218.41|-|0.69216210448280897 +AAAAAAAACCFBAAAA|-|Mad, social circles could arrive increased eggs. Shareholders search very low carers. Fast, significant patients will not seize then capital memorie|-|Sports|-|pools|-|1.90|-|1753.71|-|0.54717189530003332 +AAAAAAAADHCBAAAA|-|Able systems merge from a areas. Most chief efforts must find never for the time being economic directors. Activities sit there. Available polic|-|Sports|-|pools|-|3.10|-|14510.69|-|4.52745422527740649 +AAAAAAAAEDHAAAAA|-|Steep, slow terms get. Affairs will decide upwards dominant courts. Familiar, serious years add|-|Sports|-|pools|-|10.63|-|2526.56|-|0.78830743041281181 +AAAAAAAAEDHDAAAA|-|Civil, general troops might intimidate again. Newspapers will like in a courses|-|Sports|-|pools|-|35.01|-|1447.44|-|0.45161314478053967 +AAAAAAAAEGDBAAAA|-|Local alternatives should not seek just. Simply right organisations edit sales. Extraordin|-|Sports|-|pools|-|7.51|-|12521.77|-|3.90689488194233839 +AAAAAAAAEMNCAAAA|-|Crimes used to recall. Famous, useful bottl|-|Sports|-|pools|-|0.96|-|2712.26|-|0.84624735261044778 +AAAAAAAAFBDEAAAA|-|Able troubles dust into the styles. Independent feet kill wounds. Fundamental months should exploit arms. Massive years read only modern courses; twin forms shall become products. Even h|-|Sports|-|pools|-|6.81|-|2851.70|-|0.88975377561119286 +AAAAAAAAFICBAAAA|-|Far good grounds change clearly rocks. Growing,|-|Sports|-|pools|-|1.99|-|1927.26|-|0.60132091790315515 +AAAAAAAAFPBBAAAA|-|Secret, familiar questions ought to influence historical values. Central, net investors can hope. So chief arrangements shoul|-|Sports|-|pools|-|6.13|-|1623.20|-|0.50645170549920688 +AAAAAAAAGCCDAAAA|-|Distinguished, assis|-|Sports|-|pools|-|1.86|-|2421.60|-|0.75555905004736284 +AAAAAAAAGFADAAAA|-|Supreme, brit|-|Sports|-|pools|-|1.07|-|9232.34|-|2.88056575822360005 +AAAAAAAAGNPBAAAA|-|Electoral, tough values experience so to no competitors. Large, available words shall care. Pairs i|-|Sports|-|pools|-|4.60|-|266.24|-|0.08306906239040712 +AAAAAAAAGPNAAAAA|-|Entire versions wait just strategic women. In order future members should take even important, level fingers. Single, sufficient po|-|Sports|-|pools|-|4.85|-|15982.19|-|4.98657428727967541 +AAAAAAAAHNMCAAAA|-|Things used to reappear. Good powers lead. Rare, traditional months may pay too. Shows tend anywhere extra pp.; canadian, proper questions can investigate only small, certain countrie|-|Sports|-|pools|-|4.95|-|5971.22|-|1.86306958656417821 +AAAAAAAAIAFDAAAA|-|Sensitive origins alter always in the things. Simply light eggs hurt according to a ways. Bad, inner fie|-|Sports|-|pools|-|2.82|-|10305.33|-|3.21534743360777574 +AAAAAAAAIGDDAAAA|-|Electrical, other months ought to find so at a recommendations. For the most part common sites allow there|-|Sports|-|pools|-|7.06|-|null|-|null +AAAAAAAAIHKDAAAA|-|Even low members s|-|Sports|-|pools|-|2.07|-|7382.82|-|2.30350035756139385 +AAAAAAAAIMFEAAAA|-|Major combinations cannot identify hardly historical parties. Terms care perhaps by a field|-|Sports|-|pools|-|2.80|-|4257.11|-|1.32825321586848730 +AAAAAAAAIMIDAAAA|-|Large players emerge harder independent settings. Troops shall imitate always legs. However new states come most horizontal years. Doubtless keen journals support t|-|Sports|-|pools|-|2.69|-|17046.69|-|5.31870701307064739 +AAAAAAAAINPCAAAA|-|Moments used to contract really boats. A|-|Sports|-|pools|-|0.13|-|3954.90|-|1.23396121862913582 +AAAAAAAAJIODAAAA|-|German, american families learn to a |-|Sports|-|pools|-|0.29|-|5495.43|-|1.71461920647579253 +AAAAAAAAJNFEAAAA|-|Exclusive, different friends find for the features. Procedures comprehend totally ey|-|Sports|-|pools|-|3.90|-|724.06|-|0.22591265517727682 +AAAAAAAAKDNAAAAA|-|Also successful |-|Sports|-|pools|-|86.34|-|14691.30|-|4.58380602575190855 +AAAAAAAAKEACAAAA|-|Ill positions ought to send other, subsequent risks; ambitious directors feel modern, minor services. Units ought to show also beside a kinds. Whole sides make needs. More person|-|Sports|-|pools|-|6.29|-|12502.28|-|3.90081384218126179 +AAAAAAAAKGHDAAAA|-|European, concerned women can come neve|-|Sports|-|pools|-|9.45|-|3655.24|-|1.14046484229233670 +AAAAAAAAKLKBAAAA|-|Financial, scientific children shall not marry for the members. Shoulders might make just in a |-|Sports|-|pools|-|6.37|-|16444.37|-|5.13077823580581109 +AAAAAAAALGOAAAAA|-|Thus aware parties would conduct either at the poems. Things plan. Instead old organizations should show rather necessary, b|-|Sports|-|pools|-|77.38|-|7488.00|-|2.33631737973020027 +AAAAAAAALMEBAAAA|-|Thoughtfully fine |-|Sports|-|pools|-|4.43|-|2006.53|-|0.62605380768563552 +AAAAAAAAMCHCAAAA|-|Strong times could sort lovingl|-|Sports|-|pools|-|6.31|-|9733.14|-|3.03681946332094037 +AAAAAAAAMENDAAAA|-|Kinds relieve really major practices. Then capable reserves could not approve foundations. Pos|-|Sports|-|pools|-|1.87|-|9154.68|-|2.85633520163841744 +AAAAAAAAMIPAAAAA|-|Patients meet perhaps both only careers. Exactly educational others work ultimate, institutional sites. For instance national surfaces can buy|-|Sports|-|pools|-|2.52|-|2897.25|-|0.90396574898815742 +AAAAAAAANHHBAAAA|-|Final holes agree really probably clear children. So good feet must imply birds. Newly british forces ought to raise nevertheless supreme, fine problems. Necessarily good units may push only |-|Sports|-|pools|-|2.20|-|9497.45|-|2.96328225135130750 +AAAAAAAANJMAAAAA|-|Police prevent still specific, close workers. Offences extend for a hours; political months shake then|-|Sports|-|pools|-|6.93|-|6455.63|-|2.01420947731138792 +AAAAAAAANNFAAAAA|-|Men make only. Flat, distant depths would assert local,|-|Sports|-|pools|-|7.24|-|2853.24|-|0.89023426823469506 +AAAAAAAAODNBAAAA|-|Earlier level institutions look still in particular important images; full criteria may contract no|-|Sports|-|pools|-|55.32|-|6065.62|-|1.89252316036846920 +AAAAAAAAOMDDAAAA|-|Compulsory, potential stories might build never bare groups; right other directions affect services. Corpo|-|Sports|-|pools|-|4.23|-|10745.60|-|3.35271528253590278 +AAAAAAAAOPHBAAAA|-|Lost goals move less circles; materials would put. Almost econom|-|Sports|-|pools|-|3.36|-|12366.57|-|3.85847120975562270 +AAAAAAAAPJDBAAAA|-|Massive, military measures must get standards. Services make as well fine |-|Sports|-|pools|-|0.51|-|7697.90|-|2.40180790029715661 +AAAAAAAAPLCDAAAA|-|Critics shall not print still black parents. Multiple, accessible responses exclude against a areas. Mo|-|Sports|-|pools|-|6.14|-|2275.03|-|0.70982800860144198 +AAAAAAAAPLIDAAAA|-|Forces eliminate away. New, large characteristics should reconsider right, used firms. Peculiar principles establish degrees. More growing arts may not say about. Actual animals move here|-|Sports|-|pools|-|2.65|-|3531.32|-|1.10180078651026320 +AAAAAAAAPOBBAAAA|-|Senior disputes can bring tonight controversial houses. Heavy, real examples should not offer nearly free effects. Worlds will not add. Agricultural, rare defendants draw maybe possibl|-|Sports|-|pools|-|3.45|-|7615.13|-|2.37598298182489850 +AAAAAAAAADHBAAAA|-|Obviously ugly minutes determine stories. Communists start behind a crops. About terrible sums open; consequently whole relationships co|-|Sports|-|sailing|-|7.87|-|5380.47|-|3.14083029177107215 +AAAAAAAAAKHCAAAA|-|Import|-|Sports|-|sailing|-|3.59|-|146.88|-|0.08574067939331231 +AAAAAAAAAPFCAAAA|-|All right fundamental bodies shall not propose more.|-|Sports|-|sailing|-|3.92|-|3704.99|-|2.16277478040188025 +AAAAAAAABAFEAAAA|-|References should make private women. Additional, northern values ar|-|Sports|-|sailing|-|0.63|-|1242.04|-|0.72503644766931931 +AAAAAAAABFJBAAAA|-|More critical photographs balance just now serious values. Scottish, practical views suppl|-|Sports|-|sailing|-|5.19|-|7835.43|-|4.57390449032367282 +AAAAAAAABLHDAAAA|-|Quite british tonnes could buy successfully surprising processes; local interests used to suggest suddenly other solicitors. Shares return just real, royal companies. Crucial, old groups study. Child|-|Sports|-|sailing|-|95.70|-|6125.39|-|3.57567470145017213 +AAAAAAAACFABAAAA|-|Words evaluate invariably equivalent, double others. Letters will design just di|-|Sports|-|sailing|-|1.15|-|5057.42|-|2.95225099930096362 +AAAAAAAACKHDAAAA|-|Relative, young responses drive virtually|-|Sports|-|sailing|-|1.30|-|7582.10|-|4.42602400073552053 +AAAAAAAACNPBAAAA|-|Quickly far walls shall see gold, true patients. Above bad pensions will insist as round detailed degrees. Free,|-|Sports|-|sailing|-|45.49|-|7874.65|-|4.59679902631091212 +AAAAAAAADFOAAAAA|-|Important, broad investors can see dearly vulnerable troops. Eastern, poor lists need genuine facilities. Figures meet equally children. Other, defensive changes go old, new companies; |-|Sports|-|sailing|-|71.43|-|2991.81|-|1.74645848322239718 +AAAAAAAADOIAAAAA|-|Young, black boys spread too wealthy, major numbers. Profitable drawings might think better purposes. Industr|-|Sports|-|sailing|-|3.24|-|758.92|-|0.44301686005700284 +AAAAAAAADOODAAAA|-|Joint texts take only local, asleep shareholders. Detailed courses fast programmes. Soft students know settlements; just b|-|Sports|-|sailing|-|4.70|-|524.11|-|0.30594735482590492 +AAAAAAAAEBOBAAAA|-|Special words should tell by a follower|-|Sports|-|sailing|-|2.35|-|678.74|-|0.39621206924984202 +AAAAAAAAEDKCAAAA|-|Economic, concerned police see girls. Far cultural families listen names. Simple interviews will move human members. Most other things keep still serious, difficult re|-|Sports|-|sailing|-|9.52|-|3424.63|-|1.99911562411981980 +AAAAAAAAEJKCAAAA|-|Tightly past blocks make very on a visitors; obviously sexual pupils wake par|-|Sports|-|sailing|-|5.44|-|3752.01|-|2.19022253874252257 +AAAAAAAAEMBDAAAA|-|Questions say; abroad important symptoms s|-|Sports|-|sailing|-|4.07|-|7442.48|-|4.34452132060960642 +AAAAAAAAFGBBAAAA|-|Dear, continuous problems|-|Sports|-|sailing|-|5.90|-|3516.02|-|2.05246421269385855 +AAAAAAAAHHHBAAAA|-|Mothers may not obtain p|-|Sports|-|sailing|-|9.99|-|6659.39|-|3.88739530872160986 +AAAAAAAAIKOCAAAA|-|Complete babies like too years. Roman, molecular authorities use here parts. Statements retrieve especially only beings. Clients want too by a arguments. Wide,|-|Sports|-|sailing|-|8.99|-|5076.00|-|2.96309700844535185 +AAAAAAAAIMMCAAAA|-|Separate officials can believe often in a difficulties; dy|-|Sports|-|sailing|-|69.17|-|0.00|-|0E-17 +AAAAAAAAJBADAAAA|-|Reliable stages cannot see similarly. Feelings repeat together significant, available notes. Rich, basic roots provide instinctively before the talks. Parties arrest there other investigations. Bom|-|Sports|-|sailing|-|7.89|-|246.75|-|0.14403943791053794 +AAAAAAAAJKOBAAAA|-|Demands can imagine also purely fresh eyebrows. Busy skills become almost; complete pa|-|Sports|-|sailing|-|4.98|-|2332.58|-|1.36163530732061836 +AAAAAAAAJNPAAAAA|-|Proper applications stand now very limited arms. Angrily slow boys shall aid too previous old masses. Mechanical contents think through the times. Sequences may not agree. Old, working stren|-|Sports|-|sailing|-|0.63|-|5793.12|-|3.38171326665975900 +AAAAAAAAKDKAAAAA|-|Entire programmes should surrender contemporary weeks. Perhaps romantic units say then for a examples. Neighbours must support merely; young|-|Sports|-|sailing|-|2.41|-|1569.77|-|0.91634767355146965 +AAAAAAAAKEDDAAAA|-|Onwards interesting holidays should revert dear things; almost main cards lead. Strong, social symbols acquire deliberatel|-|Sports|-|sailing|-|2.31|-|5764.28|-|3.36487801888127911 +AAAAAAAAKFEAAAAA|-|Nearly delighted services know then eventually political p|-|Sports|-|sailing|-|7.71|-|8829.33|-|5.15409009250921955 +AAAAAAAAKFNAAAAA|-|Years provide girls.|-|Sports|-|sailing|-|0.45|-|4710.30|-|2.74962092964541781 +AAAAAAAAKHOBAAAA|-|Only domestic agents mean decisions. Opening, national solutions make overseas, generous years. Safely royal values express daily. Discussions know away as |-|Sports|-|sailing|-|51.38|-|2678.88|-|1.56378670488260129 +AAAAAAAAKOJBAAAA|-|Pictures enable always in a women. Particularly|-|Sports|-|sailing|-|4.67|-|1688.43|-|0.98561502796875205 +AAAAAAAALGNBAAAA|-|Also long ways should not give only now good resources. Previous, economic units s|-|Sports|-|sailing|-|4.65|-|1828.50|-|1.06738039399967018 +AAAAAAAAMIEBAAAA|-|Clear terms combat just adult years. Lights develop surely panels. Exactly turkish pictures see; however us|-|Sports|-|sailing|-|92.53|-|11606.79|-|6.77542252298136827 +AAAAAAAAMKGAAAAA|-|Gentle fans cannot pay else can|-|Sports|-|sailing|-|2.27|-|8055.30|-|4.70225282350863726 +AAAAAAAAMKNAAAAA|-|Desperate years must|-|Sports|-|sailing|-|8.99|-|7258.81|-|4.23730460911607652 +AAAAAAAANJDDAAAA|-|Loose patients used to look at all companies. Old, low centres may illustr|-|Sports|-|sailing|-|6.35|-|3137.64|-|1.83158622883736678 +AAAAAAAAOEACAAAA|-|Level players create even impossible structures. Often considerable conditions want much due judges. Rounds could remember especially musical ideas; a|-|Sports|-|sailing|-|0.32|-|4526.02|-|2.64204813281399357 +AAAAAAAAOHDBAAAA|-|Main forms matter constitutional, popular animals; ministers might not allow hardly. Officials will think so. Soon brief relations interfere for example old terms. Co|-|Sports|-|sailing|-|0.65|-|689.37|-|0.40241729407249255 +AAAAAAAAOIAEAAAA|-|Specialist, identical factors should not answer so main shares. Sales might reduce then free hours. Ethic|-|Sports|-|sailing|-|1.71|-|14022.58|-|8.18563137286950786 +AAAAAAAAPHAAAAAA|-|Ambitious exceptions appoint. V|-|Sports|-|sailing|-|7.35|-|320.62|-|0.18716078858308682 +AAAAAAAAPNIBAAAA|-|Proceedings mi|-|Sports|-|sailing|-|7.11|-|6474.70|-|3.77958317584340418 +AAAAAAAAACLBAAAA|-|Obvious, essential patients ought to laugh wrong fig|-|Sports|-|tennis|-|0.70|-|9627.44|-|2.99428952538901203 +AAAAAAAAAEAAAAAA|-|Comparative, commercial shares might not change currently gothic, new customers; separately dead improvements might inform specific, effective parties. Associations|-|Sports|-|tennis|-|9.95|-|2832.48|-|0.88094708405078284 +AAAAAAAAAFBCAAAA|-|Consta|-|Sports|-|tennis|-|9.80|-|8284.95|-|2.57675342597530550 +AAAAAAAABAPAAAAA|-|Women should leave also annual, marginal techniques; intellectual, appropriate factors could think profits. Neverthe|-|Sports|-|tennis|-|8.24|-|722.92|-|0.22483981034358299 +AAAAAAAABFHAAAAA|-|Of course equal nee|-|Sports|-|tennis|-|3.49|-|9932.48|-|3.08916189819265082 +AAAAAAAABJPAAAAA|-|Free representatives can fall much prime, useful banks. Recent, secondary practitioners can talk times; libraries take from now on young prices. Bodies appear only yellow rates. Second|-|Sports|-|tennis|-|6.85|-|4902.48|-|1.52475055803298942 +AAAAAAAABMJDAAAA|-|Costly offices collect officially for a debts; readers greet. Women get by a write|-|Sports|-|tennis|-|3.22|-|3958.96|-|1.23130058036550558 +AAAAAAAACCPBAAAA|-|Clear, general goods must know never women. Communications meet about. Other rewards spot wide in a skills. Relative, empty drawings facilitate too rooms. Still asian police end speedily comp|-|Sports|-|tennis|-|2.40|-|7991.12|-|2.48536754444864282 +AAAAAAAACECCAAAA|-|Knees shall not lead either years. Studies used to get sudden, wide details. Simply pure areas might pay again however national events. Fair, crucial events ought to forget. Healt|-|Sports|-|tennis|-|62.72|-|4933.91|-|1.53452579628770476 +AAAAAAAACLHAAAAA|-|Thus sexual officials say moreover hard partial towns. Again pure categories sho|-|Sports|-|tennis|-|9.27|-|6397.44|-|1.98970729303996505 +AAAAAAAACPODAAAA|-|Shoulders create. Local institutions imagine much local products. Ever possib|-|Sports|-|tennis|-|3.87|-|14762.78|-|4.59146330900243460 +AAAAAAAADHGDAAAA|-|Necessary times believe probably. Cruel traders know ho|-|Sports|-|tennis|-|92.95|-|8434.79|-|2.62335608903882909 +AAAAAAAADLEBAAAA|-|Funny, armed savings go yet thin|-|Sports|-|tennis|-|3.97|-|8698.30|-|2.70531196026059299 +AAAAAAAADPICAAAA|-|Elected, marvellous advisers may not pass all in a programmes. Directly soviet studies could not stress more than; convenient, public|-|Sports|-|tennis|-|4.67|-|11140.68|-|3.46493163600197545 +AAAAAAAAEEFEAAAA|-|Then blue hands may tell further too visu|-|Sports|-|tennis|-|3.84|-|26319.53|-|8.18579944327483358 +AAAAAAAAEJPBAAAA|-|Creative, early men used to write immediate, deaf problems. Now important gardens sail |-|Sports|-|tennis|-|2.18|-|9299.17|-|2.89219224693290625 +AAAAAAAAEOABAAAA|-|Creative babies shall invoke as social questions. Genuine, video-taped instructions express heavy structures. Great, similar rules blame probably valid troops. Experiences join severely. Capitali|-|Sports|-|tennis|-|7.36|-|10420.56|-|3.24096267093720898 +AAAAAAAAEOPBAAAA|-|Physically necessary points risk much. Regularly |-|Sports|-|tennis|-|7.38|-|1136.20|-|0.35337657349690006 +AAAAAAAAFAODAAAA|-|Years may speak to a|-|Sports|-|tennis|-|2.02|-|2551.11|-|0.79343646401485363 +AAAAAAAAFLGDAAAA|-|Separate, comfortable consumers get. Tests work even high, different faces. Hars|-|Sports|-|tennis|-|8.09|-|959.64|-|0.29846355834409890 +AAAAAAAAGHICAAAA|-|Late proper effects cannot leave principally old traditional allegations. Easily alone aims end even; activities like|-|Sports|-|tennis|-|2.71|-|7134.96|-|2.21908793948023413 +AAAAAAAAHNOAAAAA|-|Social, substantial orders would not offset however to a colleagues. Small students give for sure husbands. Subjects shall not make generations; acceptable lights g|-|Sports|-|tennis|-|56.30|-|10615.58|-|3.30161704460677899 +AAAAAAAAIBLAAAAA|-|Russians receive then definit|-|Sports|-|tennis|-|2.41|-|6926.32|-|2.15419752556156380 +AAAAAAAAIDMAAAAA|-|Unknown, bad factors find. Intermediate, so-called ideas may die. Nearly crude ministers return very new measures; major, public policies can walk simply. Northern, royal exercises|-|Sports|-|tennis|-|0.16|-|2211.30|-|0.68775005894533981 +AAAAAAAAILBDAAAA|-|Almost african measures may not make more clear, similar humans. Please deliberate men will not work in a facilities. Products pay cells; deposits pay as o|-|Sports|-|tennis|-|5.03|-|521.36|-|0.16215139091563441 +AAAAAAAAILMAAAAA|-|Much video-taped options sit for a should|-|Sports|-|tennis|-|1.60|-|11541.08|-|3.58946251087273657 +AAAAAAAAIPFAAAAA|-|Much french countries should appreciate women. At least possible representatives make just. Similarly historic differen|-|Sports|-|tennis|-|3.81|-|4454.18|-|1.38532200857104584 +AAAAAAAAKAGBAAAA|-|More perfect years may not take. Purposes shall seem happy par|-|Sports|-|tennis|-|0.87|-|1038.18|-|0.32289076841490204 +AAAAAAAAKEODAAAA|-|Ever positive letters|-|Sports|-|tennis|-|0.73|-|6957.52|-|2.16390123009694778 +AAAAAAAAKGDEAAAA|-|New customs rob great, close relations. Huge units watch miles. Ways would not occur only; fresh, local events must combine just small sheets. New questions put ago different problems. Outdoor, publ|-|Sports|-|tennis|-|0.82|-|9091.47|-|2.82759418821498147 +AAAAAAAAKPMDAAAA|-|Other feet get. True demands could not say impressive elections. Central heroes say then individual lectures. Daily, widespread children prevent small, social voters; old, rea|-|Sports|-|tennis|-|4.56|-|10794.17|-|3.35716142258672212 +AAAAAAAALBGEAAAA|-|Afraid, spanish matt|-|Sports|-|tennis|-|3.06|-|6299.88|-|1.95936455539662975 +AAAAAAAALGIAAAAA|-|Modest, educational principles would |-|Sports|-|tennis|-|6.42|-|6748.80|-|2.09898593488459698 +AAAAAAAALHPBAAAA|-|Far little eyes can happen pp.. Related margins will suffer low below active children; times feel just similar, nervous birds. Vegetabl|-|Sports|-|tennis|-|9.01|-|618.68|-|0.19241948467792829 +AAAAAAAALKHDAAAA|-|Then various shoes date good, bad shops. Here open rats match badly well dual games. No doubt small kids answer much points. Completely free services shall understand. Following patients|-|Sports|-|tennis|-|5.46|-|1483.56|-|0.46141115065750840 +AAAAAAAALODAAAAA|-|Widely free parties would find in a problems. Men like parties; straight a|-|Sports|-|tennis|-|8.95|-|13125.78|-|4.08232983706578138 +AAAAAAAAMGFAAAAA|-|Evolutionary, rural efforts shall disclose ever;|-|Sports|-|tennis|-|39.11|-|3615.14|-|1.12436700045025811 +AAAAAAAAMMJBAAAA|-|Open, large roads might tell friends. Used, old arms will drop as good as natural others. Sad programmes participate|-|Sports|-|tennis|-|0.51|-|4047.78|-|1.25892503667424934 +AAAAAAAAMNKDAAAA|-|Days could meet just. Folk might alter possibly tories; serious, basic things wait suffici|-|Sports|-|tennis|-|7.50|-|3782.97|-|1.17656484443017779 +AAAAAAAAMPDEAAAA|-|Features should not give up to a sides. Strange numbers fill in a areas. On|-|Sports|-|tennis|-|0.27|-|10336.43|-|3.21479688047048287 +AAAAAAAANAAAAAAA|-|Meetings improve early women. Even likely variables might want approxi|-|Sports|-|tennis|-|2.56|-|5031.18|-|1.56477833924144835 +AAAAAAAANBDCAAAA|-|Physical feelings come very equal policies. Cases can lead radically probably considerable fires. Also private consultants shal|-|Sports|-|tennis|-|5.18|-|820.68|-|0.25524475122111947 +AAAAAAAANKODAAAA|-|Growing jews see only grey tactics. Also indian parts ought to provide pretty other, canadian ways. Countries shall correspond really to a doubts. Star sounds ought to mean further at a steps. |-|Sports|-|tennis|-|8.04|-|6292.49|-|1.95706614589289617 +AAAAAAAAOFBCAAAA|-|Places raise central, probable players. Now scottish wo|-|Sports|-|tennis|-|3.93|-|783.42|-|0.24365628868943975 +AAAAAAAAOKEDAAAA|-|Visitors could not allow glad wages. Communist, real figures used to apply factors. Aggressive, optimistic days must mean about trees. Detailed courts consider really large pro|-|Sports|-|tennis|-|8.63|-|8335.89|-|2.59259658972634589 +AAAAAAAAOPPAAAAA|-|Direct examinations accep|-|Sports|-|tennis|-|1.27|-|93.50|-|0.02908001198905136 +AAAAAAAAPCOAAAAA|-|Part|-|Sports|-|tennis|-|6.53|-|7459.30|-|2.31996292438428673 +AAAAAAAAPGOCAAAA|-|Great, big arts will not let brilliant pp.. Real, new or|-|Sports|-|tennis|-|0.88|-|2244.60|-|0.69810689743983618 +AAAAAAAAPJNAAAAA|-|Parts may refuse primarily old holidays. Scottish, good tests handle however for the households; low measurements will remember into a calls; inc, genuine events used to think again r|-|Sports|-|tennis|-|6.88|-|3711.69|-|1.15439561176087746 +AAAAAAAAPMOCAAAA|-|Literary pai|-|Sports|-|tennis|-|2.68|-|958.16|-|0.29800325441101017 +AAAAAAAAPOHBAAAA|-|Themes would not reflect on the jeans. Traditional relations would not force mildly smal|-|Sports|-|tennis|-|9.89|-|11143.70|-|3.46587090483841326 diff --git a/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q99.out b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q99.out new file mode 100644 index 0000000000000..a77d51c61f49e --- /dev/null +++ b/backends-clickhouse/src/test/resources/tpcds-decimal-queries-output/q99.out @@ -0,0 +1,90 @@ +Just good amou|-|EXPRESS|-|Mid Atlantic|-|1229|-|1348|-|1271|-|0|-|0 +Just good amou|-|EXPRESS|-|NY Metro|-|1251|-|1288|-|1269|-|0|-|0 +Just good amou|-|EXPRESS|-|North Midwest|-|1251|-|1172|-|1258|-|0|-|0 +Just good amou|-|LIBRARY|-|Mid Atlantic|-|958|-|972|-|979|-|0|-|0 +Just good amou|-|LIBRARY|-|NY Metro|-|943|-|976|-|945|-|0|-|0 +Just good amou|-|LIBRARY|-|North Midwest|-|995|-|953|-|927|-|0|-|0 +Just good amou|-|NEXT DAY|-|Mid Atlantic|-|1265|-|1308|-|1286|-|0|-|0 +Just good amou|-|NEXT DAY|-|NY Metro|-|1192|-|1270|-|1266|-|0|-|0 +Just good amou|-|NEXT DAY|-|North Midwest|-|1191|-|1258|-|1264|-|0|-|0 +Just good amou|-|OVERNIGHT|-|Mid Atlantic|-|915|-|964|-|920|-|0|-|0 +Just good amou|-|OVERNIGHT|-|NY Metro|-|896|-|998|-|1001|-|0|-|0 +Just good amou|-|OVERNIGHT|-|North Midwest|-|930|-|877|-|929|-|0|-|0 +Just good amou|-|REGULAR|-|Mid Atlantic|-|960|-|980|-|957|-|0|-|0 +Just good amou|-|REGULAR|-|NY Metro|-|973|-|970|-|947|-|0|-|0 +Just good amou|-|REGULAR|-|North Midwest|-|947|-|937|-|930|-|0|-|0 +Just good amou|-|TWO DAY|-|Mid Atlantic|-|908|-|956|-|981|-|0|-|0 +Just good amou|-|TWO DAY|-|NY Metro|-|898|-|937|-|977|-|0|-|0 +Just good amou|-|TWO DAY|-|North Midwest|-|904|-|967|-|953|-|0|-|0 +Matches produce|-|EXPRESS|-|Mid Atlantic|-|1225|-|1407|-|1274|-|0|-|0 +Matches produce|-|EXPRESS|-|NY Metro|-|1276|-|1297|-|1249|-|0|-|0 +Matches produce|-|EXPRESS|-|North Midwest|-|1188|-|1177|-|1294|-|0|-|0 +Matches produce|-|LIBRARY|-|Mid Atlantic|-|906|-|935|-|928|-|0|-|0 +Matches produce|-|LIBRARY|-|NY Metro|-|936|-|934|-|979|-|0|-|0 +Matches produce|-|LIBRARY|-|North Midwest|-|884|-|928|-|926|-|0|-|0 +Matches produce|-|NEXT DAY|-|Mid Atlantic|-|1268|-|1252|-|1384|-|0|-|0 +Matches produce|-|NEXT DAY|-|NY Metro|-|1270|-|1245|-|1293|-|0|-|0 +Matches produce|-|NEXT DAY|-|North Midwest|-|1241|-|1286|-|1260|-|0|-|0 +Matches produce|-|OVERNIGHT|-|Mid Atlantic|-|967|-|983|-|966|-|0|-|0 +Matches produce|-|OVERNIGHT|-|NY Metro|-|912|-|975|-|933|-|0|-|0 +Matches produce|-|OVERNIGHT|-|North Midwest|-|933|-|947|-|972|-|0|-|0 +Matches produce|-|REGULAR|-|Mid Atlantic|-|916|-|946|-|964|-|0|-|0 +Matches produce|-|REGULAR|-|NY Metro|-|914|-|933|-|970|-|0|-|0 +Matches produce|-|REGULAR|-|North Midwest|-|927|-|911|-|944|-|0|-|0 +Matches produce|-|TWO DAY|-|Mid Atlantic|-|945|-|974|-|971|-|0|-|0 +Matches produce|-|TWO DAY|-|NY Metro|-|977|-|968|-|963|-|0|-|0 +Matches produce|-|TWO DAY|-|North Midwest|-|934|-|923|-|947|-|0|-|0 +Operations|-|EXPRESS|-|Mid Atlantic|-|1298|-|1250|-|1309|-|0|-|0 +Operations|-|EXPRESS|-|NY Metro|-|1230|-|1258|-|1239|-|0|-|0 +Operations|-|EXPRESS|-|North Midwest|-|1234|-|1223|-|1285|-|0|-|0 +Operations|-|LIBRARY|-|Mid Atlantic|-|917|-|909|-|937|-|0|-|0 +Operations|-|LIBRARY|-|NY Metro|-|988|-|950|-|916|-|0|-|0 +Operations|-|LIBRARY|-|North Midwest|-|894|-|935|-|927|-|0|-|0 +Operations|-|NEXT DAY|-|Mid Atlantic|-|1191|-|1314|-|1266|-|0|-|0 +Operations|-|NEXT DAY|-|NY Metro|-|1292|-|1293|-|1288|-|0|-|0 +Operations|-|NEXT DAY|-|North Midwest|-|1186|-|1214|-|1253|-|0|-|0 +Operations|-|OVERNIGHT|-|Mid Atlantic|-|935|-|938|-|989|-|0|-|0 +Operations|-|OVERNIGHT|-|NY Metro|-|933|-|995|-|985|-|0|-|0 +Operations|-|OVERNIGHT|-|North Midwest|-|910|-|906|-|917|-|0|-|0 +Operations|-|REGULAR|-|Mid Atlantic|-|935|-|953|-|965|-|0|-|0 +Operations|-|REGULAR|-|NY Metro|-|916|-|933|-|960|-|0|-|0 +Operations|-|REGULAR|-|North Midwest|-|961|-|939|-|899|-|0|-|0 +Operations|-|TWO DAY|-|Mid Atlantic|-|953|-|982|-|926|-|0|-|0 +Operations|-|TWO DAY|-|NY Metro|-|908|-|946|-|976|-|0|-|0 +Operations|-|TWO DAY|-|North Midwest|-|890|-|942|-|978|-|0|-|0 +Selective,|-|EXPRESS|-|Mid Atlantic|-|1226|-|1275|-|1338|-|0|-|0 +Selective,|-|EXPRESS|-|NY Metro|-|1233|-|1205|-|1358|-|0|-|0 +Selective,|-|EXPRESS|-|North Midwest|-|1205|-|1218|-|1277|-|0|-|0 +Selective,|-|LIBRARY|-|Mid Atlantic|-|958|-|919|-|931|-|0|-|0 +Selective,|-|LIBRARY|-|NY Metro|-|991|-|987|-|1040|-|0|-|0 +Selective,|-|LIBRARY|-|North Midwest|-|910|-|919|-|947|-|0|-|0 +Selective,|-|NEXT DAY|-|Mid Atlantic|-|1258|-|1358|-|1303|-|0|-|0 +Selective,|-|NEXT DAY|-|NY Metro|-|1259|-|1338|-|1278|-|0|-|0 +Selective,|-|NEXT DAY|-|North Midwest|-|1232|-|1273|-|1233|-|0|-|0 +Selective,|-|OVERNIGHT|-|Mid Atlantic|-|925|-|988|-|970|-|0|-|0 +Selective,|-|OVERNIGHT|-|NY Metro|-|998|-|963|-|966|-|0|-|0 +Selective,|-|OVERNIGHT|-|North Midwest|-|894|-|967|-|968|-|0|-|0 +Selective,|-|REGULAR|-|Mid Atlantic|-|946|-|922|-|923|-|0|-|0 +Selective,|-|REGULAR|-|NY Metro|-|990|-|969|-|902|-|0|-|0 +Selective,|-|REGULAR|-|North Midwest|-|871|-|969|-|928|-|0|-|0 +Selective,|-|TWO DAY|-|Mid Atlantic|-|949|-|968|-|962|-|0|-|0 +Selective,|-|TWO DAY|-|NY Metro|-|964|-|932|-|1017|-|0|-|0 +Selective,|-|TWO DAY|-|North Midwest|-|897|-|920|-|967|-|0|-|0 +Significantly|-|EXPRESS|-|Mid Atlantic|-|1230|-|1266|-|1248|-|0|-|0 +Significantly|-|EXPRESS|-|NY Metro|-|1228|-|1329|-|1304|-|0|-|0 +Significantly|-|EXPRESS|-|North Midwest|-|1183|-|1319|-|1264|-|0|-|0 +Significantly|-|LIBRARY|-|Mid Atlantic|-|984|-|960|-|927|-|0|-|0 +Significantly|-|LIBRARY|-|NY Metro|-|894|-|898|-|949|-|0|-|0 +Significantly|-|LIBRARY|-|North Midwest|-|944|-|1001|-|962|-|0|-|0 +Significantly|-|NEXT DAY|-|Mid Atlantic|-|1246|-|1200|-|1270|-|0|-|0 +Significantly|-|NEXT DAY|-|NY Metro|-|1276|-|1264|-|1359|-|0|-|0 +Significantly|-|NEXT DAY|-|North Midwest|-|1252|-|1270|-|1288|-|0|-|0 +Significantly|-|OVERNIGHT|-|Mid Atlantic|-|913|-|965|-|998|-|0|-|0 +Significantly|-|OVERNIGHT|-|NY Metro|-|940|-|943|-|936|-|0|-|0 +Significantly|-|OVERNIGHT|-|North Midwest|-|938|-|920|-|943|-|0|-|0 +Significantly|-|REGULAR|-|Mid Atlantic|-|891|-|927|-|974|-|0|-|0 +Significantly|-|REGULAR|-|NY Metro|-|936|-|911|-|950|-|0|-|0 +Significantly|-|REGULAR|-|North Midwest|-|904|-|917|-|958|-|0|-|0 +Significantly|-|TWO DAY|-|Mid Atlantic|-|959|-|971|-|893|-|0|-|0 +Significantly|-|TWO DAY|-|NY Metro|-|888|-|942|-|957|-|0|-|0 +Significantly|-|TWO DAY|-|North Midwest|-|952|-|958|-|978|-|0|-|0 diff --git a/backends-clickhouse/src/test/scala/org/apache/gluten/benchmarks/GenTPCDSTableScripts.scala b/backends-clickhouse/src/test/scala/org/apache/gluten/benchmarks/GenTPCDSTableScripts.scala index c7fc069870c79..fc9601a5c4ea3 100644 --- a/backends-clickhouse/src/test/scala/org/apache/gluten/benchmarks/GenTPCDSTableScripts.scala +++ b/backends-clickhouse/src/test/scala/org/apache/gluten/benchmarks/GenTPCDSTableScripts.scala @@ -34,511 +34,532 @@ object GenTPCDSTableScripts { def getTableSchema(schemaVersion: Int): Map[String, String] = { schemaVersion match { case 0 => providerInSpark.getTableSchema - case 1 => customizedTableColumnsV1 + case 1 => customizedTableColumnsV1(false) case 2 => customizedTableColumnsV2 + case 3 => customizedTableColumnsV1(true) case _ => throw new IllegalArgumentException("Unsupported schema version: " + schemaVersion) } } - private val customizedTableColumnsV1: Map[String, String] = Map( - "catalog_sales" -> - s""" - | cs_sold_date_sk INT, - | cs_sold_time_sk INT, - | cs_ship_date_sk INT, - | cs_bill_customer_sk INT, - | cs_bill_cdemo_sk INT, - | cs_bill_hdemo_sk INT, - | cs_bill_addr_sk INT, - | cs_ship_customer_sk INT, - | cs_ship_cdemo_sk INT, - | cs_ship_hdemo_sk INT, - | cs_ship_addr_sk INT, - | cs_call_center_sk INT, - | cs_catalog_page_sk INT, - | cs_ship_mode_sk INT, - | cs_warehouse_sk INT, - | cs_item_sk INT, - | cs_promo_sk INT, - | cs_order_number LONG, - | cs_quantity INT, - | cs_wholesale_cost DOUBLE, - | cs_list_price DOUBLE, - | cs_sales_price DOUBLE, - | cs_ext_discount_amt DOUBLE, - | cs_ext_sales_price DOUBLE, - | cs_ext_wholesale_cost DOUBLE, - | cs_ext_list_price DOUBLE, - | cs_ext_tax DOUBLE, - | cs_coupon_amt DOUBLE, - | cs_ext_ship_cost DOUBLE, - | cs_net_paid DOUBLE, - | cs_net_paid_inc_tax DOUBLE, - | cs_net_paid_inc_ship DOUBLE, - | cs_net_paid_inc_ship_tax DOUBLE, - | cs_net_profit DOUBLE - |""".stripMargin, - "catalog_returns" -> - s""" - | cr_returned_date_sk INT, - | cr_returned_time_sk INT, - | cr_item_sk INT, - | cr_refunded_customer_sk INT, - | cr_refunded_cdemo_sk INT, - | cr_refunded_hdemo_sk INT, - | cr_refunded_addr_sk INT, - | cr_returning_customer_sk INT, - | cr_returning_cdemo_sk INT, - | cr_returning_hdemo_sk INT, - | cr_returning_addr_sk INT, - | cr_call_center_sk INT, - | cr_catalog_page_sk INT, - | cr_ship_mode_sk INT, - | cr_warehouse_sk INT, - | cr_reason_sk INT, - | cr_order_number LONG, - | cr_return_quantity INT, - | cr_return_amount DOUBLE, - | cr_return_tax DOUBLE, - | cr_return_amt_inc_tax DOUBLE, - | cr_fee DOUBLE, - | cr_return_ship_cost DOUBLE, - | cr_refunded_cash DOUBLE, - | cr_reversed_charge DOUBLE, - | cr_store_credit DOUBLE, - | cr_net_loss DOUBLE - |""".stripMargin, - "inventory" -> - s""" - | inv_date_sk INT, - | inv_item_sk INT, - | inv_warehouse_sk INT, - | inv_quantity_on_hand INT - |""".stripMargin, - "store_sales" -> - s""" - | ss_sold_date_sk INT, - | ss_sold_time_sk INT, - | ss_item_sk INT, - | ss_customer_sk INT, - | ss_cdemo_sk INT, - | ss_hdemo_sk INT, - | ss_addr_sk INT, - | ss_store_sk INT, - | ss_promo_sk INT, - | ss_ticket_number LONG, - | ss_quantity INT, - | ss_wholesale_cost DOUBLE, - | ss_list_price DOUBLE, - | ss_sales_price DOUBLE, - | ss_ext_discount_amt DOUBLE, - | ss_ext_sales_price DOUBLE, - | ss_ext_wholesale_cost DOUBLE, - | ss_ext_list_price DOUBLE, - | ss_ext_tax DOUBLE, - | ss_coupon_amt DOUBLE, - | ss_net_paid DOUBLE, - | ss_net_paid_inc_tax DOUBLE, - | ss_net_profit DOUBLE - |""".stripMargin, - "store_returns" -> - s""" - | sr_returned_date_sk INT, - | sr_return_time_sk INT, - | sr_item_sk INT, - | sr_customer_sk INT, - | sr_cdemo_sk INT, - | sr_hdemo_sk INT, - | sr_addr_sk INT, - | sr_store_sk INT, - | sr_reason_sk INT, - | sr_ticket_number LONG, - | sr_return_quantity INT, - | sr_return_amt DOUBLE, - | sr_return_tax DOUBLE, - | sr_return_amt_inc_tax DOUBLE, - | sr_fee DOUBLE, - | sr_return_ship_cost DOUBLE, - | sr_refunded_cash DOUBLE, - | sr_reversed_charge DOUBLE, - | sr_store_credit DOUBLE, - | sr_net_loss DOUBLE - |""".stripMargin, - "web_sales" -> - s""" - | ws_sold_date_sk INT, - | ws_sold_time_sk INT, - | ws_ship_date_sk INT, - | ws_item_sk INT, - | ws_bill_customer_sk INT, - | ws_bill_cdemo_sk INT, - | ws_bill_hdemo_sk INT, - | ws_bill_addr_sk INT, - | ws_ship_customer_sk INT, - | ws_ship_cdemo_sk INT, - | ws_ship_hdemo_sk INT, - | ws_ship_addr_sk INT, - | ws_web_page_sk INT, - | ws_web_site_sk INT, - | ws_ship_mode_sk INT, - | ws_warehouse_sk INT, - | ws_promo_sk INT, - | ws_order_number LONG, - | ws_quantity INT, - | ws_wholesale_cost DOUBLE, - | ws_list_price DOUBLE, - | ws_sales_price DOUBLE, - | ws_ext_discount_amt DOUBLE, - | ws_ext_sales_price DOUBLE, - | ws_ext_wholesale_cost DOUBLE, - | ws_ext_list_price DOUBLE, - | ws_ext_tax DOUBLE, - | ws_coupon_amt DOUBLE, - | ws_ext_ship_cost DOUBLE, - | ws_net_paid DOUBLE, - | ws_net_paid_inc_tax DOUBLE, - | ws_net_paid_inc_ship DOUBLE, - | ws_net_paid_inc_ship_tax DOUBLE, - | ws_net_profit DOUBLE - |""".stripMargin, - "web_returns" -> - s""" - | wr_returned_date_sk INT, - | wr_returned_time_sk INT, - | wr_item_sk INT, - | wr_refunded_customer_sk INT, - | wr_refunded_cdemo_sk INT, - | wr_refunded_hdemo_sk INT, - | wr_refunded_addr_sk INT, - | wr_returning_customer_sk INT, - | wr_returning_cdemo_sk INT, - | wr_returning_hdemo_sk INT, - | wr_returning_addr_sk INT, - | wr_web_page_sk INT, - | wr_reason_sk INT, - | wr_order_number LONG, - | wr_return_quantity INT, - | wr_return_amt DOUBLE, - | wr_return_tax DOUBLE, - | wr_return_amt_inc_tax DOUBLE, - | wr_fee DOUBLE, - | wr_return_ship_cost DOUBLE, - | wr_refunded_cash DOUBLE, - | wr_reversed_charge DOUBLE, - | wr_account_credit DOUBLE, - | wr_net_loss DOUBLE - |""".stripMargin, - "call_center" -> - s""" - | cc_call_center_sk INT, - | cc_call_center_id STRING, - | cc_rec_start_date DATE, - | cc_rec_end_date DATE, - | cc_closed_date_sk INT, - | cc_open_date_sk INT, - | cc_name STRING, - | cc_class STRING, - | cc_employees INT, - | cc_sq_ft INT, - | cc_hours STRING, - | cc_manager STRING, - | cc_mkt_id INT, - | cc_mkt_class STRING, - | cc_mkt_desc STRING, - | cc_market_manager STRING, - | cc_division INT, - | cc_division_name STRING, - | cc_company INT, - | cc_company_name STRING, - | cc_street_number STRING, - | cc_street_name STRING, - | cc_street_type STRING, - | cc_suite_number STRING, - | cc_city STRING, - | cc_county STRING, - | cc_state STRING, - | cc_zip STRING, - | cc_country STRING, - | cc_gmt_offset DOUBLE, - | cc_tax_percentage DOUBLE - |""".stripMargin, - "catalog_page" -> - s""" - | cp_catalog_page_sk int, - | cp_catalog_page_id string, - | cp_start_date_sk int, - | cp_end_date_sk int, - | cp_department string, - | cp_catalog_number int, - | cp_catalog_page_number int, - | cp_description string, - | cp_type string - |""".stripMargin, - "customer" -> - s""" - | c_customer_sk int, - | c_customer_id string, - | c_current_cdemo_sk int, - | c_current_hdemo_sk int, - | c_current_addr_sk int, - | c_first_shipto_date_sk int, - | c_first_sales_date_sk int, - | c_salutation string, - | c_first_name string, - | c_last_name string, - | c_preferred_cust_flag string, - | c_birth_day int, - | c_birth_month int, - | c_birth_year int, - | c_birth_country string, - | c_login string, - | c_email_address string, - | c_last_review_date string - |""".stripMargin, - "customer_address" -> - s""" - | ca_address_sk int, - | ca_address_id string, - | ca_street_number string, - | ca_street_name string, - | ca_street_type string, - | ca_suite_number string, - | ca_city string, - | ca_county string, - | ca_state string, - | ca_zip string, - | ca_country string, - | ca_gmt_offset double, - | ca_location_type string - |""".stripMargin, - "customer_demographics" -> - s""" - | cd_demo_sk int, - | cd_gender string, - | cd_marital_status string, - | cd_education_status string, - | cd_purchase_estimate int, - | cd_credit_rating string, - | cd_dep_count int, - | cd_dep_employed_count int, - | cd_dep_college_count int - |""".stripMargin, - "date_dim" -> - s""" - | d_date_sk int, - | d_date_id string, - | d_date date, - | d_month_seq int, - | d_week_seq int, - | d_quarter_seq int, - | d_year int, - | d_dow int, - | d_moy int, - | d_dom int, - | d_qoy int, - | d_fy_year int, - | d_fy_quarter_seq int, - | d_fy_week_seq int, - | d_day_name string, - | d_quarter_name string, - | d_holiday string, - | d_weekend string, - | d_following_holiday string, - | d_first_dom int, - | d_last_dom int, - | d_same_day_ly int, - | d_same_day_lq int, - | d_current_day string, - | d_current_week string, - | d_current_month string, - | d_current_quarter string, - | d_current_year string - |""".stripMargin, - "household_demographics" -> - s""" - | hd_demo_sk int, - | hd_income_band_sk int, - | hd_buy_potential string, - | hd_dep_count int, - | hd_vehicle_count int - |""".stripMargin, - "income_band" -> - s""" - | ib_income_band_sk int, - | ib_lower_bound int, - | ib_upper_bound int - |""".stripMargin, - "item" -> - s""" - | i_item_sk int, - | i_item_id string, - | i_rec_start_date date, - | i_rec_end_date date, - | i_item_desc string, - | i_current_price double, - | i_wholesale_cost double, - | i_brand_id int, - | i_brand string, - | i_class_id int, - | i_class string, - | i_category_id int, - | i_category string, - | i_manufact_id int, - | i_manufact string, - | i_size string, - | i_formulation string, - | i_color string, - | i_units string, - | i_container string, - | i_manager_id int, - | i_product_name string - |""".stripMargin, - "promotion" -> - s""" - | p_promo_sk int, - | p_promo_id string, - | p_start_date_sk int, - | p_end_date_sk int, - | p_item_sk int, - | p_cost double, - | p_response_target int, - | p_promo_name string, - | p_channel_dmail string, - | p_channel_email string, - | p_channel_catalog string, - | p_channel_tv string, - | p_channel_radio string, - | p_channel_press string, - | p_channel_event string, - | p_channel_demo string, - | p_channel_details string, - | p_purpose string, - | p_discount_active string - |""".stripMargin, - "reason" -> - s""" - | r_reason_sk int, - | r_reason_id string, - | r_reason_desc string - |""".stripMargin, - "ship_mode" -> - s""" - | sm_ship_mode_sk int, - | sm_ship_mode_id string, - | sm_type string, - | sm_code string, - | sm_carrier string, - | sm_contract string - |""".stripMargin, - "store" -> - s""" - | s_store_sk int, - | s_store_id string, - | s_rec_start_date date, - | s_rec_end_date date, - | s_closed_date_sk int, - | s_store_name string, - | s_number_employees int, - | s_floor_space int, - | s_hours string, - | s_manager string, - | s_market_id int, - | s_geography_class string, - | s_market_desc string, - | s_market_manager string, - | s_division_id int, - | s_division_name string, - | s_company_id int, - | s_company_name string, - | s_street_number string, - | s_street_name string, - | s_street_type string, - | s_suite_number string, - | s_city string, - | s_county string, - | s_state string, - | s_zip string, - | s_country string, - | s_gmt_offset double, - | s_tax_precentage double - |""".stripMargin, - "time_dim" -> - s""" - | t_time_sk int, - | t_time_id string, - | t_time int, - | t_hour int, - | t_minute int, - | t_second int, - | t_am_pm string, - | t_shift string, - | t_sub_shift string, - | t_meal_time string - |""".stripMargin, - "warehouse" -> - s""" - | w_warehouse_sk int, - | w_warehouse_id string, - | w_warehouse_name string, - | w_warehouse_sq_ft int, - | w_street_number string, - | w_street_name string, - | w_street_type string, - | w_suite_number string, - | w_city string, - | w_county string, - | w_state string, - | w_zip string, - | w_country string, - | w_gmt_offset double - |""".stripMargin, - "web_page" -> - s""" - | wp_web_page_sk int, - | wp_web_page_id string, - | wp_rec_start_date date, - | wp_rec_end_date date, - | wp_creation_date_sk int, - | wp_access_date_sk int, - | wp_autogen_flag string, - | wp_customer_sk int, - | wp_url string, - | wp_type string, - | wp_char_count int, - | wp_link_count int, - | wp_image_count int, - | wp_max_ad_count int - |""".stripMargin, - "web_site" -> - s""" - | web_site_sk int, - | web_site_id string, - | web_rec_start_date date, - | web_rec_end_date date, - | web_name string, - | web_open_date_sk int, - | web_close_date_sk int, - | web_class string, - | web_manager string, - | web_mkt_id int, - | web_mkt_class string, - | web_mkt_desc string, - | web_market_manager string, - | web_company_id int, - | web_company_name string, - | web_street_number string, - | web_street_name string, - | web_street_type string, - | web_suite_number string, - | web_city string, - | web_county string, - | web_state string, - | web_zip string, - | web_country string, - | web_gmt_offset double, - | web_tax_percentage double - |""".stripMargin - ) + private def customizedTableColumnsV1(decimal: Boolean): Map[String, String] = { + val common_float_type = if (decimal) { + "decimal(7,2)" + } else { + "DOUBLE" + } + + val common_float_type2 = if (decimal) { + "decimal(5,2)" + } else { + "DOUBLE" + } + + val common_float_type3 = if (decimal) { + "decimal(15,2)" + } else { + "DOUBLE" + } + + Map( + "catalog_sales" -> + s""" + | cs_sold_date_sk INT, + | cs_sold_time_sk INT, + | cs_ship_date_sk INT, + | cs_bill_customer_sk INT, + | cs_bill_cdemo_sk INT, + | cs_bill_hdemo_sk INT, + | cs_bill_addr_sk INT, + | cs_ship_customer_sk INT, + | cs_ship_cdemo_sk INT, + | cs_ship_hdemo_sk INT, + | cs_ship_addr_sk INT, + | cs_call_center_sk INT, + | cs_catalog_page_sk INT, + | cs_ship_mode_sk INT, + | cs_warehouse_sk INT, + | cs_item_sk INT, + | cs_promo_sk INT, + | cs_order_number LONG, + | cs_quantity INT, + | cs_wholesale_cost $common_float_type, + | cs_list_price $common_float_type, + | cs_sales_price $common_float_type, + | cs_ext_discount_amt $common_float_type, + | cs_ext_sales_price $common_float_type, + | cs_ext_wholesale_cost $common_float_type, + | cs_ext_list_price $common_float_type, + | cs_ext_tax $common_float_type, + | cs_coupon_amt $common_float_type, + | cs_ext_ship_cost $common_float_type, + | cs_net_paid $common_float_type, + | cs_net_paid_inc_tax $common_float_type, + | cs_net_paid_inc_ship $common_float_type, + | cs_net_paid_inc_ship_tax $common_float_type, + | cs_net_profit $common_float_type + |""".stripMargin, + "catalog_returns" -> + s""" + | cr_returned_date_sk INT, + | cr_returned_time_sk INT, + | cr_item_sk INT, + | cr_refunded_customer_sk INT, + | cr_refunded_cdemo_sk INT, + | cr_refunded_hdemo_sk INT, + | cr_refunded_addr_sk INT, + | cr_returning_customer_sk INT, + | cr_returning_cdemo_sk INT, + | cr_returning_hdemo_sk INT, + | cr_returning_addr_sk INT, + | cr_call_center_sk INT, + | cr_catalog_page_sk INT, + | cr_ship_mode_sk INT, + | cr_warehouse_sk INT, + | cr_reason_sk INT, + | cr_order_number LONG, + | cr_return_quantity INT, + | cr_return_amount $common_float_type, + | cr_return_tax $common_float_type, + | cr_return_amt_inc_tax $common_float_type, + | cr_fee $common_float_type, + | cr_return_ship_cost $common_float_type, + | cr_refunded_cash $common_float_type, + | cr_reversed_charge $common_float_type, + | cr_store_credit $common_float_type, + | cr_net_loss $common_float_type + |""".stripMargin, + "inventory" -> + s""" + | inv_date_sk INT, + | inv_item_sk INT, + | inv_warehouse_sk INT, + | inv_quantity_on_hand INT + |""".stripMargin, + "store_sales" -> + s""" + | ss_sold_date_sk INT, + | ss_sold_time_sk INT, + | ss_item_sk INT, + | ss_customer_sk INT, + | ss_cdemo_sk INT, + | ss_hdemo_sk INT, + | ss_addr_sk INT, + | ss_store_sk INT, + | ss_promo_sk INT, + | ss_ticket_number LONG, + | ss_quantity INT, + | ss_wholesale_cost $common_float_type, + | ss_list_price $common_float_type, + | ss_sales_price $common_float_type, + | ss_ext_discount_amt $common_float_type, + | ss_ext_sales_price $common_float_type, + | ss_ext_wholesale_cost $common_float_type, + | ss_ext_list_price $common_float_type, + | ss_ext_tax $common_float_type, + | ss_coupon_amt $common_float_type, + | ss_net_paid $common_float_type, + | ss_net_paid_inc_tax $common_float_type, + | ss_net_profit $common_float_type + |""".stripMargin, + "store_returns" -> + s""" + | sr_returned_date_sk INT, + | sr_return_time_sk INT, + | sr_item_sk INT, + | sr_customer_sk INT, + | sr_cdemo_sk INT, + | sr_hdemo_sk INT, + | sr_addr_sk INT, + | sr_store_sk INT, + | sr_reason_sk INT, + | sr_ticket_number LONG, + | sr_return_quantity INT, + | sr_return_amt $common_float_type, + | sr_return_tax $common_float_type, + | sr_return_amt_inc_tax $common_float_type, + | sr_fee $common_float_type, + | sr_return_ship_cost $common_float_type, + | sr_refunded_cash $common_float_type, + | sr_reversed_charge $common_float_type, + | sr_store_credit $common_float_type, + | sr_net_loss $common_float_type + |""".stripMargin, + "web_sales" -> + s""" + | ws_sold_date_sk INT, + | ws_sold_time_sk INT, + | ws_ship_date_sk INT, + | ws_item_sk INT, + | ws_bill_customer_sk INT, + | ws_bill_cdemo_sk INT, + | ws_bill_hdemo_sk INT, + | ws_bill_addr_sk INT, + | ws_ship_customer_sk INT, + | ws_ship_cdemo_sk INT, + | ws_ship_hdemo_sk INT, + | ws_ship_addr_sk INT, + | ws_web_page_sk INT, + | ws_web_site_sk INT, + | ws_ship_mode_sk INT, + | ws_warehouse_sk INT, + | ws_promo_sk INT, + | ws_order_number LONG, + | ws_quantity INT, + | ws_wholesale_cost $common_float_type, + | ws_list_price $common_float_type, + | ws_sales_price $common_float_type, + | ws_ext_discount_amt $common_float_type, + | ws_ext_sales_price $common_float_type, + | ws_ext_wholesale_cost $common_float_type, + | ws_ext_list_price $common_float_type, + | ws_ext_tax $common_float_type, + | ws_coupon_amt $common_float_type, + | ws_ext_ship_cost $common_float_type, + | ws_net_paid $common_float_type, + | ws_net_paid_inc_tax $common_float_type, + | ws_net_paid_inc_ship $common_float_type, + | ws_net_paid_inc_ship_tax $common_float_type, + | ws_net_profit $common_float_type + |""".stripMargin, + "web_returns" -> + s""" + | wr_returned_date_sk INT, + | wr_returned_time_sk INT, + | wr_item_sk INT, + | wr_refunded_customer_sk INT, + | wr_refunded_cdemo_sk INT, + | wr_refunded_hdemo_sk INT, + | wr_refunded_addr_sk INT, + | wr_returning_customer_sk INT, + | wr_returning_cdemo_sk INT, + | wr_returning_hdemo_sk INT, + | wr_returning_addr_sk INT, + | wr_web_page_sk INT, + | wr_reason_sk INT, + | wr_order_number LONG, + | wr_return_quantity INT, + | wr_return_amt $common_float_type, + | wr_return_tax $common_float_type, + | wr_return_amt_inc_tax $common_float_type, + | wr_fee $common_float_type, + | wr_return_ship_cost $common_float_type, + | wr_refunded_cash $common_float_type, + | wr_reversed_charge $common_float_type, + | wr_account_credit $common_float_type, + | wr_net_loss $common_float_type + |""".stripMargin, + "call_center" -> + s""" + | cc_call_center_sk INT, + | cc_call_center_id STRING, + | cc_rec_start_date DATE, + | cc_rec_end_date DATE, + | cc_closed_date_sk INT, + | cc_open_date_sk INT, + | cc_name STRING, + | cc_class STRING, + | cc_employees INT, + | cc_sq_ft INT, + | cc_hours STRING, + | cc_manager STRING, + | cc_mkt_id INT, + | cc_mkt_class STRING, + | cc_mkt_desc STRING, + | cc_market_manager STRING, + | cc_division INT, + | cc_division_name STRING, + | cc_company INT, + | cc_company_name STRING, + | cc_street_number STRING, + | cc_street_name STRING, + | cc_street_type STRING, + | cc_suite_number STRING, + | cc_city STRING, + | cc_county STRING, + | cc_state STRING, + | cc_zip STRING, + | cc_country STRING, + | cc_gmt_offset $common_float_type2, + | cc_tax_percentage $common_float_type2 + |""".stripMargin, + "catalog_page" -> + s""" + | cp_catalog_page_sk int, + | cp_catalog_page_id string, + | cp_start_date_sk int, + | cp_end_date_sk int, + | cp_department string, + | cp_catalog_number int, + | cp_catalog_page_number int, + | cp_description string, + | cp_type string + |""".stripMargin, + "customer" -> + s""" + | c_customer_sk int, + | c_customer_id string, + | c_current_cdemo_sk int, + | c_current_hdemo_sk int, + | c_current_addr_sk int, + | c_first_shipto_date_sk int, + | c_first_sales_date_sk int, + | c_salutation string, + | c_first_name string, + | c_last_name string, + | c_preferred_cust_flag string, + | c_birth_day int, + | c_birth_month int, + | c_birth_year int, + | c_birth_country string, + | c_login string, + | c_email_address string, + | c_last_review_date string + |""".stripMargin, + "customer_address" -> + s""" + | ca_address_sk int, + | ca_address_id string, + | ca_street_number string, + | ca_street_name string, + | ca_street_type string, + | ca_suite_number string, + | ca_city string, + | ca_county string, + | ca_state string, + | ca_zip string, + | ca_country string, + | ca_gmt_offset $common_float_type2, + | ca_location_type string + |""".stripMargin, + "customer_demographics" -> + s""" + | cd_demo_sk int, + | cd_gender string, + | cd_marital_status string, + | cd_education_status string, + | cd_purchase_estimate int, + | cd_credit_rating string, + | cd_dep_count int, + | cd_dep_employed_count int, + | cd_dep_college_count int + |""".stripMargin, + "date_dim" -> + s""" + | d_date_sk int, + | d_date_id string, + | d_date date, + | d_month_seq int, + | d_week_seq int, + | d_quarter_seq int, + | d_year int, + | d_dow int, + | d_moy int, + | d_dom int, + | d_qoy int, + | d_fy_year int, + | d_fy_quarter_seq int, + | d_fy_week_seq int, + | d_day_name string, + | d_quarter_name string, + | d_holiday string, + | d_weekend string, + | d_following_holiday string, + | d_first_dom int, + | d_last_dom int, + | d_same_day_ly int, + | d_same_day_lq int, + | d_current_day string, + | d_current_week string, + | d_current_month string, + | d_current_quarter string, + | d_current_year string + |""".stripMargin, + "household_demographics" -> + s""" + | hd_demo_sk int, + | hd_income_band_sk int, + | hd_buy_potential string, + | hd_dep_count int, + | hd_vehicle_count int + |""".stripMargin, + "income_band" -> + s""" + | ib_income_band_sk int, + | ib_lower_bound int, + | ib_upper_bound int + |""".stripMargin, + "item" -> + s""" + | i_item_sk int, + | i_item_id string, + | i_rec_start_date date, + | i_rec_end_date date, + | i_item_desc string, + | i_current_price $common_float_type, + | i_wholesale_cost $common_float_type, + | i_brand_id int, + | i_brand string, + | i_class_id int, + | i_class string, + | i_category_id int, + | i_category string, + | i_manufact_id int, + | i_manufact string, + | i_size string, + | i_formulation string, + | i_color string, + | i_units string, + | i_container string, + | i_manager_id int, + | i_product_name string + |""".stripMargin, + "promotion" -> + s""" + | p_promo_sk int, + | p_promo_id string, + | p_start_date_sk int, + | p_end_date_sk int, + | p_item_sk int, + | p_cost $common_float_type3, + | p_response_target int, + | p_promo_name string, + | p_channel_dmail string, + | p_channel_email string, + | p_channel_catalog string, + | p_channel_tv string, + | p_channel_radio string, + | p_channel_press string, + | p_channel_event string, + | p_channel_demo string, + | p_channel_details string, + | p_purpose string, + | p_discount_active string + |""".stripMargin, + "reason" -> + s""" + | r_reason_sk int, + | r_reason_id string, + | r_reason_desc string + |""".stripMargin, + "ship_mode" -> + s""" + | sm_ship_mode_sk int, + | sm_ship_mode_id string, + | sm_type string, + | sm_code string, + | sm_carrier string, + | sm_contract string + |""".stripMargin, + "store" -> + s""" + | s_store_sk int, + | s_store_id string, + | s_rec_start_date date, + | s_rec_end_date date, + | s_closed_date_sk int, + | s_store_name string, + | s_number_employees int, + | s_floor_space int, + | s_hours string, + | s_manager string, + | s_market_id int, + | s_geography_class string, + | s_market_desc string, + | s_market_manager string, + | s_division_id int, + | s_division_name string, + | s_company_id int, + | s_company_name string, + | s_street_number string, + | s_street_name string, + | s_street_type string, + | s_suite_number string, + | s_city string, + | s_county string, + | s_state string, + | s_zip string, + | s_country string, + | s_gmt_offset $common_float_type2, + | s_tax_precentage $common_float_type2 + |""".stripMargin, + "time_dim" -> + s""" + | t_time_sk int, + | t_time_id string, + | t_time int, + | t_hour int, + | t_minute int, + | t_second int, + | t_am_pm string, + | t_shift string, + | t_sub_shift string, + | t_meal_time string + |""".stripMargin, + "warehouse" -> + s""" + | w_warehouse_sk int, + | w_warehouse_id string, + | w_warehouse_name string, + | w_warehouse_sq_ft int, + | w_street_number string, + | w_street_name string, + | w_street_type string, + | w_suite_number string, + | w_city string, + | w_county string, + | w_state string, + | w_zip string, + | w_country string, + | w_gmt_offset $common_float_type2 + |""".stripMargin, + "web_page" -> + s""" + | wp_web_page_sk int, + | wp_web_page_id string, + | wp_rec_start_date date, + | wp_rec_end_date date, + | wp_creation_date_sk int, + | wp_access_date_sk int, + | wp_autogen_flag string, + | wp_customer_sk int, + | wp_url string, + | wp_type string, + | wp_char_count int, + | wp_link_count int, + | wp_image_count int, + | wp_max_ad_count int + |""".stripMargin, + "web_site" -> + s""" + | web_site_sk int, + | web_site_id string, + | web_rec_start_date date, + | web_rec_end_date date, + | web_name string, + | web_open_date_sk int, + | web_close_date_sk int, + | web_class string, + | web_manager string, + | web_mkt_id int, + | web_mkt_class string, + | web_mkt_desc string, + | web_market_manager string, + | web_company_id int, + | web_company_name string, + | web_street_number string, + | web_street_name string, + | web_street_type string, + | web_suite_number string, + | web_city string, + | web_county string, + | web_state string, + | web_zip string, + | web_country string, + | web_gmt_offset $common_float_type2, + | web_tax_percentage $common_float_type2 + |""".stripMargin + ) + } private val customizedTableColumnsV2: Map[String, String] = Map( "store_sales" -> @@ -1050,8 +1071,9 @@ object GenTPCDSTableScripts { dbName: String, dataPathRoot: String, tablePrefix: String, - tableSuffix: String): ArrayBuffer[String] = { - val schemaVersion = 1 + tableSuffix: String, + schemaVersion: Int = 1): ArrayBuffer[String] = { + val catalogSalesTbl = "catalog_sales" val catalogSalesPartitionCols = "PARTITIONED BY (cs_sold_date_sk)" diff --git a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseDatetimeExpressionSuite.scala b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseDatetimeExpressionSuite.scala index 53416607521ef..a1749efb18b2a 100644 --- a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseDatetimeExpressionSuite.scala +++ b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseDatetimeExpressionSuite.scala @@ -162,4 +162,26 @@ class GlutenClickHouseDatetimeExpressionSuite |""".stripMargin compareResultsAgainstVanillaSpark(sql, true, { _ => }) } + + test("support range partition by timestamp") { + import testImplicits._ + val df = Seq( + (1, Timestamp.valueOf("2015-07-22 10:01:40.123456")), + (2, Timestamp.valueOf("2014-12-31 05:29:06.123456")), + (3, Timestamp.valueOf("2015-07-22 16:01:40.123456")), + (4, Timestamp.valueOf("2012-02-29 23:01:40.123456")) + ).toDF("i", "t") + + df.createOrReplaceTempView("test") + + val sql = + s""" + | select + | /** repartition(2) */ + | * + | from test + | order by t + |""".stripMargin + compareResultsAgainstVanillaSpark(sql, compareResult = true, { _ => }) + } } diff --git a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseMergeTreePathBasedWriteSuite.scala b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseMergeTreePathBasedWriteSuite.scala index 79d663debcdec..129f5405c28f4 100644 --- a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseMergeTreePathBasedWriteSuite.scala +++ b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseMergeTreePathBasedWriteSuite.scala @@ -20,6 +20,7 @@ import org.apache.spark.SparkConf import org.apache.spark.sql.SaveMode import org.apache.spark.sql.delta.catalog.ClickHouseTableV2 import org.apache.spark.sql.delta.files.TahoeFileIndex +import org.apache.spark.sql.execution.LocalTableScanExec import org.apache.spark.sql.execution.adaptive.AdaptiveSparkPlanHelper import org.apache.spark.sql.execution.datasources.v2.clickhouse.metadata.AddMergeTreeParts import org.apache.spark.sql.functions._ @@ -281,8 +282,8 @@ class GlutenClickHouseMergeTreePathBasedWriteSuite .format("clickhouse") .load(dataPath) .where("l_shipdate = date'1998-09-02'") - .collect() - assertResult(110501)(result.apply(0).get(0)) + .count() + assertResult(183L)(result) } test("test mergetree path based insert overwrite partitioned table with small table, static") { @@ -1305,5 +1306,34 @@ class GlutenClickHouseMergeTreePathBasedWriteSuite dataFileList = dataPathFile.list(fileFilter) assertResult(6)(dataFileList.length) } + + test("GLUTEN-6378: Support delta count optimizer for the MergeTree format") { + val dataPath = s"$basePath/lineitem_mergetree_count_opti" + clearDataPath(dataPath) + + val sourceDF = spark.sql(s""" + |select * from lineitem + |""".stripMargin) + + sourceDF.write + .format("clickhouse") + .partitionBy("l_shipdate", "l_returnflag") + .option("clickhouse.orderByKey", "l_orderkey") + .option("clickhouse.primaryKey", "l_orderkey") + .mode(SaveMode.Append) + .save(dataPath) + + val df = spark.read + .format("clickhouse") + .load(dataPath) + .groupBy() + .count() + val result = df.collect() + assertResult(600572)(result(0).getLong(0)) + // Spark 3.2 + Delta 2.0 does not support this feature + if (!sparkVersion.equals("3.2")) { + assert(df.queryExecution.executedPlan.isInstanceOf[LocalTableScanExec]) + } + } } // scalastyle:off line.size.limit diff --git a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseMergeTreeWriteOnHDFSSuite.scala b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseMergeTreeWriteOnHDFSSuite.scala index 99b2120599666..bbfac80a7374a 100644 --- a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseMergeTreeWriteOnHDFSSuite.scala +++ b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseMergeTreeWriteOnHDFSSuite.scala @@ -652,7 +652,7 @@ class GlutenClickHouseMergeTreeWriteOnHDFSSuite it.next() files += 1 } - assertResult(72)(files) + assertResult(4)(files) } } } diff --git a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseMergeTreeWriteSuite.scala b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseMergeTreeWriteSuite.scala index 27bd4372aa643..e88eb1fedd426 100644 --- a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseMergeTreeWriteSuite.scala +++ b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseMergeTreeWriteSuite.scala @@ -20,6 +20,7 @@ import org.apache.spark.SparkConf import org.apache.spark.sql.{DataFrame, SaveMode} import org.apache.spark.sql.delta.catalog.ClickHouseTableV2 import org.apache.spark.sql.delta.files.TahoeFileIndex +import org.apache.spark.sql.execution.LocalTableScanExec import org.apache.spark.sql.execution.adaptive.AdaptiveSparkPlanHelper import org.apache.spark.sql.execution.datasources.v2.clickhouse.metadata.AddMergeTreeParts @@ -357,34 +358,10 @@ class GlutenClickHouseMergeTreeWriteSuite |""".stripMargin val df = spark.sql(sql1) - val result = df.collect() assertResult(1)( // in test data, there are only 1 row with l_orderkey = 12647 - result.apply(0).get(0) + df.collect().apply(0).get(0) ) - val scanExec = collect(df.queryExecution.executedPlan) { - case f: FileSourceScanExecTransformer => f - } - assertResult(1)(scanExec.size) - - val mergetreeScan = scanExec.head - assert(mergetreeScan.nodeName.startsWith("Scan mergetree")) - - val fileIndex = mergetreeScan.relation.location.asInstanceOf[TahoeFileIndex] - assert(ClickHouseTableV2.getTable(fileIndex.deltaLog).clickhouseTableConfigs.nonEmpty) - assert(ClickHouseTableV2.getTable(fileIndex.deltaLog).bucketOption.isEmpty) - assert(ClickHouseTableV2.getTable(fileIndex.deltaLog).orderByKeyOption.isEmpty) - assert(ClickHouseTableV2.getTable(fileIndex.deltaLog).primaryKeyOption.isEmpty) - assert(ClickHouseTableV2.getTable(fileIndex.deltaLog).partitionColumns.isEmpty) - val addFiles = fileIndex.matchingFiles(Nil, Nil).map(f => f.asInstanceOf[AddMergeTreeParts]) - assertResult(600572)(addFiles.map(_.rows).sum) - - // 4 parts belong to the first batch - // 2 parts belong to the second batch (1 actual updated part, 1 passively updated). - assertResult(6)(addFiles.size) - val filePaths = addFiles.map(_.path).groupBy(name => name.substring(0, name.lastIndexOf("_"))) - assertResult(2)(filePaths.size) - assertResult(Array(2, 4))(filePaths.values.map(paths => paths.size).toArray.sorted) } val sql2 = @@ -439,22 +416,9 @@ class GlutenClickHouseMergeTreeWriteSuite val df = spark.sql(s""" | select count(*) from lineitem_mergetree_delete |""".stripMargin) - val result = df.collect() assertResult(600571)( - result.apply(0).get(0) + df.collect().apply(0).get(0) ) - val scanExec = collect(df.queryExecution.executedPlan) { - case f: FileSourceScanExecTransformer => f - } - val mergetreeScan = scanExec.head - val fileIndex = mergetreeScan.relation.location.asInstanceOf[TahoeFileIndex] - val addFiles = fileIndex.matchingFiles(Nil, Nil).map(f => f.asInstanceOf[AddMergeTreeParts]) - // 4 parts belong to the first batch - // 2 parts belong to the second batch (1 actual updated part, 1 passively updated). - assertResult(6)(addFiles.size) - val filePaths = addFiles.map(_.path).groupBy(name => name.substring(0, name.lastIndexOf("_"))) - assertResult(2)(filePaths.size) - assertResult(Array(2, 4))(filePaths.values.map(paths => paths.size).toArray.sorted) } { @@ -1491,19 +1455,6 @@ class GlutenClickHouseMergeTreeWriteSuite val result = df.collect() assertResult(1)(result.length) assertResult(10)(result(0).getLong(0)) - - val scanExec = collect(df.queryExecution.executedPlan) { - case f: FileSourceScanExecTransformer => f - } - assertResult(1)(scanExec.size) - - val mergetreeScan = scanExec.head - assert(mergetreeScan.nodeName.startsWith("Scan mergetree")) - - val fileIndex = mergetreeScan.relation.location.asInstanceOf[TahoeFileIndex] - val addFiles = fileIndex.matchingFiles(Nil, Nil).map(f => f.asInstanceOf[AddMergeTreeParts]) - assertResult(1)(addFiles.size) - assertResult(10)(addFiles.head.rows) }) } @@ -1962,5 +1913,63 @@ class GlutenClickHouseMergeTreeWriteSuite } }) } + + test("GLUTEN-6378: Support delta count optimizer for the MergeTree format") { + spark.sql(s""" + |DROP TABLE IF EXISTS lineitem_mergetree_count_opti; + |""".stripMargin) + + spark.sql(s""" + |CREATE TABLE IF NOT EXISTS lineitem_mergetree_count_opti + |( + | l_orderkey bigint, + | l_partkey bigint, + | l_suppkey bigint, + | l_linenumber bigint, + | l_quantity double, + | l_extendedprice double, + | l_discount double, + | l_tax double, + | l_returnflag string, + | l_linestatus string, + | l_shipdate date, + | l_commitdate date, + | l_receiptdate date, + | l_shipinstruct string, + | l_shipmode string, + | l_comment string + |) + |USING clickhouse + |PARTITIONED BY (l_shipdate, l_returnflag) + |TBLPROPERTIES (orderByKey='l_orderkey', + | primaryKey='l_orderkey') + |LOCATION '$basePath/lineitem_mergetree_count_opti' + |""".stripMargin) + + // dynamic partitions + spark.sql(s""" + | insert into table lineitem_mergetree_count_opti + | select * from lineitem + |""".stripMargin) + + val sqlStr = + s""" + |SELECT + | count(*) AS count_order + |FROM + | lineitem_mergetree_count_opti + |""".stripMargin + runSql(sqlStr)( + df => { + val result = df.collect() + assertResult(1)(result.length) + assertResult("600572")(result(0).getLong(0).toString) + + // Spark 3.2 + Delta 2.0 does not support this feature + if (!sparkVersion.equals("3.2")) { + assert(df.queryExecution.executedPlan.isInstanceOf[LocalTableScanExec]) + } + }) + } } // scalastyle:off line.size.limit diff --git a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseMergeTreeWriteTaskNotSerializableSuite.scala b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseMergeTreeWriteTaskNotSerializableSuite.scala new file mode 100644 index 0000000000000..e8550fb32dd97 --- /dev/null +++ b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseMergeTreeWriteTaskNotSerializableSuite.scala @@ -0,0 +1,120 @@ +/* + * 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. + */ +package org.apache.gluten.execution + +import org.apache.gluten.backendsapi.clickhouse.CHBackendSettings + +import org.apache.spark.SparkConf +import org.apache.spark.sql.execution.adaptive.AdaptiveSparkPlanHelper + +// Some sqls' line length exceeds 100 +// scalastyle:off line.size.limit + +class GlutenClickHouseMergeTreeWriteTaskNotSerializableSuite + extends GlutenClickHouseTPCHAbstractSuite + with AdaptiveSparkPlanHelper { + + override protected val needCopyParquetToTablePath = true + + override protected val tablesPath: String = basePath + "/tpch-data" + override protected val tpchQueries: String = rootPath + "queries/tpch-queries-ch" + override protected val queriesResults: String = rootPath + "mergetree-queries-output" + + /** Run Gluten + ClickHouse Backend with SortShuffleManager */ + override protected def sparkConf: SparkConf = { + super.sparkConf + .set("spark.shuffle.manager", "org.apache.spark.shuffle.sort.ColumnarShuffleManager") + .set("spark.io.compression.codec", "LZ4") + .set("spark.sql.shuffle.partitions", "5") + .set("spark.sql.autoBroadcastJoinThreshold", "10MB") + .set("spark.sql.adaptive.enabled", "true") + .set("spark.sql.files.maxPartitionBytes", "20000000") + .set("spark.memory.offHeap.size", "4G") + } + + override protected def createTPCHNotNullTables(): Unit = { + createNotNullTPCHTablesInParquet(tablesPath) + } + + test("GLUTEN-6470: Fix Task not serializable error when inserting mergetree data") { + + val externalSortKey = s"${CHBackendSettings.getBackendConfigPrefix}.runtime_settings" + + s".max_bytes_before_external_sort" + assertResult(3435973836L)(spark.conf.get(externalSortKey).toLong) + + spark.sql(s""" + |DROP TABLE IF EXISTS lineitem_task_not_serializable; + |""".stripMargin) + + spark.sql(s""" + |CREATE TABLE IF NOT EXISTS lineitem_task_not_serializable + |( + | l_orderkey bigint, + | l_partkey bigint, + | l_suppkey bigint, + | l_linenumber bigint, + | l_quantity double, + | l_extendedprice double, + | l_discount double, + | l_tax double, + | l_returnflag string, + | l_linestatus string, + | l_shipdate date, + | l_commitdate date, + | l_receiptdate date, + | l_shipinstruct string, + | l_shipmode string, + | l_comment string + |) + |USING clickhouse + |LOCATION '$basePath/lineitem_task_not_serializable' + |""".stripMargin) + + spark.sql(s""" + | insert into table lineitem_task_not_serializable + | select * from lineitem + |""".stripMargin) + + val sqlStr = + s""" + |SELECT + | l_returnflag, + | l_linestatus, + | sum(l_quantity) AS sum_qty, + | sum(l_extendedprice) AS sum_base_price, + | sum(l_extendedprice * (1 - l_discount)) AS sum_disc_price, + | sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) AS sum_charge, + | avg(l_quantity) AS avg_qty, + | avg(l_extendedprice) AS avg_price, + | avg(l_discount) AS avg_disc, + | count(*) AS count_order + |FROM + | lineitem_task_not_serializable + |WHERE + | l_shipdate <= date'1998-09-02' - interval 1 day + |GROUP BY + | l_returnflag, + | l_linestatus + |ORDER BY + | l_returnflag, + | l_linestatus; + | + |""".stripMargin + runTPCHQueryBySQL(1, sqlStr)(_ => {}) + } +} +// scalastyle:off line.size.limit diff --git a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCDSAbstractSuite.scala b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCDSAbstractSuite.scala index bcdc1f5ef5148..ccde594dfcaae 100644 --- a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCDSAbstractSuite.scala +++ b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCDSAbstractSuite.scala @@ -40,9 +40,11 @@ abstract class GlutenClickHouseTPCDSAbstractSuite override protected def spark: SparkSession = _spark - protected val tablesPath: String = UTSystemParameters.tpcdsDataPath + "/" - protected val tpcdsQueries: String - protected val queriesResults: String + protected val tablesPath: String = UTSystemParameters.tpcdsDecimalDataPath + "/" + protected val db_name: String = "tpcdsdb" + protected val tpcdsQueries: String = + rootPath + "../../../../gluten-core/src/test/resources/tpcds-queries/tpcds.queries.original" + protected val queriesResults: String = rootPath + "tpcds-decimal-queries-output" /** Return values: (sql num, is fall back, skip fall back assert) */ def tpcdsAllQueries(isAqe: Boolean): Seq[(String, Boolean, Boolean)] = @@ -56,17 +58,11 @@ abstract class GlutenClickHouseTPCDSAbstractSuite Seq("q" + "%d".format(queryNum)) } val noFallBack = queryNum match { - case i - if i == 10 || i == 16 || i == 28 || i == 35 || i == 45 || i == 77 || - i == 88 || i == 90 || i == 94 => + case i if i == 10 || i == 16 || i == 35 || i == 45 || i == 94 => // Q10 BroadcastHashJoin, ExistenceJoin // Q16 ShuffledHashJoin, NOT condition - // Q28 BroadcastNestedLoopJoin // Q35 BroadcastHashJoin, ExistenceJoin // Q45 BroadcastHashJoin, ExistenceJoin - // Q77 CartesianProduct - // Q88 BroadcastNestedLoopJoin - // Q90 BroadcastNestedLoopJoin // Q94 BroadcastHashJoin, LeftSemi, NOT condition (false, false) case j if j == 38 || j == 87 => @@ -76,6 +72,9 @@ abstract class GlutenClickHouseTPCDSAbstractSuite } else { (false, true) } + case q77 if q77 == 77 && !isAqe => + // Q77 CartesianProduct + (false, false) case other => (true, false) } sqlNums.map((_, noFallBack._1, noFallBack._2)) @@ -83,8 +82,8 @@ abstract class GlutenClickHouseTPCDSAbstractSuite // FIXME "q17", stddev_samp inconsistent results, CH return NaN, Spark return null protected def excludedTpcdsQueries: Set[String] = Set( - "q18", // inconsistent results "q61", // inconsistent results + "q66", // inconsistent results "q67" // inconsistent results ) @@ -118,11 +117,9 @@ abstract class GlutenClickHouseTPCDSAbstractSuite } } -// override protected def createTPCHNotNullTables(): Unit = {} - protected def createTPCDSTables(): Unit = { val parquetTables = - GenTPCDSTableScripts.genTPCDSParquetTables("tpcdsdb", tablesPath, "", "") + GenTPCDSTableScripts.genTPCDSParquetTables(db_name, tablesPath, "", "", 3) for (sql <- parquetTables) { spark.sql(sql) @@ -199,7 +196,8 @@ abstract class GlutenClickHouseTPCDSAbstractSuite skipFallBackAssert: Boolean = false)(customCheck: DataFrame => Unit): Unit = { val sqlFile = tpcdsQueries + "/" + queryNum + ".sql" - val df = spark.sql(Source.fromFile(new File(sqlFile), "UTF-8").mkString) + val sql = Source.fromFile(new File(sqlFile), "UTF-8").mkString + val df = spark.sql(sql) if (compareResult) { val fields = new util.ArrayList[StructField]() diff --git a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCDSParquetAQESuite.scala b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCDSParquetAQESuite.scala index 828fb510fa455..1960e3002a8ba 100644 --- a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCDSParquetAQESuite.scala +++ b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCDSParquetAQESuite.scala @@ -26,10 +26,6 @@ class GlutenClickHouseTPCDSParquetAQESuite extends GlutenClickHouseTPCDSAbstractSuite with AdaptiveSparkPlanHelper { - override protected val tpcdsQueries: String = - rootPath + "../../../../gluten-core/src/test/resources/tpcds-queries/tpcds.queries.original" - override protected val queriesResults: String = rootPath + "tpcds-queries-output" - /** Run Gluten + ClickHouse Backend with SortShuffleManager */ override protected def sparkConf: SparkConf = { super.sparkConf @@ -63,13 +59,16 @@ class GlutenClickHouseTPCDSParquetAQESuite } test("test reading from partitioned table with partition column filter") { - val result = runSql(""" - |select avg(ss_net_paid_inc_tax) - | from store_sales - | where ss_quantity between 1 and 20 - | and ss_sold_date_sk = 2452635 - |""".stripMargin) { _ => } - AlmostEqualsIsRel(379.21313271604936, result.head.getDouble(0), DBL_RELAX_EPSILON) + compareResultsAgainstVanillaSpark( + """ + |select avg(ss_net_paid_inc_tax) + | from store_sales + | where ss_quantity between 1 and 20 + | and ss_sold_date_sk = 2452635 + |""".stripMargin, + true, + _ => {} + ) } test("test select avg(int), avg(long)") { diff --git a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCDSParquetColumnarShuffleAQESuite.scala b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCDSParquetColumnarShuffleAQESuite.scala index a1c609ea42377..66f1adfb6282c 100644 --- a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCDSParquetColumnarShuffleAQESuite.scala +++ b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCDSParquetColumnarShuffleAQESuite.scala @@ -26,10 +26,6 @@ class GlutenClickHouseTPCDSParquetColumnarShuffleAQESuite extends GlutenClickHouseTPCDSAbstractSuite with AdaptiveSparkPlanHelper { - override protected val tpcdsQueries: String = - rootPath + "../../../../gluten-core/src/test/resources/tpcds-queries/tpcds.queries.original" - override protected val queriesResults: String = rootPath + "tpcds-queries-output" - /** Run Gluten + ClickHouse Backend with SortShuffleManager */ override protected def sparkConf: SparkConf = { super.sparkConf @@ -56,13 +52,16 @@ class GlutenClickHouseTPCDSParquetColumnarShuffleAQESuite } test("test reading from partitioned table with partition column filter") { - val result = runSql(""" - |select avg(ss_net_paid_inc_tax) - | from store_sales - | where ss_quantity between 1 and 20 - | and ss_sold_date_sk = 2452635 - |""".stripMargin) { _ => } - AlmostEqualsIsRel(379.21313271604936, result.head.getDouble(0), DBL_RELAX_EPSILON) + compareResultsAgainstVanillaSpark( + """ + |select avg(ss_net_paid_inc_tax) + | from store_sales + | where ss_quantity between 1 and 20 + | and ss_sold_date_sk = 2452635 + |""".stripMargin, + true, + _ => {} + ) } test("test select avg(int), avg(long)") { diff --git a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCDSParquetColumnarShuffleSuite.scala b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCDSParquetColumnarShuffleSuite.scala index f4c1cc3a62027..ca3db077285f8 100644 --- a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCDSParquetColumnarShuffleSuite.scala +++ b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCDSParquetColumnarShuffleSuite.scala @@ -23,10 +23,6 @@ import org.apache.spark.sql.execution.exchange.ReusedExchangeExec class GlutenClickHouseTPCDSParquetColumnarShuffleSuite extends GlutenClickHouseTPCDSAbstractSuite { - override protected val tpcdsQueries: String = - rootPath + "../../../../gluten-core/src/test/resources/tpcds-queries/tpcds.queries.original" - override protected val queriesResults: String = rootPath + "tpcds-queries-output" - /** Run Gluten + ClickHouse Backend with SortShuffleManager */ override protected def sparkConf: SparkConf = { super.sparkConf @@ -53,13 +49,16 @@ class GlutenClickHouseTPCDSParquetColumnarShuffleSuite extends GlutenClickHouseT } test("test reading from partitioned table with partition column filter") { - val result = runSql(""" - |select avg(ss_net_paid_inc_tax) - | from store_sales - | where ss_quantity between 1 and 20 - | and ss_sold_date_sk = 2452635 - |""".stripMargin) { _ => } - AlmostEqualsIsRel(379.21313271604936, result.head.getDouble(0), DBL_RELAX_EPSILON) + compareResultsAgainstVanillaSpark( + """ + |select avg(ss_net_paid_inc_tax) + | from store_sales + | where ss_quantity between 1 and 20 + | and ss_sold_date_sk = 2452635 + |""".stripMargin, + true, + _ => {} + ) } test("test select avg(int), avg(long)") { diff --git a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCDSParquetGraceHashJoinSuite.scala b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCDSParquetGraceHashJoinSuite.scala index 04ccda29b1aed..a7b3518cc9815 100644 --- a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCDSParquetGraceHashJoinSuite.scala +++ b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCDSParquetGraceHashJoinSuite.scala @@ -22,10 +22,6 @@ import org.apache.spark.sql.execution.exchange.ReusedExchangeExec class GlutenClickHouseTPCDSParquetGraceHashJoinSuite extends GlutenClickHouseTPCDSAbstractSuite { - override protected val tpcdsQueries: String = - rootPath + "../../../../gluten-core/src/test/resources/tpcds-queries/tpcds.queries.original" - override protected val queriesResults: String = rootPath + "tpcds-queries-output" - /** Run Gluten + ClickHouse Backend with SortShuffleManager */ override protected def sparkConf: SparkConf = { super.sparkConf diff --git a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCDSParquetRFSuite.scala b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCDSParquetRFSuite.scala index 77afb6e859ed2..27137c6d92661 100644 --- a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCDSParquetRFSuite.scala +++ b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCDSParquetRFSuite.scala @@ -20,10 +20,6 @@ import org.apache.spark.SparkConf class GlutenClickHouseTPCDSParquetRFSuite extends GlutenClickHouseTPCDSAbstractSuite { - override protected val tpcdsQueries: String = - rootPath + "../../../../gluten-core/src/test/resources/tpcds-queries/tpcds.queries.original" - override protected val queriesResults: String = rootPath + "tpcds-queries-output" - override protected def sparkConf: SparkConf = { super.sparkConf .setMaster(s"local[4]") diff --git a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCDSParquetSortMergeJoinSuite.scala b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCDSParquetSortMergeJoinSuite.scala index b1b9841a3463b..54734b72df3e6 100644 --- a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCDSParquetSortMergeJoinSuite.scala +++ b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCDSParquetSortMergeJoinSuite.scala @@ -22,10 +22,6 @@ import org.apache.spark.SparkConf class GlutenClickHouseTPCDSParquetSortMergeJoinSuite extends GlutenClickHouseTPCDSAbstractSuite { - override protected val tpcdsQueries: String = - rootPath + "../../../../gluten-core/src/test/resources/tpcds-queries/tpcds.queries.original" - override protected val queriesResults: String = rootPath + "tpcds-queries-output" - override protected def excludedTpcdsQueries: Set[String] = Set( // fallback due to left semi/anti "q8", diff --git a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCDSParquetSuite.scala b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCDSParquetSuite.scala index e9c27437b44a0..e20ea35e50db3 100644 --- a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCDSParquetSuite.scala +++ b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCDSParquetSuite.scala @@ -26,10 +26,6 @@ import org.apache.spark.sql.execution.exchange.ReusedExchangeExec class GlutenClickHouseTPCDSParquetSuite extends GlutenClickHouseTPCDSAbstractSuite { - override protected val tpcdsQueries: String = - rootPath + "../../../../gluten-core/src/test/resources/tpcds-queries/tpcds.queries.original" - override protected val queriesResults: String = rootPath + "tpcds-queries-output" - /** Run Gluten + ClickHouse Backend with SortShuffleManager */ override protected def sparkConf: SparkConf = { super.sparkConf @@ -64,13 +60,16 @@ class GlutenClickHouseTPCDSParquetSuite extends GlutenClickHouseTPCDSAbstractSui } test("test reading from partitioned table with partition column filter") { - val result = runSql(""" - |select avg(ss_net_paid_inc_tax) - | from store_sales - | where ss_quantity between 1 and 20 - | and ss_sold_date_sk = 2452635 - |""".stripMargin) { _ => } - AlmostEqualsIsRel(379.21313271604936, result.head.getDouble(0), DBL_RELAX_EPSILON) + compareResultsAgainstVanillaSpark( + """ + |select avg(ss_net_paid_inc_tax) + | from store_sales + | where ss_quantity between 1 and 20 + | and ss_sold_date_sk = 2452635 + |""".stripMargin, + true, + _ => {} + ) } test("test select avg(int), avg(long)") { diff --git a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCHBucketSuite.scala b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCHBucketSuite.scala index 79a708ce50eb2..59912e72222aa 100644 --- a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCHBucketSuite.scala +++ b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCHBucketSuite.scala @@ -739,8 +739,13 @@ class GlutenClickHouseTPCHBucketSuite runSql(SQL6)( df => { checkResult(df, Array(Row(600572))) - // there is a shuffle between two phase hash aggregates. - checkHashAggregateCount(df, 2) + if (sparkVersion.equals("3.2")) { + // there is a shuffle between two phase hash aggregate. + checkHashAggregateCount(df, 2) + } else { + // the delta will use the delta log meta to response this sql + checkHashAggregateCount(df, 0) + } }) // test sort aggregates diff --git a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCHParquetAQEConcurrentSuite.scala b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCHParquetAQEConcurrentSuite.scala index 34e9658fb4197..9f4befbb01a9b 100644 --- a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCHParquetAQEConcurrentSuite.scala +++ b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCHParquetAQEConcurrentSuite.scala @@ -24,6 +24,7 @@ import org.apache.spark.sql.types.DoubleType import java.util.concurrent.ForkJoinPool import scala.collection.parallel.ForkJoinTaskSupport +import scala.collection.parallel.immutable.ParVector class GlutenClickHouseTPCHParquetAQEConcurrentSuite extends GlutenClickHouseTPCHAbstractSuite @@ -74,7 +75,7 @@ class GlutenClickHouseTPCHParquetAQEConcurrentSuite test("fix race condition at the global variable of ColumnarOverrideRules::isAdaptiveContext") { - val queries = ((1 to 22) ++ (1 to 22) ++ (1 to 22) ++ (1 to 22)).par + val queries = ParVector((1 to 22) ++ (1 to 22) ++ (1 to 22) ++ (1 to 22): _*) queries.tasksupport = new ForkJoinTaskSupport(new ForkJoinPool(22)) queries.map(queryId => runTPCHQuery(queryId) { df => }) diff --git a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCHSaltNullParquetSuite.scala b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCHSaltNullParquetSuite.scala index c0f37b08616ea..36dd3778c24b8 100644 --- a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCHSaltNullParquetSuite.scala +++ b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickHouseTPCHSaltNullParquetSuite.scala @@ -978,6 +978,33 @@ class GlutenClickHouseTPCHSaltNullParquetSuite extends GlutenClickHouseTPCHAbstr compareResultsAgainstVanillaSpark(sql, true, { _ => }) } + test("window percent_rank") { + val sql = + """ + |select n_regionkey, n_nationkey, + | percent_rank(n_nationkey) OVER (PARTITION BY n_regionkey ORDER BY n_nationkey) as n_rank + |from nation + |order by n_regionkey, n_nationkey + |""".stripMargin + compareResultsAgainstVanillaSpark(sql, true, { _ => }) + } + + test("window ntile") { + val sql = + """ + | select n_regionkey, n_nationkey, + | first_value(n_nationkey) over (partition by n_regionkey order by n_nationkey) as + | first_v, + | ntile(4) over (partition by n_regionkey order by n_nationkey) as ntile_v + | from + | ( + | select n_regionkey, if(n_nationkey = 1, null, n_nationkey) as n_nationkey from nation + | ) as t + | order by n_regionkey, n_nationkey + """.stripMargin + compareResultsAgainstVanillaSpark(sql, true, { _ => }) + } + test("window first value with nulls") { val sql = """ @@ -1727,7 +1754,7 @@ class GlutenClickHouseTPCHSaltNullParquetSuite extends GlutenClickHouseTPCHAbstr | on t0.a = t1.a | ) t3 | )""".stripMargin - compareResultsAgainstVanillaSpark(sql1, true, { _ => }, false) + compareResultsAgainstVanillaSpark(sql1, true, { _ => }) val sql2 = """ @@ -1748,7 +1775,7 @@ class GlutenClickHouseTPCHSaltNullParquetSuite extends GlutenClickHouseTPCHAbstr | on t0.a = t1.a | ) t3 | )""".stripMargin - compareResultsAgainstVanillaSpark(sql2, true, { _ => }, false) + compareResultsAgainstVanillaSpark(sql2, true, { _ => }) val sql3 = """ @@ -1769,7 +1796,7 @@ class GlutenClickHouseTPCHSaltNullParquetSuite extends GlutenClickHouseTPCHAbstr | on t0.a = t1.a | ) t3 | )""".stripMargin - compareResultsAgainstVanillaSpark(sql3, true, { _ => }, false) + compareResultsAgainstVanillaSpark(sql3, true, { _ => }) val sql4 = """ @@ -1790,7 +1817,7 @@ class GlutenClickHouseTPCHSaltNullParquetSuite extends GlutenClickHouseTPCHAbstr | on t0.a = t1.a | ) t3 | )""".stripMargin - compareResultsAgainstVanillaSpark(sql4, true, { _ => }, false) + compareResultsAgainstVanillaSpark(sql4, true, { _ => }) val sql5 = """ @@ -1811,7 +1838,7 @@ class GlutenClickHouseTPCHSaltNullParquetSuite extends GlutenClickHouseTPCHAbstr | on t0.a = t1.a | ) t3 | )""".stripMargin - compareResultsAgainstVanillaSpark(sql5, true, { _ => }, false) + compareResultsAgainstVanillaSpark(sql5, true, { _ => }) } test("GLUTEN-1874 not null in one stream") { @@ -2700,5 +2727,47 @@ class GlutenClickHouseTPCHSaltNullParquetSuite extends GlutenClickHouseTPCHAbstr compareResultsAgainstVanillaSpark(select_sql, true, { _ => }) spark.sql("drop table test_tbl_4451") } + + test("array functions date add") { + spark.sql("create table tb_date(day Date) using parquet") + spark.sql(""" + |insert into tb_date values + |(cast('2024-06-01' as Date)), + |(cast('2024-06-02' as Date)), + |(cast('2024-06-03' as Date)), + |(cast('2024-06-04' as Date)), + |(cast('2024-06-05' as Date)) + |""".stripMargin) + val sql1 = """ + |select * from tb_date where day between + |'2024-06-01' and + |cast('2024-06-01' as Date) + interval 2 day + |order by day + |""".stripMargin + compareResultsAgainstVanillaSpark(sql1, true, { _ => }) + val sql2 = """ + |select * from tb_date where day between + |'2024-06-01' and + |cast('2024-06-01' as Date) + interval 48 hour + |order by day + |""".stripMargin + compareResultsAgainstVanillaSpark(sql2, true, { _ => }) + val sql3 = """ + |select * from tb_date where day between + |'2024-06-01' and + |cast('2024-06-05' as Date) - interval 2 day + |order by day + |""".stripMargin + compareResultsAgainstVanillaSpark(sql3, true, { _ => }) + val sql4 = """ + |select * from tb_date where day between + |'2024-06-01' and + |cast('2024-06-05' as Date) - interval 48 hour + |order by day + |""".stripMargin + compareResultsAgainstVanillaSpark(sql4, true, { _ => }) + + spark.sql("drop table tb_date") + } } // scalastyle:on line.size.limit diff --git a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickhouseFunctionSuite.scala b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickhouseFunctionSuite.scala index 26e9972812214..8853dfc77853d 100644 --- a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickhouseFunctionSuite.scala +++ b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenClickhouseFunctionSuite.scala @@ -211,4 +211,19 @@ class GlutenClickhouseFunctionSuite extends GlutenClickHouseTPCHAbstractSuite { compareResultsAgainstVanillaSpark(query_sql, true, { _ => }) spark.sql("drop table test") } + + test("intersect all") { + spark.sql("create table t1 (a int, b string) using parquet") + spark.sql("insert into t1 values (1, '1'),(2, '2'),(3, '3'),(4, '4'),(5, '5'),(6, '6')") + spark.sql("create table t2 (a int, b string) using parquet") + spark.sql("insert into t2 values (4, '4'),(5, '5'),(6, '6'),(7, '7'),(8, '8'),(9, '9')") + runQueryAndCompare( + """ + |SELECT a,b FROM t1 INTERSECT ALL SELECT a,b FROM t2 + |""".stripMargin + )(df => checkFallbackOperators(df, 0)) + spark.sql("drop table t1") + spark.sql("drop table t2") + } + } diff --git a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenFunctionValidateSuite.scala b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenFunctionValidateSuite.scala index 9327137fabe5d..d3e3e94460369 100644 --- a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenFunctionValidateSuite.scala +++ b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/GlutenFunctionValidateSuite.scala @@ -713,4 +713,21 @@ class GlutenFunctionValidateSuite extends GlutenClickHouseWholeStageTransformerS } } + + test("array functions with lambda") { + withTable("tb_array") { + sql("create table tb_array(ids array) using parquet") + sql(""" + |insert into tb_array values (array(1,5,2,null, 3)), (array(1,1,3,2)), (null), (array()) + |""".stripMargin) + val transform_sql = "select transform(ids, x -> x + 1) from tb_array" + runQueryAndCompare(transform_sql)(checkGlutenOperatorMatch[ProjectExecTransformer]) + + val filter_sql = "select filter(ids, x -> x % 2 == 1) from tb_array"; + runQueryAndCompare(filter_sql)(checkGlutenOperatorMatch[ProjectExecTransformer]) + + val aggregate_sql = "select ids, aggregate(ids, 3, (acc, x) -> acc + x) from tb_array"; + runQueryAndCompare(aggregate_sql)(checkGlutenOperatorMatch[ProjectExecTransformer]) + } + } } diff --git a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/metrics/GlutenClickHouseTPCDSMetricsSuite.scala b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/metrics/GlutenClickHouseTPCDSMetricsSuite.scala index 5b3d98808201b..be671575aad60 100644 --- a/backends-clickhouse/src/test/scala/org/apache/gluten/execution/metrics/GlutenClickHouseTPCDSMetricsSuite.scala +++ b/backends-clickhouse/src/test/scala/org/apache/gluten/execution/metrics/GlutenClickHouseTPCDSMetricsSuite.scala @@ -28,10 +28,6 @@ import scala.collection.JavaConverters._ class GlutenClickHouseTPCDSMetricsSuite extends GlutenClickHouseTPCDSAbstractSuite { - override protected val tpcdsQueries: String = - rootPath + "../../../../gluten-core/src/test/resources/tpcds-queries/tpcds.queries.original" - override protected val queriesResults: String = rootPath + "tpcds-queries-output" - protected val substraitPlansDatPath: String = rootPath + "substrait-plans" protected val metricsJsonFilePath: String = rootPath + "metrics-json" diff --git a/backends-clickhouse/src/test/scala/org/apache/gluten/utils/UTSystemParameters.scala b/backends-clickhouse/src/test/scala/org/apache/gluten/utils/UTSystemParameters.scala index 059d6cb046ae2..8b797c7f52140 100644 --- a/backends-clickhouse/src/test/scala/org/apache/gluten/utils/UTSystemParameters.scala +++ b/backends-clickhouse/src/test/scala/org/apache/gluten/utils/UTSystemParameters.scala @@ -37,7 +37,9 @@ object UTSystemParameters { } private val TPCDS_DATA_PATH_KEY = "tpcds.data.path" + private val TPCDS_DATA_DECIMAL_PATH_KEY = "tpcds.data.decimal.path" private val TPCDS_RELATIVE_DATA_PATH = "tpcds-data-sf1" + private val TPCDS_DECIMAL_RELATIVE_DATA_PATH = "tpcds-data-sf1-decimal" def tpcdsDataPath: String = { val result = System.getProperty(UTSystemParameters.TPCDS_DATA_PATH_KEY, null) @@ -48,6 +50,15 @@ object UTSystemParameters { } } + def tpcdsDecimalDataPath: String = { + val result = System.getProperty(UTSystemParameters.TPCDS_DATA_DECIMAL_PATH_KEY, null) + if (result == null) { + s"$testDataPath/$TPCDS_DECIMAL_RELATIVE_DATA_PATH" + } else { + result + } + } + private val TEST_MERGETREE_ON_OBJECT_STORAGE = "gluten.ch.test.mergetree.object.storage" private val TEST_MERGETREE_ON_OBJECT_STORAGE_DEFAULT_VALUE = "true" diff --git a/backends-velox/pom.xml b/backends-velox/pom.xml index 70b8b901baac0..de529a34df2fc 100755 --- a/backends-velox/pom.xml +++ b/backends-velox/pom.xml @@ -87,7 +87,7 @@ org.scalacheck scalacheck_${scala.binary.version} - 1.13.5 + 1.17.0 test @@ -113,13 +113,13 @@ org.scalatestplus - scalatestplus-mockito_2.12 + scalatestplus-mockito_${scala.binary.version} 1.0.0-M2 test org.scalatestplus - scalatestplus-scalacheck_2.12 + scalatestplus-scalacheck_${scala.binary.version} 3.1.0.0-RC2 test diff --git a/backends-velox/src/main/scala/org/apache/gluten/backendsapi/velox/VeloxBackend.scala b/backends-velox/src/main/scala/org/apache/gluten/backendsapi/velox/VeloxBackend.scala index 0238508d96995..b0692816af8ca 100644 --- a/backends-velox/src/main/scala/org/apache/gluten/backendsapi/velox/VeloxBackend.scala +++ b/backends-velox/src/main/scala/org/apache/gluten/backendsapi/velox/VeloxBackend.scala @@ -27,7 +27,7 @@ import org.apache.gluten.substrait.rel.LocalFilesNode.ReadFileFormat import org.apache.gluten.substrait.rel.LocalFilesNode.ReadFileFormat.{DwrfReadFormat, OrcReadFormat, ParquetReadFormat} import org.apache.spark.sql.catalyst.catalog.BucketSpec -import org.apache.spark.sql.catalyst.expressions.{Alias, CumeDist, DenseRank, Descending, Expression, Lag, Lead, Literal, MakeYMInterval, NamedExpression, NthValue, NTile, PercentRank, Rand, RangeFrame, Rank, RowNumber, SortOrder, SparkPartitionID, SpecialFrameBoundary, SpecifiedWindowFrame, Uuid} +import org.apache.spark.sql.catalyst.expressions.{Alias, CumeDist, DenseRank, Descending, EulerNumber, Expression, Lag, Lead, Literal, MakeYMInterval, NamedExpression, NthValue, NTile, PercentRank, Pi, Rand, RangeFrame, Rank, RowNumber, SortOrder, SparkPartitionID, SparkVersion, SpecialFrameBoundary, SpecifiedWindowFrame, Uuid} import org.apache.spark.sql.catalyst.expressions.aggregate.{AggregateExpression, ApproximatePercentile, Count, Sum} import org.apache.spark.sql.catalyst.plans.{JoinType, LeftOuter, RightOuter} import org.apache.spark.sql.catalyst.util.CharVarcharUtils @@ -79,9 +79,9 @@ object VeloxBackendSettings extends BackendSettingsApi { // Collect unsupported types. val unsupportedDataTypeReason = fields.collect(validatorFunc) if (unsupportedDataTypeReason.isEmpty) { - ValidationResult.ok + ValidationResult.succeeded } else { - ValidationResult.notOk( + ValidationResult.failed( s"Found unsupported data type in $format: ${unsupportedDataTypeReason.mkString(", ")}.") } } @@ -135,10 +135,10 @@ object VeloxBackendSettings extends BackendSettingsApi { } else { validateTypes(parquetTypeValidatorWithComplexTypeFallback) } - case DwrfReadFormat => ValidationResult.ok + case DwrfReadFormat => ValidationResult.succeeded case OrcReadFormat => if (!GlutenConfig.getConf.veloxOrcScanEnabled) { - ValidationResult.notOk(s"Velox ORC scan is turned off.") + ValidationResult.failed(s"Velox ORC scan is turned off.") } else { val typeValidator: PartialFunction[StructField, String] = { case StructField(_, arrayType: ArrayType, _, _) @@ -164,7 +164,7 @@ object VeloxBackendSettings extends BackendSettingsApi { validateTypes(orcTypeValidatorWithComplexTypeFallback) } } - case _ => ValidationResult.notOk(s"Unsupported file format for $format.") + case _ => ValidationResult.failed(s"Unsupported file format for $format.") } } @@ -284,8 +284,8 @@ object VeloxBackendSettings extends BackendSettingsApi { .orElse(validateDataTypes()) .orElse(validateWriteFilesOptions()) .orElse(validateBucketSpec()) match { - case Some(reason) => ValidationResult.notOk(reason) - case _ => ValidationResult.ok + case Some(reason) => ValidationResult.failed(reason) + case _ => ValidationResult.succeeded } } @@ -430,7 +430,9 @@ object VeloxBackendSettings extends BackendSettingsApi { expr match { // Block directly falling back the below functions by FallbackEmptySchemaRelation. case alias: Alias => checkExpr(alias.child) - case _: Rand | _: Uuid | _: MakeYMInterval | _: SparkPartitionID => true + case _: Rand | _: Uuid | _: MakeYMInterval | _: SparkPartitionID | _: EulerNumber | _: Pi | + _: SparkVersion => + true case _ => false } } @@ -485,13 +487,17 @@ object VeloxBackendSettings extends BackendSettingsApi { override def alwaysFailOnMapExpression(): Boolean = true - override def requiredChildOrderingForWindow(): Boolean = true + override def requiredChildOrderingForWindow(): Boolean = { + GlutenConfig.getConf.veloxColumnarWindowType.equals("streaming") + } + + override def requiredChildOrderingForWindowGroupLimit(): Boolean = false override def staticPartitionWriteOnly(): Boolean = true override def supportTransformWriteFiles: Boolean = true - override def allowDecimalArithmetic: Boolean = SQLConf.get.decimalOperationsAllowPrecisionLoss + override def allowDecimalArithmetic: Boolean = true override def enableNativeWriteFiles(): Boolean = { GlutenConfig.getConf.enableNativeWriter.getOrElse( diff --git a/backends-velox/src/main/scala/org/apache/gluten/backendsapi/velox/VeloxListenerApi.scala b/backends-velox/src/main/scala/org/apache/gluten/backendsapi/velox/VeloxListenerApi.scala index 81f06478cbb60..e5c3cb084819d 100644 --- a/backends-velox/src/main/scala/org/apache/gluten/backendsapi/velox/VeloxListenerApi.scala +++ b/backends-velox/src/main/scala/org/apache/gluten/backendsapi/velox/VeloxListenerApi.scala @@ -78,6 +78,8 @@ class VeloxListenerApi extends ListenerApi { new SharedLibraryLoaderCentos8 } else if (systemName.contains("Anolis") && systemVersion.startsWith("7")) { new SharedLibraryLoaderCentos7 + } else if (system.contains("tencentos") && system.contains("2.4")) { + new SharedLibraryLoaderCentos7 } else if (system.contains("tencentos") && system.contains("3.2")) { new SharedLibraryLoaderCentos8 } else if (systemName.contains("Red Hat") && systemVersion.startsWith("9")) { @@ -94,7 +96,7 @@ class VeloxListenerApi extends ListenerApi { throw new GlutenException( s"Found unsupported OS($systemName, $systemVersion)! Currently, Gluten's Velox backend" + " only supports Ubuntu 20.04/22.04, CentOS 7/8, " + - "Alibaba Cloud Linux 2/3 & Anolis 7/8, tencentos 3.2, RedHat 7/8/9, " + + "Alibaba Cloud Linux 2/3 & Anolis 7/8, tencentos 2.4/3.2, RedHat 7/8, " + "Debian 11/12.") } } @@ -134,28 +136,10 @@ class VeloxListenerApi extends ListenerApi { ) { loadLibFromJar(loader, conf) } - loader - .newTransaction() - .loadAndCreateLink(s"libarrow.so.$ARROW_VERSION.0.0", s"libarrow.so.$ARROW_VERSION", false) - .loadAndCreateLink( - s"libparquet.so.$ARROW_VERSION.0.0", - s"libparquet.so.$ARROW_VERSION", - false) - .commit() } private def loadLibWithMacOS(loader: JniLibLoader): Unit = { - loader - .newTransaction() - .loadAndCreateLink( - s"libarrow.$ARROW_VERSION.0.0.dylib", - s"libarrow.$ARROW_VERSION.dylib", - false) - .loadAndCreateLink( - s"libparquet.$ARROW_VERSION.0.0.dylib", - s"libparquet.$ARROW_VERSION.dylib", - false) - .commit() + // Placeholder for loading shared libs on MacOS if user needs. } private def initialize(conf: SparkConf, isDriver: Boolean): Unit = { diff --git a/backends-velox/src/main/scala/org/apache/gluten/backendsapi/velox/VeloxSparkPlanExecApi.scala b/backends-velox/src/main/scala/org/apache/gluten/backendsapi/velox/VeloxSparkPlanExecApi.scala index 582bf997fba15..37b46df3e23d9 100644 --- a/backends-velox/src/main/scala/org/apache/gluten/backendsapi/velox/VeloxSparkPlanExecApi.scala +++ b/backends-velox/src/main/scala/org/apache/gluten/backendsapi/velox/VeloxSparkPlanExecApi.scala @@ -22,10 +22,9 @@ import org.apache.gluten.datasource.ArrowConvertorRule import org.apache.gluten.exception.GlutenNotSupportException import org.apache.gluten.execution._ import org.apache.gluten.expression._ -import org.apache.gluten.expression.ExpressionNames.{TRANSFORM_KEYS, TRANSFORM_VALUES} import org.apache.gluten.expression.aggregate.{HLLAdapter, VeloxBloomFilterAggregate, VeloxCollectList, VeloxCollectSet} import org.apache.gluten.extension._ -import org.apache.gluten.extension.columnar.TransformHints +import org.apache.gluten.extension.columnar.FallbackTags import org.apache.gluten.extension.columnar.transition.Convention import org.apache.gluten.extension.columnar.transition.ConventionFunc.BatchOverride import org.apache.gluten.sql.shims.SparkShimLoader @@ -367,11 +366,11 @@ class VeloxSparkPlanExecApi extends SparkPlanExecApi { val projectList = Seq(Alias(hashExpr, "hash_partition_key")()) ++ child.output val projectTransformer = ProjectExecTransformer(projectList, child) val validationResult = projectTransformer.doValidate() - if (validationResult.isValid) { + if (validationResult.ok()) { val newChild = maybeAddAppendBatchesExec(projectTransformer) ColumnarShuffleExchangeExec(shuffle, newChild, newChild.output.drop(1)) } else { - TransformHints.tagNotTransformable(shuffle, validationResult) + FallbackTags.add(shuffle, validationResult) shuffle.withNewChildren(child :: Nil) } case RoundRobinPartitioning(num) if SQLConf.get.sortBeforeRepartition && num > 1 => @@ -393,11 +392,11 @@ class VeloxSparkPlanExecApi extends SparkPlanExecApi { val projectTransformer = ProjectExecTransformer(projectList, child) val projectBeforeSortValidationResult = projectTransformer.doValidate() // Make sure we support offload hash expression - val projectBeforeSort = if (projectBeforeSortValidationResult.isValid) { + val projectBeforeSort = if (projectBeforeSortValidationResult.ok()) { projectTransformer } else { val project = ProjectExec(projectList, child) - TransformHints.tagNotTransformable(project, projectBeforeSortValidationResult) + FallbackTags.add(project, projectBeforeSortValidationResult) project } val sortOrder = SortOrder(projectBeforeSort.output.head, Ascending) @@ -406,11 +405,11 @@ class VeloxSparkPlanExecApi extends SparkPlanExecApi { val dropSortColumnTransformer = ProjectExecTransformer(projectList.drop(1), sortByHashCode) val validationResult = dropSortColumnTransformer.doValidate() - if (validationResult.isValid) { + if (validationResult.ok()) { val newChild = maybeAddAppendBatchesExec(dropSortColumnTransformer) ColumnarShuffleExchangeExec(shuffle, newChild, newChild.output) } else { - TransformHints.tagNotTransformable(shuffle, validationResult) + FallbackTags.add(shuffle, validationResult) shuffle.withNewChildren(child :: Nil) } } @@ -835,8 +834,6 @@ class VeloxSparkPlanExecApi extends SparkPlanExecApi { Sig[VeloxCollectSet](ExpressionNames.COLLECT_SET), Sig[VeloxBloomFilterMightContain](ExpressionNames.MIGHT_CONTAIN), Sig[VeloxBloomFilterAggregate](ExpressionNames.BLOOM_FILTER_AGG), - Sig[TransformKeys](TRANSFORM_KEYS), - Sig[TransformValues](TRANSFORM_VALUES), // For test purpose. Sig[VeloxDummyExpression](VeloxDummyExpression.VELOX_DUMMY_EXPRESSION) ) @@ -891,7 +888,7 @@ class VeloxSparkPlanExecApi extends SparkPlanExecApi { case p @ LimitTransformer(SortExecTransformer(sortOrder, _, child, _), 0, count) => val global = child.outputPartitioning.satisfies(AllTuples) val topN = TopNTransformer(count, sortOrder, global, child) - if (topN.doValidate().isValid) { + if (topN.doValidate().ok()) { topN } else { p diff --git a/backends-velox/src/main/scala/org/apache/gluten/execution/GenerateExecTransformer.scala b/backends-velox/src/main/scala/org/apache/gluten/execution/GenerateExecTransformer.scala index 8ceea8c14f6ad..c7b81d55fa067 100644 --- a/backends-velox/src/main/scala/org/apache/gluten/execution/GenerateExecTransformer.scala +++ b/backends-velox/src/main/scala/org/apache/gluten/execution/GenerateExecTransformer.scala @@ -72,11 +72,11 @@ case class GenerateExecTransformer( generator: Generator, outer: Boolean): ValidationResult = { if (!supportsGenerate(generator, outer)) { - ValidationResult.notOk( + ValidationResult.failed( s"Velox backend does not support this generator: ${generator.getClass.getSimpleName}" + s", outer: $outer") } else { - ValidationResult.ok + ValidationResult.succeeded } } diff --git a/backends-velox/src/main/scala/org/apache/gluten/execution/RowToVeloxColumnarExec.scala b/backends-velox/src/main/scala/org/apache/gluten/execution/RowToVeloxColumnarExec.scala index 289df1a6e54d8..2f3e88f9af9cb 100644 --- a/backends-velox/src/main/scala/org/apache/gluten/execution/RowToVeloxColumnarExec.scala +++ b/backends-velox/src/main/scala/org/apache/gluten/execution/RowToVeloxColumnarExec.scala @@ -16,9 +16,8 @@ */ package org.apache.gluten.execution -import org.apache.gluten.backendsapi.BackendsApiManager +import org.apache.gluten.GlutenConfig import org.apache.gluten.columnarbatch.ColumnarBatches -import org.apache.gluten.exception.GlutenException import org.apache.gluten.exec.Runtimes import org.apache.gluten.memory.arrow.alloc.ArrowBufferAllocators import org.apache.gluten.utils.ArrowAbiUtil @@ -46,19 +45,10 @@ import scala.collection.mutable.ListBuffer case class RowToVeloxColumnarExec(child: SparkPlan) extends RowToColumnarExecBase(child = child) { override def doExecuteColumnarInternal(): RDD[ColumnarBatch] = { - BackendsApiManager.getValidatorApiInstance.doSchemaValidate(schema).foreach { - reason => - throw new GlutenException( - s"Input schema contains unsupported type when convert row to columnar for $schema " + - s"due to $reason") - } - val numInputRows = longMetric("numInputRows") val numOutputBatches = longMetric("numOutputBatches") val convertTime = longMetric("convertTime") - // Instead of creating a new config we are reusing columnBatchSize. In the future if we do - // combine with some of the Arrow conversion tools we will need to unify some of the configs. - val numRows = conf.columnBatchSize + val numRows = GlutenConfig.getConf.maxBatchSize // This avoids calling `schema` in the RDD closure, so that we don't need to include the entire // plan (this) in the closure. val localSchema = schema @@ -78,9 +68,7 @@ case class RowToVeloxColumnarExec(child: SparkPlan) extends RowToColumnarExecBas val numInputRows = longMetric("numInputRows") val numOutputBatches = longMetric("numOutputBatches") val convertTime = longMetric("convertTime") - // Instead of creating a new config we are reusing columnBatchSize. In the future if we do - // combine with some of the Arrow conversion tools we will need to unify some of the configs. - val numRows = conf.columnBatchSize + val numRows = GlutenConfig.getConf.maxBatchSize val mode = BroadcastUtils.getBroadcastMode(outputPartitioning) val relation = child.executeBroadcast() BroadcastUtils.sparkToVeloxUnsafe( @@ -216,7 +204,7 @@ object RowToVeloxColumnarExec { try { val handle = jniWrapper .nativeConvertRowToColumnar(r2cHandle, rowLength.toArray, arrowBuf.memoryAddress()) - val cb = ColumnarBatches.create(runtime, handle) + val cb = ColumnarBatches.create(handle) convertTime += System.currentTimeMillis() - startNative cb } finally { diff --git a/backends-velox/src/main/scala/org/apache/gluten/execution/VeloxColumnarToRowExec.scala b/backends-velox/src/main/scala/org/apache/gluten/execution/VeloxColumnarToRowExec.scala index f1be71d96917c..993a888b91df2 100644 --- a/backends-velox/src/main/scala/org/apache/gluten/execution/VeloxColumnarToRowExec.scala +++ b/backends-velox/src/main/scala/org/apache/gluten/execution/VeloxColumnarToRowExec.scala @@ -66,7 +66,7 @@ case class VeloxColumnarToRowExec(child: SparkPlan) extends ColumnarToRowExecBas s"VeloxColumnarToRowExec.") } } - ValidationResult.ok + ValidationResult.succeeded } override def doExecuteInternal(): RDD[InternalRow] = { diff --git a/backends-velox/src/main/scala/org/apache/spark/sql/execution/ColumnarCachedBatchSerializer.scala b/backends-velox/src/main/scala/org/apache/spark/sql/execution/ColumnarCachedBatchSerializer.scala index 3f82f919b4d82..15fd51abef489 100644 --- a/backends-velox/src/main/scala/org/apache/spark/sql/execution/ColumnarCachedBatchSerializer.scala +++ b/backends-velox/src/main/scala/org/apache/spark/sql/execution/ColumnarCachedBatchSerializer.scala @@ -247,7 +247,7 @@ class ColumnarCachedBatchSerializer extends CachedBatchSerializer with SQLConfHe val batchHandle = jniWrapper .deserialize(deserializerHandle, cachedBatch.bytes) - val batch = ColumnarBatches.create(runtime, batchHandle) + val batch = ColumnarBatches.create(batchHandle) if (shouldSelectAttributes) { try { ColumnarBatches.select(batch, requestedColumnIndices.toArray) diff --git a/backends-velox/src/main/scala/org/apache/spark/sql/execution/datasources/VeloxColumnarBatchIterator.scala b/backends-velox/src/main/scala/org/apache/spark/sql/execution/datasources/VeloxColumnarBatchIterator.scala index 5c06b3910974d..0e6aceddfc1a4 100644 --- a/backends-velox/src/main/scala/org/apache/spark/sql/execution/datasources/VeloxColumnarBatchIterator.scala +++ b/backends-velox/src/main/scala/org/apache/spark/sql/execution/datasources/VeloxColumnarBatchIterator.scala @@ -26,10 +26,10 @@ import org.apache.arrow.vector.types.pojo.Schema import java.util.concurrent.{ArrayBlockingQueue, TimeUnit} -class VeloxColumnarBatchIterator(schema: Schema, allocator: BufferAllocator) +class VeloxColumnarBatchIterator(schema: Schema, allocator: BufferAllocator, queueSize: Int) extends Iterator[ColumnarBatch] with AutoCloseable { - private val writeQueue = new ArrayBlockingQueue[ColumnarBatch](64) + private val writeQueue = new ArrayBlockingQueue[ColumnarBatch](queueSize) private var currentBatch: Option[ColumnarBatch] = None def enqueue(batch: ColumnarBatch): Unit = { diff --git a/backends-velox/src/main/scala/org/apache/spark/sql/execution/datasources/VeloxWriteQueue.scala b/backends-velox/src/main/scala/org/apache/spark/sql/execution/datasources/VeloxWriteQueue.scala index b2905e157554f..6e3e64796b329 100644 --- a/backends-velox/src/main/scala/org/apache/spark/sql/execution/datasources/VeloxWriteQueue.scala +++ b/backends-velox/src/main/scala/org/apache/spark/sql/execution/datasources/VeloxWriteQueue.scala @@ -40,9 +40,10 @@ class VeloxWriteQueue( schema: Schema, allocator: BufferAllocator, datasourceJniWrapper: DatasourceJniWrapper, - outputFileURI: String) + outputFileURI: String, + queueSize: Int) extends AutoCloseable { - private val scanner = new VeloxColumnarBatchIterator(schema, allocator) + private val scanner = new VeloxColumnarBatchIterator(schema, allocator, queueSize) private val writeException = new AtomicReference[Throwable] private val writeThread = new Thread( diff --git a/backends-velox/src/main/scala/org/apache/spark/sql/execution/datasources/velox/VeloxBlockStripes.java b/backends-velox/src/main/scala/org/apache/spark/sql/execution/datasources/velox/VeloxBlockStripes.java index 56df7b9ad57f5..f9848d4ab6344 100644 --- a/backends-velox/src/main/scala/org/apache/spark/sql/execution/datasources/velox/VeloxBlockStripes.java +++ b/backends-velox/src/main/scala/org/apache/spark/sql/execution/datasources/velox/VeloxBlockStripes.java @@ -16,13 +16,11 @@ */ package org.apache.spark.sql.execution.datasources.velox; -import org.apache.gluten.exec.Runtimes; +import org.apache.gluten.columnarbatch.ColumnarBatches; import org.apache.spark.sql.catalyst.InternalRow; import org.apache.spark.sql.catalyst.expressions.UnsafeRow; import org.apache.spark.sql.execution.datasources.BlockStripe; import org.apache.spark.sql.execution.datasources.BlockStripes; -import org.apache.gluten.columnarbatch.ColumnarBatches; - import org.apache.spark.sql.vectorized.ColumnarBatch; import org.jetbrains.annotations.NotNull; @@ -53,8 +51,7 @@ public BlockStripe next() { return new BlockStripe() { @Override public ColumnarBatch getColumnarBatch() { - return ColumnarBatches.create( - Runtimes.contextInstance("VeloxBlockStripes"), blockAddresses[0]); + return ColumnarBatches.create(blockAddresses[0]); } @Override diff --git a/backends-velox/src/main/scala/org/apache/spark/sql/execution/datasources/velox/VeloxFormatWriterInjects.scala b/backends-velox/src/main/scala/org/apache/spark/sql/execution/datasources/velox/VeloxFormatWriterInjects.scala index ebbf959d0b1f9..6901bfffdf5e9 100644 --- a/backends-velox/src/main/scala/org/apache/spark/sql/execution/datasources/velox/VeloxFormatWriterInjects.scala +++ b/backends-velox/src/main/scala/org/apache/spark/sql/execution/datasources/velox/VeloxFormatWriterInjects.scala @@ -16,6 +16,7 @@ */ package org.apache.spark.sql.execution.datasources.velox +import org.apache.gluten.GlutenConfig import org.apache.gluten.columnarbatch.ColumnarBatches import org.apache.gluten.datasource.DatasourceJniWrapper import org.apache.gluten.exception.GlutenException @@ -73,6 +74,9 @@ trait VeloxFormatWriterInjects extends GlutenFormatWriterInjectsBase { cSchema.close() } + // FIXME: remove this once we support push-based write. + val queueSize = context.getConfiguration.getInt(GlutenConfig.VELOX_WRITER_QUEUE_SIZE.key, 64) + val writeQueue = new VeloxWriteQueue( TaskResources.getLocalTaskContext(), @@ -80,7 +84,8 @@ trait VeloxFormatWriterInjects extends GlutenFormatWriterInjectsBase { arrowSchema, allocator, datasourceJniWrapper, - filePath) + filePath, + queueSize) new OutputWriter { override def write(row: InternalRow): Unit = { diff --git a/backends-velox/src/test/java/org/apache/gluten/columnarbatch/ColumnarBatchTest.java b/backends-velox/src/test/java/org/apache/gluten/columnarbatch/ColumnarBatchTest.java new file mode 100644 index 0000000000000..cd2ac50d350c3 --- /dev/null +++ b/backends-velox/src/test/java/org/apache/gluten/columnarbatch/ColumnarBatchTest.java @@ -0,0 +1,104 @@ +/* + * 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. + */ +package org.apache.gluten.columnarbatch; + +import org.apache.gluten.memory.arrow.alloc.ArrowBufferAllocators; +import org.apache.gluten.test.VeloxBackendTestBase; +import org.apache.gluten.vectorized.ArrowWritableColumnVector; + +import org.apache.spark.sql.types.StructType; +import org.apache.spark.sql.vectorized.ColumnarBatch; +import org.apache.spark.util.TaskResources$; +import org.junit.Assert; +import org.junit.Test; + +import java.util.Spliterator; +import java.util.Spliterators; +import java.util.stream.StreamSupport; + +public class ColumnarBatchTest extends VeloxBackendTestBase { + + @Test + public void testOffloadAndLoad() { + TaskResources$.MODULE$.runUnsafe( + () -> { + final int numRows = 100; + final ColumnarBatch batch = newArrowBatch("a boolean, b int", numRows); + Assert.assertTrue(ColumnarBatches.isHeavyBatch(batch)); + final ColumnarBatch offloaded = + ColumnarBatches.ensureOffloaded(ArrowBufferAllocators.contextInstance(), batch); + Assert.assertTrue(ColumnarBatches.isLightBatch(offloaded)); + final ColumnarBatch loaded = + ColumnarBatches.ensureLoaded(ArrowBufferAllocators.contextInstance(), offloaded); + Assert.assertTrue(ColumnarBatches.isHeavyBatch(loaded)); + long cnt = + StreamSupport.stream( + Spliterators.spliteratorUnknownSize( + loaded.rowIterator(), Spliterator.ORDERED), + false) + .count(); + Assert.assertEquals(numRows, cnt); + loaded.close(); + return null; + }); + } + + @Test + public void testCreateByHandle() { + TaskResources$.MODULE$.runUnsafe( + () -> { + final int numRows = 100; + final ColumnarBatch batch = newArrowBatch("a boolean, b int", numRows); + Assert.assertEquals(1, ColumnarBatches.getRefCnt(batch)); + final ColumnarBatch offloaded = + ColumnarBatches.ensureOffloaded(ArrowBufferAllocators.contextInstance(), batch); + Assert.assertEquals(1, ColumnarBatches.getRefCnt(offloaded)); + final long handle = ColumnarBatches.getNativeHandle(offloaded); + final ColumnarBatch created = ColumnarBatches.create(handle); + Assert.assertEquals(handle, ColumnarBatches.getNativeHandle(created)); + Assert.assertEquals(1, ColumnarBatches.getRefCnt(offloaded)); + Assert.assertEquals(1, ColumnarBatches.getRefCnt(created)); + ColumnarBatches.retain(created); + Assert.assertEquals(2, ColumnarBatches.getRefCnt(offloaded)); + Assert.assertEquals(2, ColumnarBatches.getRefCnt(created)); + ColumnarBatches.retain(offloaded); + Assert.assertEquals(3, ColumnarBatches.getRefCnt(offloaded)); + Assert.assertEquals(3, ColumnarBatches.getRefCnt(created)); + created.close(); + Assert.assertEquals(2, ColumnarBatches.getRefCnt(offloaded)); + Assert.assertEquals(2, ColumnarBatches.getRefCnt(created)); + offloaded.close(); + Assert.assertEquals(1, ColumnarBatches.getRefCnt(offloaded)); + Assert.assertEquals(1, ColumnarBatches.getRefCnt(created)); + created.close(); + Assert.assertEquals(0, ColumnarBatches.getRefCnt(offloaded)); + Assert.assertEquals(0, ColumnarBatches.getRefCnt(created)); + return null; + }); + } + + private static ColumnarBatch newArrowBatch(String schema, int numRows) { + final ArrowWritableColumnVector[] columns = + ArrowWritableColumnVector.allocateColumns(numRows, StructType.fromDDL(schema)); + for (ArrowWritableColumnVector col : columns) { + col.setValueCount(numRows); + } + final ColumnarBatch batch = new ColumnarBatch(columns); + batch.setNumRows(numRows); + return batch; + } +} diff --git a/backends-velox/src/test/java/org/apache/gluten/test/VeloxBackendTestBase.java b/backends-velox/src/test/java/org/apache/gluten/test/VeloxBackendTestBase.java new file mode 100644 index 0000000000000..1d7df23566dfb --- /dev/null +++ b/backends-velox/src/test/java/org/apache/gluten/test/VeloxBackendTestBase.java @@ -0,0 +1,86 @@ +/* + * 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. + */ +package org.apache.gluten.test; + +import org.apache.gluten.GlutenConfig; +import org.apache.gluten.backendsapi.ListenerApi; +import org.apache.gluten.backendsapi.velox.VeloxListenerApi; + +import com.codahale.metrics.MetricRegistry; +import org.apache.spark.SparkConf; +import org.apache.spark.SparkContext; +import org.apache.spark.api.plugin.PluginContext; +import org.apache.spark.resource.ResourceInformation; +import org.junit.BeforeClass; + +import java.io.IOException; +import java.util.Map; + +/** For testing Velox backend without starting a Spark context. */ +public abstract class VeloxBackendTestBase { + @BeforeClass + public static void setup() { + final ListenerApi api = new VeloxListenerApi(); + api.onDriverStart(mockSparkContext(), mockPluginContext()); + } + + private static SparkContext mockSparkContext() { + // Not yet implemented. + return null; + } + + private static PluginContext mockPluginContext() { + return new PluginContext() { + @Override + public MetricRegistry metricRegistry() { + throw new UnsupportedOperationException(); + } + + @Override + public SparkConf conf() { + final SparkConf conf = new SparkConf(); + conf.set(GlutenConfig.GLUTEN_NUM_TASK_SLOTS_PER_EXECUTOR_KEY(), "0"); + return conf; + } + + @Override + public String executorID() { + throw new UnsupportedOperationException(); + } + + @Override + public String hostname() { + throw new UnsupportedOperationException(); + } + + @Override + public Map resources() { + throw new UnsupportedOperationException(); + } + + @Override + public void send(Object message) throws IOException { + throw new UnsupportedOperationException(); + } + + @Override + public Object ask(Object message) throws Exception { + throw new UnsupportedOperationException(); + } + }; + } +} diff --git a/backends-velox/src/test/java/org/apache/gluten/utils/VeloxBloomFilterTest.java b/backends-velox/src/test/java/org/apache/gluten/utils/VeloxBloomFilterTest.java index fda4003ddd20e..cf568b1665821 100644 --- a/backends-velox/src/test/java/org/apache/gluten/utils/VeloxBloomFilterTest.java +++ b/backends-velox/src/test/java/org/apache/gluten/utils/VeloxBloomFilterTest.java @@ -16,34 +16,18 @@ */ package org.apache.gluten.utils; -import org.apache.gluten.GlutenConfig; -import org.apache.gluten.backendsapi.ListenerApi; -import org.apache.gluten.backendsapi.velox.VeloxListenerApi; - -import com.codahale.metrics.MetricRegistry; -import org.apache.spark.SparkConf; -import org.apache.spark.SparkContext; -import org.apache.spark.api.plugin.PluginContext; -import org.apache.spark.resource.ResourceInformation; +import org.apache.gluten.test.VeloxBackendTestBase; + import org.apache.spark.util.TaskResources$; import org.apache.spark.util.sketch.BloomFilter; import org.apache.spark.util.sketch.IncompatibleMergeException; import org.junit.Assert; -import org.junit.BeforeClass; import org.junit.Test; import org.junit.function.ThrowingRunnable; -import java.io.IOException; import java.nio.ByteBuffer; -import java.util.Map; - -public class VeloxBloomFilterTest { - @BeforeClass - public static void setup() { - final ListenerApi api = new VeloxListenerApi(); - api.onDriverStart(mockSparkContext(), mockPluginContext()); - } +public class VeloxBloomFilterTest extends VeloxBackendTestBase { @Test public void testEmpty() { TaskResources$.MODULE$.runUnsafe( @@ -191,50 +175,4 @@ private static void checkFalsePositives(BloomFilter filter, int start) { Assert.assertTrue(negativeFalsePositives > 0); Assert.assertTrue(negativeFalsePositives < attemptCount); } - - private static SparkContext mockSparkContext() { - // Not yet implemented. - return null; - } - - private static PluginContext mockPluginContext() { - return new PluginContext() { - @Override - public MetricRegistry metricRegistry() { - throw new UnsupportedOperationException(); - } - - @Override - public SparkConf conf() { - final SparkConf conf = new SparkConf(); - conf.set(GlutenConfig.GLUTEN_NUM_TASK_SLOTS_PER_EXECUTOR_KEY(), "0"); - return conf; - } - - @Override - public String executorID() { - throw new UnsupportedOperationException(); - } - - @Override - public String hostname() { - throw new UnsupportedOperationException(); - } - - @Override - public Map resources() { - throw new UnsupportedOperationException(); - } - - @Override - public void send(Object message) throws IOException { - throw new UnsupportedOperationException(); - } - - @Override - public Object ask(Object message) throws Exception { - throw new UnsupportedOperationException(); - } - }; - } } diff --git a/backends-velox/src/test/scala/org/apache/gluten/execution/ScalarFunctionsValidateSuite.scala b/backends-velox/src/test/scala/org/apache/gluten/execution/ScalarFunctionsValidateSuite.scala index bd32a799c3acc..12fa3b46d72a4 100644 --- a/backends-velox/src/test/scala/org/apache/gluten/execution/ScalarFunctionsValidateSuite.scala +++ b/backends-velox/src/test/scala/org/apache/gluten/execution/ScalarFunctionsValidateSuite.scala @@ -16,6 +16,8 @@ */ package org.apache.gluten.execution +import org.apache.spark.SparkException +import org.apache.spark.sql.catalyst.optimizer.NullPropagation import org.apache.spark.sql.execution.ProjectExec import org.apache.spark.sql.types._ @@ -101,6 +103,12 @@ class ScalarFunctionsValidateSuite extends FunctionsValidateTest { } } + testWithSpecifiedSparkVersion("null input for array_size", Some("3.3")) { + runQueryAndCompare("SELECT array_size(null)") { + checkGlutenOperatorMatch[ProjectExecTransformer] + } + } + test("chr function") { val df = runQueryAndCompare( "SELECT chr(l_orderkey + 64) " + @@ -293,6 +301,12 @@ class ScalarFunctionsValidateSuite extends FunctionsValidateTest { } } + test("Test log function") { + runQueryAndCompare("SELECT log(10, l_orderkey) from lineitem limit 1") { + checkGlutenOperatorMatch[ProjectExecTransformer] + } + } + test("Test shiftleft function") { val df = runQueryAndCompare("SELECT shiftleft(int_field1, 1) from datatab limit 1") { checkGlutenOperatorMatch[ProjectExecTransformer] @@ -649,6 +663,67 @@ class ScalarFunctionsValidateSuite extends FunctionsValidateTest { | from lineitem limit 100""".stripMargin) { checkGlutenOperatorMatch[ProjectExecTransformer] } + + runQueryAndCompare("""SELECT input_file_name(), l_orderkey + | from + | (select l_orderkey from lineitem + | union all + | select o_orderkey as l_orderkey from orders) + | limit 100""".stripMargin) { + checkGlutenOperatorMatch[ProjectExecTransformer] + } + } + + test("Test sequence function optimized by Spark constant folding") { + withSQLConf(("spark.sql.optimizer.excludedRules", NullPropagation.ruleName)) { + runQueryAndCompare("""SELECT sequence(1, 5), l_orderkey + | from lineitem limit 100""".stripMargin) { + checkGlutenOperatorMatch[ProjectExecTransformer] + } + } + } + + test("Test raise_error, assert_true function") { + runQueryAndCompare("""SELECT assert_true(l_orderkey >= 1), l_orderkey + | from lineitem limit 100""".stripMargin) { + checkGlutenOperatorMatch[ProjectExecTransformer] + } + val e = intercept[SparkException] { + sql("""SELECT assert_true(l_orderkey >= 100), l_orderkey from + | lineitem limit 100""".stripMargin).collect() + } + assert(e.getCause.isInstanceOf[RuntimeException]) + assert(e.getMessage.contains("l_orderkey")) + } + + test("Test E function") { + runQueryAndCompare("""SELECT E() from lineitem limit 100""".stripMargin) { + checkGlutenOperatorMatch[ProjectExecTransformer] + } + runQueryAndCompare("""SELECT E(), l_orderkey + | from lineitem limit 100""".stripMargin) { + checkGlutenOperatorMatch[ProjectExecTransformer] + } + } + + test("Test Pi function") { + runQueryAndCompare("""SELECT Pi() from lineitem limit 100""".stripMargin) { + checkGlutenOperatorMatch[ProjectExecTransformer] + } + runQueryAndCompare("""SELECT Pi(), l_orderkey + | from lineitem limit 100""".stripMargin) { + checkGlutenOperatorMatch[ProjectExecTransformer] + } + } + + test("Test version function") { + runQueryAndCompare("""SELECT version() from lineitem limit 100""".stripMargin) { + checkGlutenOperatorMatch[ProjectExecTransformer] + } + runQueryAndCompare("""SELECT version(), l_orderkey + | from lineitem limit 100""".stripMargin) { + checkGlutenOperatorMatch[ProjectExecTransformer] + } } test("Test spark_partition_id function") { @@ -1177,4 +1252,57 @@ class ScalarFunctionsValidateSuite extends FunctionsValidateTest { } } } + + test("levenshtein") { + runQueryAndCompare("select levenshtein(c_comment, c_address) from customer limit 50") { + checkGlutenOperatorMatch[ProjectExecTransformer] + } + } + + testWithSpecifiedSparkVersion("levenshtein with limit", Some("3.5")) { + runQueryAndCompare("select levenshtein(c_comment, c_address, 3) from customer limit 50") { + checkGlutenOperatorMatch[ProjectExecTransformer] + } + } + + test("Test substring_index") { + withTempView("substring_index_table") { + withTempPath { + path => + Seq[(String, String, Int)]( + ("www.apache.org", ".", 3), + ("www.apache.org", ".", 2), + ("www.apache.org", ".", 1), + ("www.apache.org", ".", 0), + ("www.apache.org", ".", -1), + ("www.apache.org", ".", -2), + ("www.apache.org", ".", -3), + ("www.apache.org", "", 1), + ("www.apache.org", "#", 1), + ("www||apache||org", "||", 2), + ("www||apache||org", "||", -2), + ("", ".", 1), + ("||||||", "|||", 3), + ("||||||", "|||", -4) + ) + .toDF("str", "delim", "count") + .write + .parquet(path.getCanonicalPath) + spark.read.parquet(path.getCanonicalPath).createOrReplaceTempView("substring_index_table") + runQueryAndCompare( + """ + |select substring_index(str, delim, count) from substring_index_table + |""".stripMargin + ) { + checkGlutenOperatorMatch[ProjectExecTransformer] + } + } + } + } + + test("repeat") { + runQueryAndCompare("select repeat(c_comment, 5) from customer limit 50") { + checkGlutenOperatorMatch[ProjectExecTransformer] + } + } } diff --git a/backends-velox/src/test/scala/org/apache/gluten/execution/TestOperator.scala b/backends-velox/src/test/scala/org/apache/gluten/execution/TestOperator.scala index 9b47a519cd284..dcae4920d01c2 100644 --- a/backends-velox/src/test/scala/org/apache/gluten/execution/TestOperator.scala +++ b/backends-velox/src/test/scala/org/apache/gluten/execution/TestOperator.scala @@ -258,6 +258,16 @@ class TestOperator extends VeloxWholeStageTransformerSuite with AdaptiveSparkPla checkLengthAndPlan(df, 5) } + testWithSpecifiedSparkVersion("coalesce validation", Some("3.4")) { + withTempPath { + path => + val data = "2019-09-09 01:02:03.456789" + val df = Seq(data).toDF("strTs").selectExpr(s"CAST(strTs AS TIMESTAMP_NTZ) AS ts") + df.coalesce(1).write.format("parquet").save(path.getCanonicalPath) + spark.read.parquet(path.getCanonicalPath).collect + } + } + test("groupby") { val df = runQueryAndCompare( "select l_orderkey, sum(l_partkey) as sum from lineitem " + @@ -1432,6 +1442,68 @@ class TestOperator extends VeloxWholeStageTransformerSuite with AdaptiveSparkPla } } + test("test sort merge join") { + withTable("t1", "t2") { + sql(""" + |create table t1 using parquet as + |select cast(id as int) as c1, cast(id as string) c2 from range(100) + |""".stripMargin) + sql(""" + |create table t2 using parquet as + |select cast(id as int) as c1, cast(id as string) c2 from range(100) order by c1 desc; + |""".stripMargin) + withSQLConf("spark.gluten.sql.columnar.forceShuffledHashJoin" -> "false") { + runQueryAndCompare( + """ + |select * from t1 inner join t2 on t1.c1 = t2.c1 and t1.c1 > 50; + |""".stripMargin + ) { + checkGlutenOperatorMatch[SortMergeJoinExecTransformer] + } + } + + withSQLConf("spark.gluten.sql.columnar.forceShuffledHashJoin" -> "false") { + runQueryAndCompare( + """ + |select * from t1 left join t2 on t1.c1 = t2.c1 and t1.c1 > 50; + |""".stripMargin + ) { + checkGlutenOperatorMatch[SortMergeJoinExecTransformer] + } + } + + withSQLConf("spark.gluten.sql.columnar.forceShuffledHashJoin" -> "false") { + runQueryAndCompare( + """ + |select * from t1 left semi join t2 on t1.c1 = t2.c1 and t1.c1 > 50; + |""".stripMargin + ) { + checkGlutenOperatorMatch[SortMergeJoinExecTransformer] + } + } + + withSQLConf("spark.gluten.sql.columnar.forceShuffledHashJoin" -> "false") { + runQueryAndCompare( + """ + |select * from t1 right join t2 on t1.c1 = t2.c1 and t1.c1 > 50; + |""".stripMargin + ) { + checkGlutenOperatorMatch[SortMergeJoinExecTransformer] + } + } + + withSQLConf("spark.gluten.sql.columnar.forceShuffledHashJoin" -> "false") { + runQueryAndCompare( + """ + |select * from t1 left anti join t2 on t1.c1 = t2.c1 and t1.c1 > 50; + |""".stripMargin + ) { + checkGlutenOperatorMatch[SortMergeJoinExecTransformer] + } + } + } + } + test("Fix incorrect path by decode") { val c = "?.+<_>|/" val path = rootPath + "/test +?.+<_>|" @@ -1892,4 +1964,29 @@ class TestOperator extends VeloxWholeStageTransformerSuite with AdaptiveSparkPla } } } + + test("fix non-deterministic filter executed twice when push down to scan") { + val df = sql("select * from lineitem where rand() <= 0.5") + // plan check + val plan = df.queryExecution.executedPlan + val scans = plan.collect { case scan: FileSourceScanExecTransformer => scan } + val filters = plan.collect { case filter: FilterExecTransformer => filter } + assert(scans.size == 1) + assert(filters.size == 1) + assert(scans(0).dataFilters.size == 1) + val remainingFilters = FilterHandler.getRemainingFilters( + scans(0).dataFilters, + splitConjunctivePredicates(filters(0).condition)) + assert(remainingFilters.size == 0) + + // result length check, table lineitem has 60,000 rows + val resultLength = df.collect().length + assert(resultLength > 25000 && resultLength < 35000) + } + + test("Deduplicate sorting keys") { + runQueryAndCompare("select * from lineitem order by l_orderkey, l_orderkey") { + checkGlutenOperatorMatch[SortExecTransformer] + } + } } diff --git a/backends-velox/src/test/scala/org/apache/gluten/execution/VeloxAggregateFunctionsSuite.scala b/backends-velox/src/test/scala/org/apache/gluten/execution/VeloxAggregateFunctionsSuite.scala index ae6306cc0d4a1..992106d131e67 100644 --- a/backends-velox/src/test/scala/org/apache/gluten/execution/VeloxAggregateFunctionsSuite.scala +++ b/backends-velox/src/test/scala/org/apache/gluten/execution/VeloxAggregateFunctionsSuite.scala @@ -1135,6 +1135,32 @@ abstract class VeloxAggregateFunctionsSuite extends VeloxWholeStageTransformerSu df.select(max(col("txn"))).collect } + + test("drop redundant partial sort which has pre-project when offload sortAgg") { + // Spark 3.2 does not have this configuration, but it does not affect the test results. + withSQLConf("spark.sql.test.forceApplySortAggregate" -> "true") { + withTempView("t1") { + Seq((-1, 2), (-1, 3), (2, 3), (3, 4), (-3, 5), (4, 5)) + .toDF("c1", "c2") + .createOrReplaceTempView("t1") + runQueryAndCompare("select c2, sum(if(c1<0,0,c1)) from t1 group by c2") { + df => + { + assert( + getExecutedPlan(df).count( + plan => { + plan.isInstanceOf[HashAggregateExecTransformer] + }) == 2) + assert( + getExecutedPlan(df).count( + plan => { + plan.isInstanceOf[SortExecTransformer] + }) == 0) + } + } + } + } + } } class VeloxAggregateFunctionsDefaultSuite extends VeloxAggregateFunctionsSuite { diff --git a/cpp-ch/clickhouse.version b/cpp-ch/clickhouse.version index 54d0a74c5bb40..706c510a6b69f 100644 --- a/cpp-ch/clickhouse.version +++ b/cpp-ch/clickhouse.version @@ -1,4 +1,4 @@ CH_ORG=Kyligence -CH_BRANCH=rebase_ch/20240621 -CH_COMMIT=c811cbb985f +CH_BRANCH=rebase_ch/20240718 +CH_COMMIT=7f849f9ccf1 diff --git a/cpp-ch/local-engine/AggregateFunctions/AggregateFunctionGroupBloomFilter.h b/cpp-ch/local-engine/AggregateFunctions/AggregateFunctionGroupBloomFilter.h index 6dd15731eea0b..fa726d1d62ed1 100644 --- a/cpp-ch/local-engine/AggregateFunctions/AggregateFunctionGroupBloomFilter.h +++ b/cpp-ch/local-engine/AggregateFunctions/AggregateFunctionGroupBloomFilter.h @@ -30,6 +30,11 @@ #include #include +namespace DB::ErrorCodes +{ +extern const int BAD_ARGUMENTS; +} + namespace local_engine { using namespace DB; diff --git a/cpp-ch/local-engine/Common/CHUtil.cpp b/cpp-ch/local-engine/Common/CHUtil.cpp index 76c71ce752d60..b74c18dd14af1 100644 --- a/cpp-ch/local-engine/Common/CHUtil.cpp +++ b/cpp-ch/local-engine/Common/CHUtil.cpp @@ -51,6 +51,7 @@ #include #include #include +#include #include #include #include @@ -60,7 +61,6 @@ #include #include #include -#include #include #include #include @@ -84,8 +84,6 @@ extern const int CANNOT_PARSE_PROTOBUF_SCHEMA; namespace local_engine { -constexpr auto VIRTUAL_ROW_COUNT_COLUMN = "__VIRTUAL_ROW_COUNT_COLUMN__"; - namespace fs = std::filesystem; DB::Block BlockUtil::buildRowCountHeader() @@ -128,6 +126,27 @@ DB::Block BlockUtil::buildHeader(const DB::NamesAndTypesList & names_types_list) return DB::Block(cols); } +/// The column names may be different in two blocks. +/// and the nullability also could be different, with TPCDS-Q1 as an example. +DB::ColumnWithTypeAndName +BlockUtil::convertColumnAsNecessary(const DB::ColumnWithTypeAndName & column, const DB::ColumnWithTypeAndName & sample_column) +{ + if (sample_column.type->equals(*column.type)) + return {column.column, column.type, sample_column.name}; + else if (sample_column.type->isNullable() && !column.type->isNullable() && DB::removeNullable(sample_column.type)->equals(*column.type)) + { + auto nullable_column = column; + DB::JoinCommon::convertColumnToNullable(nullable_column); + return {nullable_column.column, sample_column.type, sample_column.name}; + } + else + throw DB::Exception( + DB::ErrorCodes::LOGICAL_ERROR, + "Columns have different types. original:{} expected:{}", + column.dumpStructure(), + sample_column.dumpStructure()); +} + /** * There is a special case with which we need be careful. In spark, struct/map/list are always * wrapped in Nullable, but this should not happen in clickhouse. @@ -468,7 +487,7 @@ String QueryPipelineUtil::explainPipeline(DB::QueryPipeline & pipeline) using namespace DB; -std::map BackendInitializerUtil::getBackendConfMap(const std::string & plan) +std::map BackendInitializerUtil::getBackendConfMap(const std::string_view plan) { std::map ch_backend_conf; if (plan.empty()) @@ -747,6 +766,7 @@ void BackendInitializerUtil::initSettings(std::map & b settings.set("input_format_parquet_import_nested", true); settings.set("input_format_json_read_numbers_as_strings", true); settings.set("input_format_json_read_bools_as_numbers", false); + settings.set("input_format_json_ignore_key_case", true); settings.set("input_format_csv_trim_whitespaces", false); settings.set("input_format_csv_allow_cr_end_of_line", true); settings.set("output_format_orc_string_as_string", true); @@ -761,6 +781,8 @@ void BackendInitializerUtil::initSettings(std::map & b settings.set("function_json_value_return_type_allow_complex", true); settings.set("function_json_value_return_type_allow_nullable", true); settings.set("precise_float_parsing", true); + settings.set("enable_named_columns_in_function_tuple", false); + if (backend_conf_map.contains(GLUTEN_TASK_OFFHEAP)) { auto task_memory = std::stoull(backend_conf_map.at(GLUTEN_TASK_OFFHEAP)); @@ -822,7 +844,7 @@ void BackendInitializerUtil::initContexts(DB::Context::ConfigurationPtr config) size_t index_uncompressed_cache_size = config->getUInt64("index_uncompressed_cache_size", DEFAULT_INDEX_UNCOMPRESSED_CACHE_MAX_SIZE); double index_uncompressed_cache_size_ratio = config->getDouble("index_uncompressed_cache_size_ratio", DEFAULT_INDEX_UNCOMPRESSED_CACHE_SIZE_RATIO); global_context->setIndexUncompressedCache(index_uncompressed_cache_policy, index_uncompressed_cache_size, index_uncompressed_cache_size_ratio); - + String index_mark_cache_policy = config->getString("index_mark_cache_policy", DEFAULT_INDEX_MARK_CACHE_POLICY); size_t index_mark_cache_size = config->getUInt64("index_mark_cache_size", DEFAULT_INDEX_MARK_CACHE_MAX_SIZE); double index_mark_cache_size_ratio = config->getDouble("index_mark_cache_size_ratio", DEFAULT_INDEX_MARK_CACHE_SIZE_RATIO); @@ -972,7 +994,7 @@ void BackendInitializerUtil::init(const std::string & plan) }); } -void BackendInitializerUtil::updateConfig(const DB::ContextMutablePtr & context, const std::string & plan) +void BackendInitializerUtil::updateConfig(const DB::ContextMutablePtr & context, const std::string_view plan) { std::map backend_conf_map = getBackendConfMap(plan); @@ -986,10 +1008,7 @@ void BackendInitializerUtil::updateConfig(const DB::ContextMutablePtr & context, void BackendFinalizerUtil::finalizeGlobally() { - /// Make sure that all active LocalExecutor stop before spark executor shutdown, otherwise crash map happen. - LocalExecutor::cancelAll(); - - /// Make sure client caches release before ClientCacheRegistry + // Make sure client caches release before ClientCacheRegistry ReadBufferBuilderFactory::instance().clean(); StorageMergeTreeFactory::clear(); auto & global_context = SerializedPlanParser::global_context; @@ -1056,4 +1075,53 @@ UInt64 MemoryUtil::getMemoryRSS() return rss * sysconf(_SC_PAGESIZE); } + +void JoinUtil::reorderJoinOutput(DB::QueryPlan & plan, DB::Names cols) +{ + ActionsDAGPtr project = std::make_shared(plan.getCurrentDataStream().header.getNamesAndTypesList()); + NamesWithAliases project_cols; + for (const auto & col : cols) + { + project_cols.emplace_back(NameWithAlias(col, col)); + } + project->project(project_cols); + QueryPlanStepPtr project_step = std::make_unique(plan.getCurrentDataStream(), project); + project_step->setStepDescription("Reorder Join Output"); + plan.addStep(std::move(project_step)); +} + +std::pair JoinUtil::getJoinKindAndStrictness(substrait::JoinRel_JoinType join_type) +{ + switch (join_type) + { + case substrait::JoinRel_JoinType_JOIN_TYPE_INNER: + return {DB::JoinKind::Inner, DB::JoinStrictness::All}; + case substrait::JoinRel_JoinType_JOIN_TYPE_LEFT_SEMI: + return {DB::JoinKind::Left, DB::JoinStrictness::Semi}; + case substrait::JoinRel_JoinType_JOIN_TYPE_ANTI: + return {DB::JoinKind::Left, DB::JoinStrictness::Anti}; + case substrait::JoinRel_JoinType_JOIN_TYPE_LEFT: + return {DB::JoinKind::Left, DB::JoinStrictness::All}; + case substrait::JoinRel_JoinType_JOIN_TYPE_RIGHT: + return {DB::JoinKind::Right, DB::JoinStrictness::All}; + case substrait::JoinRel_JoinType_JOIN_TYPE_OUTER: + return {DB::JoinKind::Full, DB::JoinStrictness::All}; + default: + throw Exception(ErrorCodes::UNKNOWN_TYPE, "unsupported join type {}.", magic_enum::enum_name(join_type)); + } +} + +std::pair JoinUtil::getCrossJoinKindAndStrictness(substrait::CrossRel_JoinType join_type) +{ + switch (join_type) + { + case substrait::CrossRel_JoinType_JOIN_TYPE_INNER: + case substrait::CrossRel_JoinType_JOIN_TYPE_LEFT: + case substrait::CrossRel_JoinType_JOIN_TYPE_OUTER: + return {DB::JoinKind::Cross, DB::JoinStrictness::All}; + default: + throw Exception(ErrorCodes::UNKNOWN_TYPE, "unsupported join type {}.", magic_enum::enum_name(join_type)); + } +} + } diff --git a/cpp-ch/local-engine/Common/CHUtil.h b/cpp-ch/local-engine/Common/CHUtil.h index 1198cfa2195dc..7be3f86dc2303 100644 --- a/cpp-ch/local-engine/Common/CHUtil.h +++ b/cpp-ch/local-engine/Common/CHUtil.h @@ -16,15 +16,19 @@ * limitations under the License. */ #pragma once + #include #include #include #include +#include #include #include #include #include #include +#include +#include #include namespace DB @@ -47,6 +51,9 @@ static const std::unordered_set LONG_VALUE_SETTINGS{ class BlockUtil { public: + static constexpr auto VIRTUAL_ROW_COUNT_COLUMN = "__VIRTUAL_ROW_COUNT_COLUMN__"; + static constexpr auto RIHGT_COLUMN_PREFIX = "broadcast_right_"; + // Build a header block with a virtual column which will be // use to indicate the number of rows in a block. // Commonly seen in the following quries: @@ -72,6 +79,10 @@ class BlockUtil const std::unordered_set & columns_to_skip_flatten = {}); static DB::Block concatenateBlocksMemoryEfficiently(std::vector && blocks); + + /// The column names may be different in two blocks. + /// and the nullability also could be different, with TPCDS-Q1 as an example. + static DB::ColumnWithTypeAndName convertColumnAsNecessary(const DB::ColumnWithTypeAndName & column, const DB::ColumnWithTypeAndName & sample_column); }; class PODArrayUtil @@ -141,7 +152,7 @@ class BackendInitializerUtil /// 1. global level resources like global_context/shared_context, notice that they can only be initialized once in process lifetime /// 2. session level resources like settings/configs, they can be initialized multiple times following the lifetime of executor/driver static void init(const std::string & plan); - static void updateConfig(const DB::ContextMutablePtr &, const std::string &); + static void updateConfig(const DB::ContextMutablePtr &, const std::string_view); // use excel text parser @@ -199,7 +210,7 @@ class BackendInitializerUtil static std::vector wrapDiskPathConfig(const String & path_prefix, const String & path_suffix, Poco::Util::AbstractConfiguration & config); - static std::map getBackendConfMap(const std::string & plan); + static std::map getBackendConfMap(const std::string_view plan); inline static std::once_flag init_flag; inline static Poco::Logger * logger; @@ -296,4 +307,12 @@ class ConcurrentDeque mutable std::mutex mtx; }; +class JoinUtil +{ +public: + static void reorderJoinOutput(DB::QueryPlan & plan, DB::Names cols); + static std::pair getJoinKindAndStrictness(substrait::JoinRel_JoinType join_type); + static std::pair getCrossJoinKindAndStrictness(substrait::CrossRel_JoinType join_type); +}; + } diff --git a/cpp-ch/local-engine/Common/DebugUtils.cpp b/cpp-ch/local-engine/Common/DebugUtils.cpp index 35f1f98cd935c..27f9efdacf163 100644 --- a/cpp-ch/local-engine/Common/DebugUtils.cpp +++ b/cpp-ch/local-engine/Common/DebugUtils.cpp @@ -29,12 +29,12 @@ namespace debug { void headBlock(const DB::Block & block, size_t count) { - std::cerr << "============Block============" << std::endl; - std::cerr << block.dumpStructure() << std::endl; + std::cout << "============Block============" << std::endl; + std::cout << block.dumpStructure() << std::endl; // print header for (const auto & name : block.getNames()) - std::cerr << name << "\t"; - std::cerr << std::endl; + std::cout << name << "\t"; + std::cout << std::endl; // print rows for (size_t row = 0; row < std::min(count, block.rows()); ++row) @@ -45,36 +45,30 @@ void headBlock(const DB::Block & block, size_t count) auto col = block.getByPosition(column).column; if (column > 0) - std::cerr << "\t"; + std::cout << "\t"; DB::WhichDataType which(type); if (which.isAggregateFunction()) - { - std::cerr << "Nan"; - } + std::cout << "Nan"; else if (col->isNullAt(row)) - { - std::cerr << "null"; - } + std::cout << "null"; else - { - std::cerr << toString((*col)[row]); - } + std::cout << toString((*col)[row]); } - std::cerr << std::endl; + std::cout << std::endl; } } void headColumn(const DB::ColumnPtr & column, size_t count) { - std::cerr << "============Column============" << std::endl; + std::cout << "============Column============" << std::endl; // print header - std::cerr << column->getName() << "\t"; - std::cerr << std::endl; + std::cout << column->getName() << "\t"; + std::cout << std::endl; // print rows for (size_t row = 0; row < std::min(count, column->size()); ++row) - std::cerr << toString((*column)[row]) << std::endl; + std::cout << toString((*column)[row]) << std::endl; } } diff --git a/cpp-ch/local-engine/Common/GlutenSignalHandler.cpp b/cpp-ch/local-engine/Common/GlutenSignalHandler.cpp index d32c640c3d841..d04c67d71b663 100644 --- a/cpp-ch/local-engine/Common/GlutenSignalHandler.cpp +++ b/cpp-ch/local-engine/Common/GlutenSignalHandler.cpp @@ -16,6 +16,7 @@ */ #include #include +#include #include #include #include diff --git a/cpp-ch/local-engine/Disks/ObjectStorages/CompactObjectStorageDiskTransaction.cpp b/cpp-ch/local-engine/Disks/ObjectStorages/CompactObjectStorageDiskTransaction.cpp new file mode 100644 index 0000000000000..7a3ba4bed2449 --- /dev/null +++ b/cpp-ch/local-engine/Disks/ObjectStorages/CompactObjectStorageDiskTransaction.cpp @@ -0,0 +1,133 @@ +/* + * 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. + */ + +#include "CompactObjectStorageDiskTransaction.h" + +#include +#include + +namespace local_engine +{ +int getFileOrder(const std::string & path) +{ + if (path.ends_with("columns.txt")) + return 1; + if (path.ends_with("metadata_version.txt")) + return 2; + if (path.ends_with("count.txt")) + return 3; + if (path.ends_with("default_compression_codec.txt")) + return 4; + if (path.ends_with("checksums.txt")) + return 5; + if (path.ends_with("uuid.txt")) + return 6; + if (path.ends_with(".cmrk3") || path.ends_with(".cmrk2") || path.ends_with(".cmrk1") || + path.ends_with(".mrk3") || path.ends_with(".mrk2") || path.ends_with(".mrk1")) + return 10; + if (path.ends_with("idx")) + return 20; + if (path.ends_with("bin")) + return 1000; + return 100; +} + +bool isMetaDataFile(const std::string & path) +{ + return !path.ends_with("bin"); +} + +using FileMappings = std::vector>>; + +void CompactObjectStorageDiskTransaction::commit() +{ + auto metadata_tx = disk.getMetadataStorage()->createTransaction(); + std::filesystem::path data_path = std::filesystem::path(prefix_path) / "data.bin"; + std::filesystem::path meta_path = std::filesystem::path(prefix_path) / "meta.bin"; + + auto object_storage = disk.getObjectStorage(); + auto data_key = object_storage->generateObjectKeyForPath(data_path); + auto meta_key = object_storage->generateObjectKeyForPath(meta_path); + + disk.createDirectories(prefix_path); + auto data_write_buffer = object_storage->writeObject(DB::StoredObject(data_key.serialize(), data_path), DB::WriteMode::Rewrite); + auto meta_write_buffer = object_storage->writeObject(DB::StoredObject(meta_key.serialize(), meta_path), DB::WriteMode::Rewrite); + String buffer; + buffer.resize(1024 * 1024); + + auto merge_files = [&](std::ranges::input_range auto && list, DB::WriteBuffer & out, const DB::ObjectStorageKey & key , const String &local_path) + { + size_t offset = 0; + std::ranges::for_each( + list, + [&](auto & item) + { + DB::DiskObjectStorageMetadata metadata(object_storage->getCommonKeyPrefix(), item.first); + DB::ReadBufferFromFilePRead read(item.second->getAbsolutePath()); + int file_size = 0; + while (int count = read.readBig(buffer.data(), buffer.size())) + { + file_size += count; + out.write(buffer.data(), count); + } + metadata.addObject(key, offset, file_size); + metadata_tx->writeStringToFile(item.first, metadata.serializeToString()); + offset += file_size; + }); + + // You can load the complete file in advance through this metadata original, which improves the download efficiency of mergetree metadata. + DB::DiskObjectStorageMetadata whole_meta(object_storage->getCommonKeyPrefix(), local_path); + whole_meta.addObject(key, 0, offset); + metadata_tx->writeStringToFile(local_path, whole_meta.serializeToString()); + out.sync(); + }; + + merge_files(files | std::ranges::views::filter([](auto file) { return !isMetaDataFile(file.first); }), *data_write_buffer, data_key, data_path); + merge_files(files | std::ranges::views::filter([](auto file) { return isMetaDataFile(file.first); }), *meta_write_buffer, meta_key, meta_path); + + metadata_tx->commit(); + files.clear(); +} + +std::unique_ptr CompactObjectStorageDiskTransaction::writeFile( + const std::string & path, + size_t buf_size, + DB::WriteMode mode, + const DB::WriteSettings &, + bool) +{ + if (mode != DB::WriteMode::Rewrite) + { + throw DB::Exception(DB::ErrorCodes::NOT_IMPLEMENTED, "Operation `writeFile` with Append is not implemented"); + } + if (prefix_path.empty()) + prefix_path = path.substr(0, path.find_last_of('/')); + else if (!path.starts_with(prefix_path)) + throw DB::Exception( + DB::ErrorCodes::NOT_IMPLEMENTED, + "Don't support write file in different dirs, path {}, prefix path: {}", + path, + prefix_path); + auto tmp = std::make_shared(tmp_data); + files.emplace_back(path, tmp); + auto tx = disk.getMetadataStorage()->createTransaction(); + tx->createDirectoryRecursive(std::filesystem::path(path).parent_path()); + tx->createEmptyMetadataFile(path); + tx->commit(); + return std::make_unique(tmp->getAbsolutePath(), buf_size); +} +} \ No newline at end of file diff --git a/cpp-ch/local-engine/Disks/ObjectStorages/CompactObjectStorageDiskTransaction.h b/cpp-ch/local-engine/Disks/ObjectStorages/CompactObjectStorageDiskTransaction.h new file mode 100644 index 0000000000000..e15c362f304ae --- /dev/null +++ b/cpp-ch/local-engine/Disks/ObjectStorages/CompactObjectStorageDiskTransaction.h @@ -0,0 +1,175 @@ +/* + * 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. + */ +#pragma once +#include +#include +#include +#include + + +namespace DB +{ +namespace ErrorCodes +{ +extern const int NOT_IMPLEMENTED; +} +} + +namespace local_engine +{ + +class CompactObjectStorageDiskTransaction: public DB::IDiskTransaction { + public: + explicit CompactObjectStorageDiskTransaction(DB::IDisk & disk_, const DB::DiskPtr tmp_) + : disk(disk_), tmp_data(tmp_) + { + chassert(!tmp_->isRemote()); + } + + void commit() override; + + void undo() override + { + throw DB::Exception(DB::ErrorCodes::NOT_IMPLEMENTED, "Operation `undo` is not implemented"); + } + + void createDirectory(const std::string & path) override + { + disk.createDirectory(path); + } + + void createDirectories(const std::string & path) override + { + disk.createDirectories(path); + } + + void createFile(const std::string & path) override + { + disk.createFile(path); + } + + void clearDirectory(const std::string & path) override + { + throw DB::Exception(DB::ErrorCodes::NOT_IMPLEMENTED, "Operation `clearDirectory` is not implemented"); + } + + void moveDirectory(const std::string & from_path, const std::string & to_path) override + { + throw DB::Exception(DB::ErrorCodes::NOT_IMPLEMENTED, "Operation `moveDirectory` is not implemented"); + } + + void moveFile(const String & from_path, const String & to_path) override + { + throw DB::Exception(DB::ErrorCodes::NOT_IMPLEMENTED, "Operation `moveFile` is not implemented"); + } + + void replaceFile(const std::string & from_path, const std::string & to_path) override + { + throw DB::Exception(DB::ErrorCodes::NOT_IMPLEMENTED, "Operation `replaceFile` is not implemented"); + } + + void copyFile(const std::string & from_file_path, const std::string & to_file_path, const DB::ReadSettings & read_settings, const DB::WriteSettings & write_settings) override + { + throw DB::Exception(DB::ErrorCodes::NOT_IMPLEMENTED, "Operation `copyFile` is not implemented"); + } + + std::unique_ptr writeFile( /// NOLINT + const std::string & path, + size_t buf_size, + DB::WriteMode mode, + const DB::WriteSettings & settings, + bool /*autocommit */) override; + + + void writeFileUsingBlobWritingFunction(const String & path, DB::WriteMode mode, WriteBlobFunction && write_blob_function) override + { + throw DB::Exception(DB::ErrorCodes::NOT_IMPLEMENTED, "Operation `writeFileUsingBlobWritingFunction` is not implemented"); + } + + void removeFile(const std::string & path) override + { + throw DB::Exception(DB::ErrorCodes::NOT_IMPLEMENTED, "Operation `removeFile` is not implemented"); + } + + void removeFileIfExists(const std::string & path) override + { + throw DB::Exception(DB::ErrorCodes::NOT_IMPLEMENTED, "Operation `removeFileIfExists` is not implemented"); + } + + void removeDirectory(const std::string & path) override + { + throw DB::Exception(DB::ErrorCodes::NOT_IMPLEMENTED, "Operation `removeDirectory` is not implemented"); + } + + void removeRecursive(const std::string & path) override + { + throw DB::Exception(DB::ErrorCodes::NOT_IMPLEMENTED, "Operation `removeRecursive` is not implemented"); + } + + void removeSharedFile(const std::string & path, bool keep_shared_data) override + { + throw DB::Exception(DB::ErrorCodes::NOT_IMPLEMENTED, "Operation `removeSharedFile` is not implemented"); + } + + void removeSharedRecursive(const std::string & path, bool keep_all_shared_data, const DB::NameSet & file_names_remove_metadata_only) override + { + throw DB::Exception(DB::ErrorCodes::NOT_IMPLEMENTED, "Operation `removeSharedRecursive` is not implemented"); + } + + void removeSharedFileIfExists(const std::string & path, bool keep_shared_data) override + { + throw DB::Exception(DB::ErrorCodes::NOT_IMPLEMENTED, "Operation `removeSharedFileIfExists` is not implemented"); + } + + void removeSharedFiles(const DB::RemoveBatchRequest & files, bool keep_all_batch_data, const DB::NameSet & file_names_remove_metadata_only) override + { + throw DB::Exception(DB::ErrorCodes::NOT_IMPLEMENTED, "Operation `removeSharedFiles` is not implemented"); + } + + void setLastModified(const std::string & path, const Poco::Timestamp & timestamp) override + { + disk.setLastModified(path, timestamp); + } + + void chmod(const String & path, mode_t mode) override + { + disk.chmod(path, mode); + } + + void setReadOnly(const std::string & path) override + { + disk.setReadOnly(path); + } + + void createHardLink(const std::string & src_path, const std::string & dst_path) override + { + throw DB::Exception(DB::ErrorCodes::NOT_IMPLEMENTED, "Operation `createHardLink` is not implemented"); + } + + void truncateFile(const std::string & /* src_path */, size_t /* target_size */) override + { + throw DB::Exception(DB::ErrorCodes::NOT_IMPLEMENTED, "Operation `truncateFile` is not implemented"); + } + +private: + DB::IDisk & disk; + DB::DiskPtr tmp_data; + std::vector>> files; + String prefix_path = ""; +}; +} + diff --git a/cpp-ch/local-engine/Disks/ObjectStorages/GlutenDiskHDFS.cpp b/cpp-ch/local-engine/Disks/ObjectStorages/GlutenDiskHDFS.cpp index f207ad232b4f2..9c4b390ea8b04 100644 --- a/cpp-ch/local-engine/Disks/ObjectStorages/GlutenDiskHDFS.cpp +++ b/cpp-ch/local-engine/Disks/ObjectStorages/GlutenDiskHDFS.cpp @@ -20,12 +20,19 @@ #include #include + +#include "CompactObjectStorageDiskTransaction.h" #if USE_HDFS namespace local_engine { using namespace DB; +DiskTransactionPtr GlutenDiskHDFS::createTransaction() +{ + return std::make_shared(*this, SerializedPlanParser::global_context->getTempDataOnDisk()->getVolume()->getDisk()); +} + void GlutenDiskHDFS::createDirectory(const String & path) { DiskObjectStorage::createDirectory(path); diff --git a/cpp-ch/local-engine/Disks/ObjectStorages/GlutenDiskHDFS.h b/cpp-ch/local-engine/Disks/ObjectStorages/GlutenDiskHDFS.h index 97a99f1deaba1..b0f82a340b1f4 100644 --- a/cpp-ch/local-engine/Disks/ObjectStorages/GlutenDiskHDFS.h +++ b/cpp-ch/local-engine/Disks/ObjectStorages/GlutenDiskHDFS.h @@ -21,6 +21,8 @@ #include #include +#include +#include #if USE_HDFS #include #endif @@ -51,6 +53,8 @@ class GlutenDiskHDFS : public DB::DiskObjectStorage throttler = std::make_shared(max_speed); } + DB::DiskTransactionPtr createTransaction() override; + void createDirectory(const String & path) override; void createDirectories(const String & path) override; @@ -72,7 +76,17 @@ class GlutenDiskHDFS : public DB::DiskObjectStorage { DB::ObjectStoragePtr tmp = object_storage_creator(config, context); hdfs_object_storage = typeid_cast>(tmp); - object_storage = hdfs_object_storage; + // only for java ut + bool is_cache = object_storage->supportsCache(); + if (is_cache) + { + auto cache_os = reinterpret_cast(object_storage.get()); + object_storage = hdfs_object_storage; + auto cache = DB::FileCacheFactory::instance().getOrCreate(cache_os->getCacheName(), cache_os->getCacheSettings(), "storage_configuration.disks.hdfs_cache"); + wrapWithCache(cache, cache_os->getCacheSettings(), cache_os->getCacheConfigName()); + } + else + object_storage = hdfs_object_storage; } private: std::shared_ptr hdfs_object_storage; diff --git a/cpp-ch/local-engine/Disks/ObjectStorages/registerGlutenDiskObjectStorage.cpp b/cpp-ch/local-engine/Disks/ObjectStorages/registerGlutenDiskObjectStorage.cpp index 9e45464980347..7d4d06a1239ff 100644 --- a/cpp-ch/local-engine/Disks/ObjectStorages/registerGlutenDiskObjectStorage.cpp +++ b/cpp-ch/local-engine/Disks/ObjectStorages/registerGlutenDiskObjectStorage.cpp @@ -15,11 +15,12 @@ * limitations under the License. */ #include "config.h" +#include #include #if USE_AWS_S3 +#include #include #include -#include #endif #if USE_HDFS diff --git a/cpp-ch/local-engine/Functions/FunctionsBloomFilter.h b/cpp-ch/local-engine/Functions/FunctionsBloomFilter.h index 9fce53414b016..fea2c7f47d4f5 100644 --- a/cpp-ch/local-engine/Functions/FunctionsBloomFilter.h +++ b/cpp-ch/local-engine/Functions/FunctionsBloomFilter.h @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -40,15 +41,11 @@ #include -#include - - namespace DB { namespace ErrorCodes { extern const int ILLEGAL_TYPE_OF_ARGUMENT; -extern const int BAD_ARGUMENTS; } } diff --git a/cpp-ch/local-engine/Functions/SparkFunctionArrayJoin.cpp b/cpp-ch/local-engine/Functions/SparkFunctionArrayJoin.cpp new file mode 100644 index 0000000000000..ed99c0904272f --- /dev/null +++ b/cpp-ch/local-engine/Functions/SparkFunctionArrayJoin.cpp @@ -0,0 +1,204 @@ +/* + * 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. + */ +#include +#include +#include +#include +#include +#include +#include + +using namespace DB; + +namespace DB +{ +namespace ErrorCodes +{ + extern const int ILLEGAL_TYPE_OF_ARGUMENT; + extern const int NUMBER_OF_ARGUMENTS_DOESNT_MATCH; +} +} + +namespace local_engine +{ +class SparkFunctionArrayJoin : public IFunction +{ +public: + static constexpr auto name = "sparkArrayJoin"; + static FunctionPtr create(ContextPtr) { return std::make_shared(); } + SparkFunctionArrayJoin() = default; + ~SparkFunctionArrayJoin() override = default; + bool isSuitableForShortCircuitArgumentsExecution(const DataTypesWithConstInfo &) const override { return true; } + size_t getNumberOfArguments() const override { return 0; } + String getName() const override { return name; } + bool isVariadic() const override { return true; } + bool useDefaultImplementationForNulls() const override { return false; } + + DB::DataTypePtr getReturnTypeImpl(const ColumnsWithTypeAndName &) const override + { + auto data_type = std::make_shared(); + return makeNullable(data_type); + } + + ColumnPtr executeImpl(const ColumnsWithTypeAndName & arguments, const DataTypePtr &, size_t) const override + { + if (arguments.size() != 2 && arguments.size() != 3) + throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} must have 2 or 3 arguments", getName()); + + const auto * arg_null_col = checkAndGetColumn(arguments[0].column.get()); + const ColumnArray * array_col; + if (!arg_null_col) + array_col = checkAndGetColumn(arguments[0].column.get()); + else + array_col = checkAndGetColumn(arg_null_col->getNestedColumnPtr().get()); + if (!array_col) + throw Exception(ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Function {} 1st argument must be array type", getName()); + + auto res_col = ColumnString::create(); + auto null_col = ColumnUInt8::create(array_col->size(), 0); + PaddedPODArray & null_result = null_col->getData(); + std::pair delim_p, null_replacement_p; + bool return_result = false; + auto checkAndGetConstString = [&](const ColumnPtr & col) -> std::pair + { + StringRef res; + const auto * str_null_col = checkAndGetColumnConstData(col.get()); + if (str_null_col) + { + if (str_null_col->isNullAt(0)) + { + for (size_t i = 0; i < array_col->size(); ++i) + { + res_col->insertDefault(); + null_result[i] = 1; + } + return_result = true; + return std::pair(false, res); + } + } + else + { + const auto * string_col = checkAndGetColumnConstData(col.get()); + if (!string_col) + return std::pair(false, res); + else + return std::pair(true, string_col->getDataAt(0)); + } + }; + delim_p = checkAndGetConstString(arguments[1].column); + if (return_result) + return ColumnNullable::create(std::move(res_col), std::move(null_col)); + + if (arguments.size() == 3) + { + null_replacement_p = checkAndGetConstString(arguments[2].column); + if (return_result) + return ColumnNullable::create(std::move(res_col), std::move(null_col)); + } + const ColumnNullable * array_nested_col = checkAndGetColumn(&array_col->getData()); + const ColumnString * string_col; + if (array_nested_col) + string_col = checkAndGetColumn(array_nested_col->getNestedColumnPtr().get()); + else + string_col = checkAndGetColumn(&array_col->getData()); + const ColumnArray::Offsets & array_offsets = array_col->getOffsets(); + const ColumnString::Offsets & string_offsets = string_col->getOffsets(); + const ColumnString::Chars & string_data = string_col->getChars(); + const ColumnNullable * delim_col = checkAndGetColumn(arguments[1].column.get()); + const ColumnNullable * null_replacement_col = arguments.size() == 3 ? checkAndGetColumn(arguments[2].column.get()) : nullptr; + size_t current_offset = 0, array_pos = 0; + for (size_t i = 0; i < array_col->size(); ++i) + { + String res; + auto setResultNull = [&]() -> void + { + res_col->insertDefault(); + null_result[i] = 1; + current_offset = array_offsets[i]; + }; + auto getDelimiterOrNullReplacement = [&](const std::pair & s, const ColumnNullable * col) -> StringRef + { + if (s.first) + return s.second; + else + { + if (col->isNullAt(i)) + return StringRef(nullptr, 0); + else + { + const ColumnString * col_string = checkAndGetColumn(col->getNestedColumnPtr().get()); + return col_string->getDataAt(i); + } + } + }; + if (arg_null_col->isNullAt(i)) + { + setResultNull(); + continue; + } + const StringRef delim = getDelimiterOrNullReplacement(delim_p, delim_col); + if (!delim.data) + { + setResultNull(); + continue; + } + StringRef null_replacement; + if (arguments.size() == 3) + { + null_replacement = getDelimiterOrNullReplacement(null_replacement_p, null_replacement_col); + if (!null_replacement.data) + { + setResultNull(); + continue; + } + } + + size_t array_size = array_offsets[i] - current_offset; + size_t data_pos = array_pos == 0 ? 0 : string_offsets[array_pos - 1]; + for (size_t j = 0; j < array_size; ++j) + { + if (array_nested_col && array_nested_col->isNullAt(j + array_pos)) + { + if (null_replacement.data) + { + res += null_replacement.toString(); + if (j != array_size - 1) + res += delim.toString(); + } + } + else + { + const StringRef s(&string_data[data_pos], string_offsets[j + array_pos] - data_pos - 1); + res += s.toString(); + if (j != array_size - 1) + res += delim.toString(); + } + data_pos = string_offsets[j + array_pos]; + } + array_pos += array_size; + res_col->insertData(res.data(), res.length()); + current_offset = array_offsets[i]; + } + return ColumnNullable::create(std::move(res_col), std::move(null_col)); + } +}; + +REGISTER_FUNCTION(SparkArrayJoin) +{ + factory.registerFunction(); +} +} \ No newline at end of file diff --git a/cpp-ch/local-engine/Functions/SparkFunctionArraySort.cpp b/cpp-ch/local-engine/Functions/SparkFunctionArraySort.cpp index 126b84eaaf95d..1371ec60e1796 100644 --- a/cpp-ch/local-engine/Functions/SparkFunctionArraySort.cpp +++ b/cpp-ch/local-engine/Functions/SparkFunctionArraySort.cpp @@ -14,75 +14,212 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include -namespace DB +namespace DB::ErrorCodes { + extern const int TOO_FEW_ARGUMENTS_FOR_FUNCTION; + extern const int ILLEGAL_TYPE_OF_ARGUMENT; + extern const int TYPE_MISMATCH; + extern const int ILLEGAL_COLUMN; +} -namespace ErrorCodes +/// The usage of `arraySort` in CH is different from Spark's `sort_array` function. +/// We need to implement a custom function to sort arrays. +namespace local_engine { - extern const int LOGICAL_ERROR; -} -namespace +struct LambdaLess { + const DB::IColumn & column; + DB::DataTypePtr type; + const DB::ColumnFunction & lambda; + explicit LambdaLess(const DB::IColumn & column_, DB::DataTypePtr type_, const DB::ColumnFunction & lambda_) + : column(column_), type(type_), lambda(lambda_) {} + + /// May not efficient + bool operator()(size_t lhs, size_t rhs) const + { + /// The column name seems not matter. + auto left_value_col = DB::ColumnWithTypeAndName(oneRowColumn(lhs), type, "left"); + auto right_value_col = DB::ColumnWithTypeAndName(oneRowColumn(rhs), type, "right"); + auto cloned_lambda = lambda.cloneResized(1); + auto * lambda_ = typeid_cast(cloned_lambda.get()); + lambda_->appendArguments({std::move(left_value_col), std::move(right_value_col)}); + auto compare_res_col = lambda_->reduce(); + DB::Field field; + compare_res_col.column->get(0, field); + return field.get() < 0; + } +private: + ALWAYS_INLINE DB::ColumnPtr oneRowColumn(size_t i) const + { + auto res = column.cloneEmpty(); + res->insertFrom(column, i); + return std::move(res); + } +}; -template struct Less { - const IColumn & column; + const DB::IColumn & column; - explicit Less(const IColumn & column_) : column(column_) { } + explicit Less(const DB::IColumn & column_) : column(column_) { } bool operator()(size_t lhs, size_t rhs) const { - if constexpr (positive) - /* - Note: We use nan_direction_hint=-1 for ascending sort to make NULL the least value. - However, NaN is also considered the least value, - which results in different sorting results compared to Spark since Spark treats NaN as the greatest value. - For now, we are temporarily ignoring this issue because cases with NaN are rare, - and aligning with Spark would require tricky modifications to the CH underlying code. - */ - return column.compareAt(lhs, rhs, column, -1) < 0; - else - return column.compareAt(lhs, rhs, column, -1) > 0; + return column.compareAt(lhs, rhs, column, 1) < 0; } }; -} - -template -ColumnPtr SparkArraySortImpl::execute( - const ColumnArray & array, - ColumnPtr mapped, - const ColumnWithTypeAndName * fixed_arguments [[maybe_unused]]) +class FunctionSparkArraySort : public DB::IFunction { - const ColumnArray::Offsets & offsets = array.getOffsets(); +public: + static constexpr auto name = "arraySortSpark"; + static DB::FunctionPtr create(DB::ContextPtr /*context*/) { return std::make_shared(); } - size_t size = offsets.size(); - size_t nested_size = array.getData().size(); - IColumn::Permutation permutation(nested_size); + bool isVariadic() const override { return true; } + size_t getNumberOfArguments() const override { return 0; } + bool isSuitableForShortCircuitArgumentsExecution(const DB::DataTypesWithConstInfo &) const override { return true; } - for (size_t i = 0; i < nested_size; ++i) - permutation[i] = i; + bool useDefaultImplementationForNulls() const override { return false; } + bool useDefaultImplementationForLowCardinalityColumns() const override { return false; } - ColumnArray::Offset current_offset = 0; - for (size_t i = 0; i < size; ++i) + void getLambdaArgumentTypes(DB::DataTypes & arguments) const override { - auto next_offset = offsets[i]; - ::sort(&permutation[current_offset], &permutation[next_offset], Less(*mapped)); - current_offset = next_offset; + if (arguments.size() < 2) + throw DB::Exception(DB::ErrorCodes::TOO_FEW_ARGUMENTS_FOR_FUNCTION, "Function {} requires as arguments a lambda function and an array", getName()); + + if (arguments.size() > 1) + { + const auto * lambda_function_type = DB::checkAndGetDataType(arguments[0].get()); + if (!lambda_function_type || lambda_function_type->getArgumentTypes().size() != 2) + throw DB::Exception(DB::ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "First argument of function {} must be a lambda function with 2 arguments, found {} instead.", + getName(), arguments[0]->getName()); + auto array_nesteed_type = DB::checkAndGetDataType(arguments.back().get())->getNestedType(); + DB::DataTypes lambda_args = {array_nesteed_type, array_nesteed_type}; + arguments[0] = std::make_shared(lambda_args); + } } - return ColumnArray::create(array.getData().permute(permutation, 0), array.getOffsetsPtr()); -} + DB::DataTypePtr getReturnTypeImpl(const DB::ColumnsWithTypeAndName & arguments) const override + { + if (arguments.size() > 1) + { + const auto * lambda_function_type = checkAndGetDataType(arguments[0].type.get()); + if (!lambda_function_type) + throw DB::Exception(DB::ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "First argument for function {} must be a function", getName()); + } + + return arguments.back().type; + } + + DB::ColumnPtr executeImpl(const DB::ColumnsWithTypeAndName & arguments, const DB::DataTypePtr &, size_t input_rows_count) const override + { + auto array_col = arguments.back().column; + auto array_type = arguments.back().type; + DB::ColumnPtr null_map = nullptr; + if (const auto * null_col = typeid_cast(array_col.get())) + { + null_map = null_col->getNullMapColumnPtr(); + array_col = null_col->getNestedColumnPtr(); + array_type = typeid_cast(array_type.get())->getNestedType(); + } + + const auto * array_col_concrete = DB::checkAndGetColumn(array_col.get()); + if (!array_col_concrete) + { + const auto * aray_col_concrete_const = DB::checkAndGetColumnConst(array_col.get()); + if (!aray_col_concrete_const) + { + throw DB::Exception(DB::ErrorCodes::ILLEGAL_COLUMN, "Expected array column, found {}", array_col->getName()); + } + array_col = DB::recursiveRemoveLowCardinality(aray_col_concrete_const->convertToFullColumn()); + array_col_concrete = DB::checkAndGetColumn(array_col.get()); + } + auto array_nested_type = DB::checkAndGetDataType(array_type.get())->getNestedType(); + + DB::ColumnPtr sorted_array_col = nullptr; + if (arguments.size() > 1) + sorted_array_col = executeWithLambda(*array_col_concrete, array_nested_type, *checkAndGetColumn(arguments[0].column.get())); + else + sorted_array_col = executeWithoutLambda(*array_col_concrete); + + if (null_map) + { + sorted_array_col = DB::ColumnNullable::create(sorted_array_col, null_map); + } + return sorted_array_col; + } +private: + static DB::ColumnPtr executeWithLambda(const DB::ColumnArray & array_col, DB::DataTypePtr array_nested_type, const DB::ColumnFunction & lambda) + { + const auto & offsets = array_col.getOffsets(); + auto rows = array_col.size(); + + size_t nested_size = array_col.getData().size(); + DB::IColumn::Permutation permutation(nested_size); + for (size_t i = 0; i < nested_size; ++i) + permutation[i] = i; + + DB::ColumnArray::Offset current_offset = 0; + for (size_t i = 0; i < rows; ++i) + { + auto next_offset = offsets[i]; + ::sort(&permutation[current_offset], + &permutation[next_offset], + LambdaLess(array_col.getData(), + array_nested_type, + lambda)); + current_offset = next_offset; + } + auto res = DB::ColumnArray::create(array_col.getData().permute(permutation, 0), array_col.getOffsetsPtr()); + return res; + } + + static DB::ColumnPtr executeWithoutLambda(const DB::ColumnArray & array_col) + { + const auto & offsets = array_col.getOffsets(); + auto rows = array_col.size(); + + size_t nested_size = array_col.getData().size(); + DB::IColumn::Permutation permutation(nested_size); + for (size_t i = 0; i < nested_size; ++i) + permutation[i] = i; + + DB::ColumnArray::Offset current_offset = 0; + for (size_t i = 0; i < rows; ++i) + { + auto next_offset = offsets[i]; + ::sort(&permutation[current_offset], + &permutation[next_offset], + Less(array_col.getData())); + current_offset = next_offset; + } + auto res = DB::ColumnArray::create(array_col.getData().permute(permutation, 0), array_col.getOffsetsPtr()); + return res; + } + + String getName() const override + { + return name; + } + +}; REGISTER_FUNCTION(ArraySortSpark) { - factory.registerFunction(); - factory.registerFunction(); + factory.registerFunction(); } - } diff --git a/cpp-ch/local-engine/Functions/SparkFunctionHashingExtended.h b/cpp-ch/local-engine/Functions/SparkFunctionHashingExtended.h index 82d678aa2a4e0..57bf00ba99044 100644 --- a/cpp-ch/local-engine/Functions/SparkFunctionHashingExtended.h +++ b/cpp-ch/local-engine/Functions/SparkFunctionHashingExtended.h @@ -28,6 +28,7 @@ #include #include #include +#include namespace DB { @@ -200,14 +201,14 @@ class SparkFunctionAnyHash : public IFunction { if constexpr (std::is_same_v) { - if (n == -0.0f) [[unlikely]] + if (n == -0.0f || isNaN(n)) [[unlikely]] return applyNumber(0, seed); else return Impl::apply(reinterpret_cast(&n), sizeof(n), seed); } else { - if (n == -0.0) [[unlikely]] + if (n == -0.0 || isNaN(n)) [[unlikely]] return applyNumber(0, seed); else return Impl::apply(reinterpret_cast(&n), sizeof(n), seed); diff --git a/cpp-ch/local-engine/Functions/SparkFunctionRegexpExtractAll.cpp b/cpp-ch/local-engine/Functions/SparkFunctionRegexpExtractAll.cpp index ca4f1002059f8..68136713f59c6 100644 --- a/cpp-ch/local-engine/Functions/SparkFunctionRegexpExtractAll.cpp +++ b/cpp-ch/local-engine/Functions/SparkFunctionRegexpExtractAll.cpp @@ -77,7 +77,7 @@ namespace if (arguments.size() == 3) args.emplace_back(FunctionArgumentDescriptor{"index", static_cast(&isInteger), nullptr, "Integer"}); - validateFunctionArgumentTypes(*this, arguments, args); + validateFunctionArguments(*this, arguments, args); return std::make_shared(std::make_shared()); } diff --git a/cpp-ch/local-engine/Functions/SparkFunctionSortArray.cpp b/cpp-ch/local-engine/Functions/SparkFunctionSortArray.cpp new file mode 100644 index 0000000000000..42b88fbce730d --- /dev/null +++ b/cpp-ch/local-engine/Functions/SparkFunctionSortArray.cpp @@ -0,0 +1,88 @@ +/* + * 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. + */ +#include +#include + +namespace DB +{ + +namespace ErrorCodes +{ + extern const int LOGICAL_ERROR; +} + +namespace +{ + +template +struct Less +{ + const IColumn & column; + + explicit Less(const IColumn & column_) : column(column_) { } + + bool operator()(size_t lhs, size_t rhs) const + { + if constexpr (positive) + /* + Note: We use nan_direction_hint=-1 for ascending sort to make NULL the least value. + However, NaN is also considered the least value, + which results in different sorting results compared to Spark since Spark treats NaN as the greatest value. + For now, we are temporarily ignoring this issue because cases with NaN are rare, + and aligning with Spark would require tricky modifications to the CH underlying code. + */ + return column.compareAt(lhs, rhs, column, -1) < 0; + else + return column.compareAt(lhs, rhs, column, -1) > 0; + } +}; + +} + +template +ColumnPtr SparkSortArrayImpl::execute( + const ColumnArray & array, + ColumnPtr mapped, + const ColumnWithTypeAndName * fixed_arguments [[maybe_unused]]) +{ + const ColumnArray::Offsets & offsets = array.getOffsets(); + + size_t size = offsets.size(); + size_t nested_size = array.getData().size(); + IColumn::Permutation permutation(nested_size); + + for (size_t i = 0; i < nested_size; ++i) + permutation[i] = i; + + ColumnArray::Offset current_offset = 0; + for (size_t i = 0; i < size; ++i) + { + auto next_offset = offsets[i]; + ::sort(&permutation[current_offset], &permutation[next_offset], Less(*mapped)); + current_offset = next_offset; + } + + return ColumnArray::create(array.getData().permute(permutation, 0), array.getOffsetsPtr()); +} + +REGISTER_FUNCTION(SortArraySpark) +{ + factory.registerFunction(); + factory.registerFunction(); +} + +} diff --git a/cpp-ch/local-engine/Functions/SparkFunctionArraySort.h b/cpp-ch/local-engine/Functions/SparkFunctionSortArray.h similarity index 86% rename from cpp-ch/local-engine/Functions/SparkFunctionArraySort.h rename to cpp-ch/local-engine/Functions/SparkFunctionSortArray.h index 9ce48f9c0baf5..18c2128c0258e 100644 --- a/cpp-ch/local-engine/Functions/SparkFunctionArraySort.h +++ b/cpp-ch/local-engine/Functions/SparkFunctionSortArray.h @@ -32,7 +32,7 @@ namespace ErrorCodes /** Sort arrays, by values of its elements, or by values of corresponding elements of calculated expression (known as "schwartzsort"). */ template -struct SparkArraySortImpl +struct SparkSortArrayImpl { static bool needBoolean() { return false; } static bool needExpression() { return false; } @@ -67,16 +67,16 @@ struct SparkArraySortImpl const ColumnWithTypeAndName * fixed_arguments [[maybe_unused]] = nullptr); }; -struct NameArraySort +struct NameSortArray { - static constexpr auto name = "arraySortSpark"; + static constexpr auto name = "sortArraySpark"; }; -struct NameArrayReverseSort +struct NameReverseSortArray { - static constexpr auto name = "arrayReverseSortSpark"; + static constexpr auto name = "reverseSortArraySpark"; }; -using SparkFunctionArraySort = FunctionArrayMapped, NameArraySort>; -using SparkFunctionArrayReverseSort = FunctionArrayMapped, NameArrayReverseSort>; +using SparkFunctionSortArray = FunctionArrayMapped, NameSortArray>; +using SparkFunctionReverseSortArray = FunctionArrayMapped, NameReverseSortArray>; } diff --git a/cpp-ch/local-engine/Join/BroadCastJoinBuilder.cpp b/cpp-ch/local-engine/Join/BroadCastJoinBuilder.cpp index 1c79a00a7c4c5..4d5eae6dc0b57 100644 --- a/cpp-ch/local-engine/Join/BroadCastJoinBuilder.cpp +++ b/cpp-ch/local-engine/Join/BroadCastJoinBuilder.cpp @@ -15,16 +15,18 @@ * limitations under the License. */ #include "BroadCastJoinBuilder.h" + #include #include #include #include #include +#include #include #include #include #include -#include +#include #include #include @@ -52,6 +54,20 @@ jlong callJavaGet(const std::string & id) return result; } +DB::Block resetBuildTableBlockName(Block & block, bool only_one = false) +{ + DB::ColumnsWithTypeAndName new_cols; + for (const auto & col : block) + { + // Add a prefix to avoid column name conflicts with left table. + new_cols.emplace_back(col.column, col.type, BlockUtil::RIHGT_COLUMN_PREFIX + col.name); + + if (only_one) + break; + } + return DB::Block(new_cols); +} + void cleanBuildHashTable(const std::string & hash_table_id, jlong instance) { /// Thread status holds raw pointer on query context, thus it always must be destroyed @@ -81,26 +97,71 @@ std::shared_ptr buildJoin( DB::ReadBuffer & input, jlong row_count, const std::string & join_keys, - substrait::JoinRel_JoinType join_type, + jint join_type, bool has_mixed_join_condition, const std::string & named_struct) { auto join_key_list = Poco::StringTokenizer(join_keys, ","); Names key_names; for (const auto & key_name : join_key_list) - key_names.emplace_back(key_name); + key_names.emplace_back(BlockUtil::RIHGT_COLUMN_PREFIX + key_name); + DB::JoinKind kind; DB::JoinStrictness strictness; - std::tie(kind, strictness) = getJoinKindAndStrictness(join_type); + if (key.starts_with("BuiltBNLJBroadcastTable-")) + std::tie(kind, strictness) = JoinUtil::getCrossJoinKindAndStrictness(static_cast(join_type)); + else + std::tie(kind, strictness) = JoinUtil::getJoinKindAndStrictness(static_cast(join_type)); + substrait::NamedStruct substrait_struct; substrait_struct.ParseFromString(named_struct); Block header = TypeParser::buildBlockFromNamedStruct(substrait_struct); + header = resetBuildTableBlockName(header); + + Blocks data; + { + bool header_empty = header.getNamesAndTypesList().empty(); + bool only_one_column = header_empty; + NativeReader block_stream(input); + ProfileInfo info; + while (Block block = block_stream.read()) + { + if (header_empty) + { + // In bnlj, buidside output maybe empty, + // we use buildside header only for loop + // Like: select count(*) from t1 left join t2 + header = resetBuildTableBlockName(block, true); + header_empty = false; + } + + DB::ColumnsWithTypeAndName columns; + for (size_t i = 0; i < block.columns(); ++i) + { + const auto & column = block.getByPosition(i); + if (only_one_column) + { + auto virtual_block = BlockUtil::buildRowCountBlock(column.column->size()).getColumnsWithTypeAndName(); + header = virtual_block; + columns.emplace_back(virtual_block.back()); + break; + } + + columns.emplace_back(BlockUtil::convertColumnAsNecessary(column, header.getByPosition(i))); + } + + DB::Block final_block(columns); + info.update(final_block); + data.emplace_back(std::move(final_block)); + } + } + ColumnsDescription columns_description(header.getNamesAndTypesList()); return make_shared( - input, + data, row_count, key_names, true, diff --git a/cpp-ch/local-engine/Join/BroadCastJoinBuilder.h b/cpp-ch/local-engine/Join/BroadCastJoinBuilder.h index 9a6837e35a0ac..3d2e67f9df101 100644 --- a/cpp-ch/local-engine/Join/BroadCastJoinBuilder.h +++ b/cpp-ch/local-engine/Join/BroadCastJoinBuilder.h @@ -35,7 +35,7 @@ std::shared_ptr buildJoin( DB::ReadBuffer & input, jlong row_count, const std::string & join_keys, - substrait::JoinRel_JoinType join_type, + jint join_type, bool has_mixed_join_condition, const std::string & named_struct); void cleanBuildHashTable(const std::string & hash_table_id, jlong instance); diff --git a/cpp-ch/local-engine/Join/StorageJoinFromReadBuffer.cpp b/cpp-ch/local-engine/Join/StorageJoinFromReadBuffer.cpp index af306564a4c51..2f5afd434b416 100644 --- a/cpp-ch/local-engine/Join/StorageJoinFromReadBuffer.cpp +++ b/cpp-ch/local-engine/Join/StorageJoinFromReadBuffer.cpp @@ -15,17 +15,13 @@ * limitations under the License. */ #include "StorageJoinFromReadBuffer.h" -#include -#include #include -#include +#include #include -#include -#include +#include #include -#include #include namespace DB @@ -45,8 +41,6 @@ extern const int DEADLOCK_AVOIDED; using namespace DB; -constexpr auto RIHGT_COLUMN_PREFIX = "broadcast_right_"; - DB::Block rightSampleBlock(bool use_nulls, const StorageInMemoryMetadata & storage_metadata_, JoinKind kind) { DB::ColumnsWithTypeAndName new_cols; @@ -54,7 +48,7 @@ DB::Block rightSampleBlock(bool use_nulls, const StorageInMemoryMetadata & stora for (const auto & col : block) { // Add a prefix to avoid column name conflicts with left table. - new_cols.emplace_back(col.column, col.type, RIHGT_COLUMN_PREFIX + col.name); + new_cols.emplace_back(col.column, col.type, col.name); if (use_nulls && isLeftOrFull(kind)) { auto & new_col = new_cols.back(); @@ -68,7 +62,7 @@ namespace local_engine { StorageJoinFromReadBuffer::StorageJoinFromReadBuffer( - DB::ReadBuffer & in, + Blocks & data, size_t row_count_, const Names & key_names_, bool use_nulls_, @@ -79,7 +73,7 @@ StorageJoinFromReadBuffer::StorageJoinFromReadBuffer( const ConstraintsDescription & constraints, const String & comment, const bool overwrite_) - : key_names({}), use_nulls(use_nulls_), row_count(row_count_), overwrite(overwrite_) + : key_names(key_names_), use_nulls(use_nulls_), row_count(row_count_), overwrite(overwrite_) { storage_metadata.setColumns(columns); storage_metadata.setConstraints(constraints); @@ -88,74 +82,33 @@ StorageJoinFromReadBuffer::StorageJoinFromReadBuffer( for (const auto & key : key_names_) if (!storage_metadata.getColumns().hasPhysical(key)) throw Exception(ErrorCodes::NO_SUCH_COLUMN_IN_TABLE, "Key column ({}) does not exist in table declaration.", key); - for (const auto & name : key_names_) - key_names.push_back(RIHGT_COLUMN_PREFIX + name); auto table_join = std::make_shared(SizeLimits(), true, kind, strictness, key_names); - right_sample_block = rightSampleBlock(use_nulls, storage_metadata, table_join->kind()); - /// If there is mixed join conditions, need to build the hash join lazily, which rely on the real table join. - if (!has_mixed_join_condition) - buildJoin(in, right_sample_block, table_join); - else - collectAllInputs(in, right_sample_block); -} -/// The column names may be different in two blocks. -/// and the nullability also could be different, with TPCDS-Q1 as an example. -static DB::ColumnWithTypeAndName convertColumnAsNecessary(const DB::ColumnWithTypeAndName & column, const DB::ColumnWithTypeAndName & sample_column) -{ - if (sample_column.type->equals(*column.type)) - return {column.column, column.type, sample_column.name}; - else if ( - sample_column.type->isNullable() && !column.type->isNullable() - && DB::removeNullable(sample_column.type)->equals(*column.type)) + if (key_names.empty()) { - auto nullable_column = column; - DB::JoinCommon::convertColumnToNullable(nullable_column); - return {nullable_column.column, sample_column.type, sample_column.name}; + // For bnlj cross join, keys clauses should be empty. + table_join->resetKeys(); } + + right_sample_block = rightSampleBlock(use_nulls, storage_metadata, table_join->kind()); + /// If there is mixed join conditions, need to build the hash join lazily, which rely on the real table join. + if (!has_mixed_join_condition) + buildJoin(data, right_sample_block, table_join); else - throw DB::Exception( - DB::ErrorCodes::LOGICAL_ERROR, - "Columns have different types. original:{} expected:{}", - column.dumpStructure(), - sample_column.dumpStructure()); + collectAllInputs(data, right_sample_block); } -void StorageJoinFromReadBuffer::buildJoin(DB::ReadBuffer & in, const Block header, std::shared_ptr analyzed_join) +void StorageJoinFromReadBuffer::buildJoin(Blocks & data, const Block header, std::shared_ptr analyzed_join) { - local_engine::NativeReader block_stream(in); - ProfileInfo info; join = std::make_shared(analyzed_join, header, overwrite, row_count); - while (Block block = block_stream.read()) - { - DB::ColumnsWithTypeAndName columns; - for (size_t i = 0; i < block.columns(); ++i) - { - const auto & column = block.getByPosition(i); - columns.emplace_back(convertColumnAsNecessary(column, header.getByPosition(i))); - } - DB::Block final_block(columns); - info.update(final_block); - join->addBlockToJoin(final_block, true); - } + for (Block block : data) + join->addBlockToJoin(std::move(block), true); } -void StorageJoinFromReadBuffer::collectAllInputs(DB::ReadBuffer & in, const DB::Block header) +void StorageJoinFromReadBuffer::collectAllInputs(Blocks & data, const DB::Block) { - local_engine::NativeReader block_stream(in); - ProfileInfo info; - while (Block block = block_stream.read()) - { - DB::ColumnsWithTypeAndName columns; - for (size_t i = 0; i < block.columns(); ++i) - { - const auto & column = block.getByPosition(i); - columns.emplace_back(convertColumnAsNecessary(column, header.getByPosition(i))); - } - DB::Block final_block(columns); - info.update(final_block); - input_blocks.emplace_back(std::move(final_block)); - } + for (Block block : data) + input_blocks.emplace_back(std::move(block)); } void StorageJoinFromReadBuffer::buildJoinLazily(DB::Block header, std::shared_ptr analyzed_join) @@ -176,7 +129,7 @@ void StorageJoinFromReadBuffer::buildJoinLazily(DB::Block header, std::shared_pt for (size_t i = 0; i < block.columns(); ++i) { const auto & column = block.getByPosition(i); - columns.emplace_back(convertColumnAsNecessary(column, header.getByPosition(i))); + columns.emplace_back(BlockUtil::convertColumnAsNecessary(column, header.getByPosition(i))); } DB::Block final_block(columns); join->addBlockToJoin(final_block, true); diff --git a/cpp-ch/local-engine/Join/StorageJoinFromReadBuffer.h b/cpp-ch/local-engine/Join/StorageJoinFromReadBuffer.h index ddefda69c30fe..d9766c4392f4d 100644 --- a/cpp-ch/local-engine/Join/StorageJoinFromReadBuffer.h +++ b/cpp-ch/local-engine/Join/StorageJoinFromReadBuffer.h @@ -16,6 +16,7 @@ */ #pragma once #include +#include #include #include @@ -35,7 +36,7 @@ class StorageJoinFromReadBuffer { public: StorageJoinFromReadBuffer( - DB::ReadBuffer & in_, + DB::Blocks & data, size_t row_count, const DB::Names & key_names_, bool use_nulls_, @@ -65,8 +66,8 @@ class StorageJoinFromReadBuffer std::shared_ptr join = nullptr; void readAllBlocksFromInput(DB::ReadBuffer & in); - void buildJoin(DB::ReadBuffer & in, const DB::Block header, std::shared_ptr analyzed_join); - void collectAllInputs(DB::ReadBuffer & in, const DB::Block header); + void buildJoin(DB::Blocks & data, const DB::Block header, std::shared_ptr analyzed_join); + void collectAllInputs(DB::Blocks & data, const DB::Block header); void buildJoinLazily(DB::Block header, std::shared_ptr analyzed_join); }; } diff --git a/cpp-ch/local-engine/Operator/DefaultHashAggregateResult.cpp b/cpp-ch/local-engine/Operator/DefaultHashAggregateResult.cpp index 35f8915815950..fbad02fda5926 100644 --- a/cpp-ch/local-engine/Operator/DefaultHashAggregateResult.cpp +++ b/cpp-ch/local-engine/Operator/DefaultHashAggregateResult.cpp @@ -116,7 +116,7 @@ class DefaultHashAggrgateResultTransform : public DB::IProcessor has_input = true; output_chunk = DB::Chunk(result_cols, 1); auto info = std::make_shared(); - output_chunk.setChunkInfo(info); + output_chunk.getChunkInfos().add(std::move(info)); return Status::Ready; } @@ -124,10 +124,10 @@ class DefaultHashAggrgateResultTransform : public DB::IProcessor if (input.hasData()) { output_chunk = input.pull(true); - if (!output_chunk.hasChunkInfo()) + if (output_chunk.getChunkInfos().empty()) { auto info = std::make_shared(); - output_chunk.setChunkInfo(info); + output_chunk.getChunkInfos().add(std::move(info)); } has_input = true; return Status::Ready; diff --git a/cpp-ch/local-engine/Operator/ReplicateRowsStep.cpp b/cpp-ch/local-engine/Operator/ReplicateRowsStep.cpp new file mode 100644 index 0000000000000..f2d4bc8a865dc --- /dev/null +++ b/cpp-ch/local-engine/Operator/ReplicateRowsStep.cpp @@ -0,0 +1,108 @@ +/* + * 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. + */ +#include "ReplicateRowsStep.h" + +#include + +#include + +namespace DB +{ +namespace ErrorCodes +{ +extern const int LOGICAL_ERROR; +} +} + +namespace local_engine +{ +static DB::ITransformingStep::Traits getTraits() +{ + return DB::ITransformingStep::Traits + { + { + .preserves_number_of_streams = true, + .preserves_sorting = false, + }, + { + .preserves_number_of_rows = false, + } + }; +} + +ReplicateRowsStep::ReplicateRowsStep(const DB::DataStream & input_stream) + : ITransformingStep(input_stream, transformHeader(input_stream.header), getTraits()) +{ +} + +DB::Block ReplicateRowsStep::transformHeader(const DB::Block& input) +{ + DB::Block output; + for (int i = 1; i < input.columns(); i++) + { + output.insert(input.getByPosition(i)); + } + return output; +} + +void ReplicateRowsStep::transformPipeline( + DB::QueryPipelineBuilder & pipeline, + const DB::BuildQueryPipelineSettings & /*settings*/) +{ + pipeline.addSimpleTransform( + [&](const DB::Block & header) + { + return std::make_shared(header); + }); +} + +void ReplicateRowsStep::updateOutputStream() +{ + output_stream = createOutputStream(input_streams.front(), transformHeader(input_streams.front().header), getDataStreamTraits()); +} + +ReplicateRowsTransform::ReplicateRowsTransform(const DB::Block & input_header_) + : ISimpleTransform(input_header_, ReplicateRowsStep::transformHeader(input_header_), true) +{ +} + +void ReplicateRowsTransform::transform(DB::Chunk & chunk) +{ + auto replica_column = chunk.getColumns().front(); + size_t total_rows = 0; + for (int i = 0; i < replica_column->size(); i++) + { + total_rows += replica_column->get64(i); + } + + auto columns = chunk.detachColumns(); + DB::MutableColumns mutable_columns; + for (int i = 1; i < columns.size(); i++) + { + mutable_columns.push_back(columns[i]->cloneEmpty()); + mutable_columns.back()->reserve(total_rows); + DB::ColumnPtr src_col = columns[i]; + DB::MutableColumnPtr & cur = mutable_columns.back(); + for (int j = 0; j < replica_column->size(); j++) + { + cur->insertManyFrom(*src_col, j, replica_column->getUInt(j)); + } + } + + chunk.setColumns(std::move(mutable_columns), total_rows); +} +} \ No newline at end of file diff --git a/cpp-ch/local-engine/Operator/ReplicateRowsStep.h b/cpp-ch/local-engine/Operator/ReplicateRowsStep.h new file mode 100644 index 0000000000000..f588bf0ceb8c1 --- /dev/null +++ b/cpp-ch/local-engine/Operator/ReplicateRowsStep.h @@ -0,0 +1,48 @@ +/* + * 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. + */ +#pragma once + +#include +#include + +namespace local_engine +{ + +class ReplicateRowsStep : public DB::ITransformingStep +{ +public: + ReplicateRowsStep(const DB::DataStream& input_stream); + + static DB::Block transformHeader(const DB::Block& input); + + String getName() const override { return "ReplicateRowsStep"; } + void transformPipeline(DB::QueryPipelineBuilder& pipeline, + const DB::BuildQueryPipelineSettings& settings) override; +private: + void updateOutputStream() override; +}; + +class ReplicateRowsTransform : public DB::ISimpleTransform +{ +public: + ReplicateRowsTransform(const DB::Block& input_header_); + + String getName() const override { return "ReplicateRowsTransform"; } + void transform(DB::Chunk&) override; + +}; +} diff --git a/cpp-ch/local-engine/Parser/AdvancedParametersParseUtil.cpp b/cpp-ch/local-engine/Parser/AdvancedParametersParseUtil.cpp new file mode 100644 index 0000000000000..a7a07c0bf31ae --- /dev/null +++ b/cpp-ch/local-engine/Parser/AdvancedParametersParseUtil.cpp @@ -0,0 +1,127 @@ +/* + * 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. + */ +#include +#include +#include +#include +#include +#include +#include +namespace DB::ErrorCodes +{ + extern const int BAD_ARGUMENTS; +} + +namespace local_engine +{ + +template +void tryAssign(const std::unordered_map & kvs, const String & key, T & v); + +template<> +void tryAssign(const std::unordered_map & kvs, const String & key, String & v) +{ + auto it = kvs.find(key); + if (it != kvs.end()) + v = it->second; +} + +template<> +void tryAssign(const std::unordered_map & kvs, const String & key, bool & v) +{ + auto it = kvs.find(key); + if (it != kvs.end()) + { + if (it->second == "0" || it->second == "false" || it->second == "FALSE") + { + v = false; + } + else + { + v = true; + } + } +} + +template +void readStringUntilCharsInto(String & s, DB::ReadBuffer & buf) +{ + while (!buf.eof()) + { + char * next_pos = find_first_symbols(buf.position(), buf.buffer().end()); + + s.append(buf.position(), next_pos - buf.position()); + buf.position() = next_pos; + + if (buf.hasPendingData()) + return; + } +} + +/// In the format: Seg1:k1=v1\nk2=v2\n..\nSeg2:k1=v1\n... +std::unordered_map> convertToKVs(const String & advance) +{ + std::unordered_map> res; + std::unordered_map *kvs; + DB::ReadBufferFromString in(advance); + while(!in.eof()) + { + String key; + readStringUntilCharsInto<'=', '\n', ':'>(key, in); + if (key.empty()) + { + if (!in.eof()) + { + char c; + DB::readChar(c, in); + } + continue; + } + + char c; + DB::readChar(c, in); + if (c == ':') + { + res[key] = {}; + kvs = &res[key]; + continue; + } + + if (c != '=') + throw DB::Exception(DB::ErrorCodes::BAD_ARGUMENTS, "Invalid format, = is expected: {}", advance); + + String value; + readStringUntilCharsInto<'\n'>(value, in); + (*kvs)[key] = value; + } + return res; +} + +JoinOptimizationInfo JoinOptimizationInfo::parse(const String & advance) +{ + JoinOptimizationInfo info; + auto kkvs = convertToKVs(advance); + auto & kvs = kkvs["JoinParameters"]; + tryAssign(kvs, "isBHJ", info.is_broadcast); + tryAssign(kvs, "isSMJ", info.is_smj); + tryAssign(kvs, "buildHashTableId", info.storage_join_key); + tryAssign(kvs, "isNullAwareAntiJoin", info.is_null_aware_anti_join); + tryAssign(kvs, "isExistenceJoin", info.is_existence_join); + return info; +} +} + diff --git a/gluten-core/src/main/scala/org/apache/gluten/execution/SortUtils.scala b/cpp-ch/local-engine/Parser/AdvancedParametersParseUtil.h similarity index 58% rename from gluten-core/src/main/scala/org/apache/gluten/execution/SortUtils.scala rename to cpp-ch/local-engine/Parser/AdvancedParametersParseUtil.h index 2c0ad1b0a59a1..5a15a3ea8abc6 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/execution/SortUtils.scala +++ b/cpp-ch/local-engine/Parser/AdvancedParametersParseUtil.h @@ -14,20 +14,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.apache.gluten.execution +#pragma once +#include -import org.apache.gluten.extension.columnar.rewrite.RewrittenNodeWall +namespace local_engine +{ -import org.apache.spark.sql.execution.{ProjectExec, SortExec, SparkPlan} +std::unordered_map> convertToKVs(const String & advance); -object SortUtils { - def dropPartialSort(plan: SparkPlan): SparkPlan = plan match { - case RewrittenNodeWall(p) => RewrittenNodeWall(dropPartialSort(p)) - case sort: SortExec if !sort.global => sort.child - // from pre/post project-pulling - case ProjectExec(_, SortExec(_, false, ProjectExec(_, p), _)) - if plan.outputSet == p.outputSet => - p - case _ => plan - } + +struct JoinOptimizationInfo +{ + bool is_broadcast = false; + bool is_smj = false; + bool is_null_aware_anti_join = false; + bool is_existence_join = false; + String storage_join_key; + + static JoinOptimizationInfo parse(const String & advance); +}; } + diff --git a/cpp-ch/local-engine/Parser/AggregateFunctionParser.cpp b/cpp-ch/local-engine/Parser/AggregateFunctionParser.cpp index 77814a4276242..f183cc0a46906 100644 --- a/cpp-ch/local-engine/Parser/AggregateFunctionParser.cpp +++ b/cpp-ch/local-engine/Parser/AggregateFunctionParser.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -39,7 +40,6 @@ namespace local_engine DB::ActionsDAG::NodeRawConstPtrs AggregateFunctionParser::parseFunctionArguments( const CommonFunctionInfo & func_info, - const String & /*ch_func_name*/, DB::ActionsDAGPtr & actions_dag) const { DB::ActionsDAG::NodeRawConstPtrs collected_args; @@ -79,8 +79,7 @@ std::pair AggregateFunctionParser::tryApplyCHCombinator( auto get_aggregate_function = [](const String & name, const DB::DataTypes & arg_types) -> DB::AggregateFunctionPtr { DB::AggregateFunctionProperties properties; - auto action = NullsAction::EMPTY; - auto func = DB::AggregateFunctionFactory::instance().get(name, action, arg_types, DB::Array{}, properties); + auto func = RelParser::getAggregateFunction(name, arg_types, properties); if (!func) { throw Exception(DB::ErrorCodes::BAD_ARGUMENTS, "Unknown aggregate function {}", name); diff --git a/cpp-ch/local-engine/Parser/AggregateFunctionParser.h b/cpp-ch/local-engine/Parser/AggregateFunctionParser.h index 464ad099a3b68..215c09626b7e7 100644 --- a/cpp-ch/local-engine/Parser/AggregateFunctionParser.h +++ b/cpp-ch/local-engine/Parser/AggregateFunctionParser.h @@ -97,12 +97,7 @@ class AggregateFunctionParser /// Do some preprojections for the function arguments, and return the necessary arguments for the CH function. virtual DB::ActionsDAG::NodeRawConstPtrs - parseFunctionArguments(const CommonFunctionInfo & func_info, const String & ch_func_name, DB::ActionsDAGPtr & actions_dag) const; - - DB::ActionsDAG::NodeRawConstPtrs parseFunctionArguments(const CommonFunctionInfo & func_info, DB::ActionsDAGPtr & actions_dag) const - { - return parseFunctionArguments(func_info, getCHFunctionName(func_info), actions_dag); - } + parseFunctionArguments(const CommonFunctionInfo & func_info, DB::ActionsDAGPtr & actions_dag) const; // `PartialMerge` is applied on the merging stages. // `If` is applied when the aggreate function has a filter. This should only happen on the 1st stage. diff --git a/cpp-ch/local-engine/Parser/CrossRelParser.cpp b/cpp-ch/local-engine/Parser/CrossRelParser.cpp new file mode 100644 index 0000000000000..4405a57cb5759 --- /dev/null +++ b/cpp-ch/local-engine/Parser/CrossRelParser.cpp @@ -0,0 +1,300 @@ +/* + * 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. + */ +#include "CrossRelParser.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace DB +{ +namespace ErrorCodes +{ + extern const int LOGICAL_ERROR; + extern const int UNKNOWN_TYPE; + extern const int BAD_ARGUMENTS; +} +} + +using namespace DB; + + + + +namespace local_engine +{ + +std::shared_ptr createCrossTableJoin(substrait::CrossRel_JoinType join_type) +{ + auto & global_context = SerializedPlanParser::global_context; + auto table_join = std::make_shared( + global_context->getSettings(), global_context->getGlobalTemporaryVolume(), global_context->getTempDataOnDisk()); + + std::pair kind_and_strictness = JoinUtil::getCrossJoinKindAndStrictness(join_type); + table_join->setKind(kind_and_strictness.first); + table_join->setStrictness(kind_and_strictness.second); + return table_join; +} + +CrossRelParser::CrossRelParser(SerializedPlanParser * plan_paser_) + : RelParser(plan_paser_) + , function_mapping(plan_paser_->function_mapping) + , context(plan_paser_->context) + , extra_plan_holder(plan_paser_->extra_plan_holder) +{ +} + +DB::QueryPlanPtr +CrossRelParser::parse(DB::QueryPlanPtr /*query_plan*/, const substrait::Rel & /*rel*/, std::list & /*rel_stack_*/) +{ + throw Exception(ErrorCodes::LOGICAL_ERROR, "join node has 2 inputs, can't call parse()."); +} + +const substrait::Rel & CrossRelParser::getSingleInput(const substrait::Rel & /*rel*/) +{ + throw Exception(ErrorCodes::LOGICAL_ERROR, "join node has 2 inputs, can't call getSingleInput()."); +} + +DB::QueryPlanPtr CrossRelParser::parseOp(const substrait::Rel & rel, std::list & rel_stack) +{ + const auto & join = rel.cross(); + if (!join.has_left() || !join.has_right()) + { + throw Exception(ErrorCodes::BAD_ARGUMENTS, "left table or right table is missing."); + } + + rel_stack.push_back(&rel); + auto left_plan = getPlanParser()->parseOp(join.left(), rel_stack); + auto right_plan = getPlanParser()->parseOp(join.right(), rel_stack); + rel_stack.pop_back(); + + return parseJoin(join, std::move(left_plan), std::move(right_plan)); +} + +void CrossRelParser::renamePlanColumns(DB::QueryPlan & left, DB::QueryPlan & right, const StorageJoinFromReadBuffer & storage_join) +{ + ActionsDAGPtr project = nullptr; + /// To support mixed join conditions, we must make sure that the column names in the right be the same as + /// storage_join's right sample block. + auto right_ori_header = right.getCurrentDataStream().header.getColumnsWithTypeAndName(); + if (right_ori_header.size() > 0 && right_ori_header[0].name != BlockUtil::VIRTUAL_ROW_COUNT_COLUMN) + { + project = ActionsDAG::makeConvertingActions( + right_ori_header, storage_join.getRightSampleBlock().getColumnsWithTypeAndName(), ActionsDAG::MatchColumnsMode::Position); + if (project) + { + QueryPlanStepPtr project_step = std::make_unique(right.getCurrentDataStream(), project); + project_step->setStepDescription("Rename Broadcast Table Name"); + steps.emplace_back(project_step.get()); + right.addStep(std::move(project_step)); + } + } + + /// If the columns name in right table is duplicated with left table, we need to rename the left table's columns, + /// avoid the columns name in the right table be changed in `addConvertStep`. + /// This could happen in tpc-ds q44. + DB::ColumnsWithTypeAndName new_left_cols; + const auto & right_header = right.getCurrentDataStream().header; + auto left_prefix = getUniqueName("left"); + for (const auto & col : left.getCurrentDataStream().header) + if (right_header.has(col.name)) + new_left_cols.emplace_back(col.column, col.type, left_prefix + col.name); + else + new_left_cols.emplace_back(col.column, col.type, col.name); + auto left_header = left.getCurrentDataStream().header.getColumnsWithTypeAndName(); + project = ActionsDAG::makeConvertingActions(left_header, new_left_cols, ActionsDAG::MatchColumnsMode::Position); + + if (project) + { + QueryPlanStepPtr project_step = std::make_unique(left.getCurrentDataStream(), project); + project_step->setStepDescription("Rename Left Table Name for broadcast join"); + steps.emplace_back(project_step.get()); + left.addStep(std::move(project_step)); + } +} + +DB::QueryPlanPtr CrossRelParser::parseJoin(const substrait::CrossRel & join, DB::QueryPlanPtr left, DB::QueryPlanPtr right) +{ + google::protobuf::StringValue optimization_info; + optimization_info.ParseFromString(join.advanced_extension().optimization().value()); + auto join_opt_info = JoinOptimizationInfo::parse(optimization_info.value()); + const auto & storage_join_key = join_opt_info.storage_join_key; + auto storage_join = BroadCastJoinBuilder::getJoin(storage_join_key) ; + renamePlanColumns(*left, *right, *storage_join); + auto table_join = createCrossTableJoin(join.type()); + DB::Block right_header_before_convert_step = right->getCurrentDataStream().header; + addConvertStep(*table_join, *left, *right); + + // Add a check to find error easily. + if(!blocksHaveEqualStructure(right_header_before_convert_step, right->getCurrentDataStream().header)) + { + throw DB::Exception(DB::ErrorCodes::LOGICAL_ERROR, "For broadcast join, we must not change the columns name in the right table.\nleft header:{},\nright header: {} -> {}", + left->getCurrentDataStream().header.dumpNames(), + right_header_before_convert_step.dumpNames(), + right->getCurrentDataStream().header.dumpNames()); + } + + Names after_join_names; + auto left_names = left->getCurrentDataStream().header.getNames(); + after_join_names.insert(after_join_names.end(), left_names.begin(), left_names.end()); + auto right_name = table_join->columnsFromJoinedTable().getNames(); + after_join_names.insert(after_join_names.end(), right_name.begin(), right_name.end()); + + auto left_header = left->getCurrentDataStream().header; + auto right_header = right->getCurrentDataStream().header; + + QueryPlanPtr query_plan; + table_join->addDisjunct(); + auto broadcast_hash_join = storage_join->getJoinLocked(table_join, context); + // table_join->resetKeys(); + QueryPlanStepPtr join_step = std::make_unique(left->getCurrentDataStream(), broadcast_hash_join, 8192); + + join_step->setStepDescription("STORAGE_JOIN"); + steps.emplace_back(join_step.get()); + left->addStep(std::move(join_step)); + query_plan = std::move(left); + /// hold right plan for profile + extra_plan_holder.emplace_back(std::move(right)); + + addPostFilter(*query_plan, join); + Names cols; + for (auto after_join_name : after_join_names) + { + if (BlockUtil::VIRTUAL_ROW_COUNT_COLUMN == after_join_name) + continue; + + cols.emplace_back(after_join_name); + } + JoinUtil::reorderJoinOutput(*query_plan, cols); + + return query_plan; +} + + +void CrossRelParser::addPostFilter(DB::QueryPlan & query_plan, const substrait::CrossRel & join_rel) +{ + if (!join_rel.has_expression()) + return; + + auto expression = join_rel.expression(); + std::string filter_name; + auto actions_dag = std::make_shared(query_plan.getCurrentDataStream().header.getColumnsWithTypeAndName()); + if (!expression.has_scalar_function()) + { + // It may be singular_or_list + auto * in_node = getPlanParser()->parseExpression(actions_dag, expression); + filter_name = in_node->result_name; + } + else + { + getPlanParser()->parseFunction(query_plan.getCurrentDataStream().header, expression, filter_name, actions_dag, true); + } + auto filter_step = std::make_unique(query_plan.getCurrentDataStream(), actions_dag, filter_name, true); + filter_step->setStepDescription("Post Join Filter"); + steps.emplace_back(filter_step.get()); + query_plan.addStep(std::move(filter_step)); +} + +void CrossRelParser::addConvertStep(TableJoin & table_join, DB::QueryPlan & left, DB::QueryPlan & right) +{ + /// If the columns name in right table is duplicated with left table, we need to rename the right table's columns. + NameSet left_columns_set; + for (const auto & col : left.getCurrentDataStream().header.getNames()) + left_columns_set.emplace(col); + table_join.setColumnsFromJoinedTable( + right.getCurrentDataStream().header.getNamesAndTypesList(), left_columns_set, getUniqueName("right") + "."); + + // fix right table key duplicate + NamesWithAliases right_table_alias; + for (size_t idx = 0; idx < table_join.columnsFromJoinedTable().size(); idx++) + { + auto origin_name = right.getCurrentDataStream().header.getByPosition(idx).name; + auto dedup_name = table_join.columnsFromJoinedTable().getNames().at(idx); + if (origin_name != dedup_name) + { + right_table_alias.emplace_back(NameWithAlias(origin_name, dedup_name)); + } + } + if (!right_table_alias.empty()) + { + ActionsDAGPtr rename_dag = std::make_shared(right.getCurrentDataStream().header.getNamesAndTypesList()); + auto original_right_columns = right.getCurrentDataStream().header; + for (const auto & column_alias : right_table_alias) + { + if (original_right_columns.has(column_alias.first)) + { + auto pos = original_right_columns.getPositionByName(column_alias.first); + const auto & alias = rename_dag->addAlias(*rename_dag->getInputs()[pos], column_alias.second); + rename_dag->getOutputs()[pos] = &alias; + } + } + + QueryPlanStepPtr project_step = std::make_unique(right.getCurrentDataStream(), rename_dag); + project_step->setStepDescription("Right Table Rename"); + steps.emplace_back(project_step.get()); + right.addStep(std::move(project_step)); + } + + for (const auto & column : table_join.columnsFromJoinedTable()) + { + table_join.addJoinedColumn(column); + } + ActionsDAGPtr left_convert_actions = nullptr; + ActionsDAGPtr right_convert_actions = nullptr; + std::tie(left_convert_actions, right_convert_actions) = table_join.createConvertingActions( + left.getCurrentDataStream().header.getColumnsWithTypeAndName(), right.getCurrentDataStream().header.getColumnsWithTypeAndName()); + + if (right_convert_actions) + { + auto converting_step = std::make_unique(right.getCurrentDataStream(), right_convert_actions); + converting_step->setStepDescription("Convert joined columns"); + steps.emplace_back(converting_step.get()); + right.addStep(std::move(converting_step)); + } + + if (left_convert_actions) + { + auto converting_step = std::make_unique(left.getCurrentDataStream(), left_convert_actions); + converting_step->setStepDescription("Convert joined columns"); + steps.emplace_back(converting_step.get()); + left.addStep(std::move(converting_step)); + } +} + + +void registerCrossRelParser(RelParserFactory & factory) +{ + auto builder = [](SerializedPlanParser * plan_paser) { return std::make_shared(plan_paser); }; + factory.registerBuilder(substrait::Rel::RelTypeCase::kCross, builder); +} + +} diff --git a/cpp-ch/local-engine/Parser/CrossRelParser.h b/cpp-ch/local-engine/Parser/CrossRelParser.h new file mode 100644 index 0000000000000..f1cd60385e26a --- /dev/null +++ b/cpp-ch/local-engine/Parser/CrossRelParser.h @@ -0,0 +1,61 @@ +/* + * 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. + */ +#pragma once + +#include +#include +#include + +namespace DB +{ +class TableJoin; +} + +namespace local_engine +{ + +class StorageJoinFromReadBuffer; + + +class CrossRelParser : public RelParser +{ +public: + explicit CrossRelParser(SerializedPlanParser * plan_paser_); + ~CrossRelParser() override = default; + + DB::QueryPlanPtr + parse(DB::QueryPlanPtr query_plan, const substrait::Rel & sort_rel, std::list & rel_stack_) override; + + DB::QueryPlanPtr parseOp(const substrait::Rel & rel, std::list & rel_stack) override; + + const substrait::Rel & getSingleInput(const substrait::Rel & rel) override; + +private: + std::unordered_map & function_mapping; + ContextPtr & context; + std::vector & extra_plan_holder; + + + DB::QueryPlanPtr parseJoin(const substrait::CrossRel & join, DB::QueryPlanPtr left, DB::QueryPlanPtr right); + void renamePlanColumns(DB::QueryPlan & left, DB::QueryPlan & right, const StorageJoinFromReadBuffer & storage_join); + void addConvertStep(TableJoin & table_join, DB::QueryPlan & left, DB::QueryPlan & right); + void addPostFilter(DB::QueryPlan & query_plan, const substrait::CrossRel & join); + bool applyJoinFilter( + DB::TableJoin & table_join, const substrait::CrossRel & join_rel, DB::QueryPlan & left, DB::QueryPlan & right, bool allow_mixed_condition); +}; + +} diff --git a/cpp-ch/local-engine/Parser/FunctionParser.cpp b/cpp-ch/local-engine/Parser/FunctionParser.cpp index e786304b3e6ec..206fb6c50ec97 100644 --- a/cpp-ch/local-engine/Parser/FunctionParser.cpp +++ b/cpp-ch/local-engine/Parser/FunctionParser.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -39,24 +40,18 @@ using namespace DB; String FunctionParser::getCHFunctionName(const substrait::Expression_ScalarFunction & substrait_func) const { - auto func_signature = plan_parser->function_mapping.at(std::to_string(substrait_func.function_reference())); - auto pos = func_signature.find(':'); - auto func_name = func_signature.substr(0, pos); - - auto it = SCALAR_FUNCTIONS.find(func_name); - if (it == SCALAR_FUNCTIONS.end()) - throw Exception(ErrorCodes::UNKNOWN_FUNCTION, "Unsupported substrait function: {}", func_name); - return it->second; + // no meaning + /// There is no any simple equivalent ch function. + return ""; } ActionsDAG::NodeRawConstPtrs FunctionParser::parseFunctionArguments( - const substrait::Expression_ScalarFunction & substrait_func, const String & ch_func_name, ActionsDAGPtr & actions_dag) const + const substrait::Expression_ScalarFunction & substrait_func, ActionsDAGPtr & actions_dag) const { ActionsDAG::NodeRawConstPtrs parsed_args; const auto & args = substrait_func.arguments(); parsed_args.reserve(args.size()); - for (const auto & arg : args) - plan_parser->parseFunctionArgument(actions_dag, parsed_args, ch_func_name, arg); + plan_parser->parseFunctionArguments(actions_dag, parsed_args, substrait_func); return parsed_args; } @@ -66,7 +61,7 @@ const ActionsDAG::Node * FunctionParser::parse(const substrait::Expression_ScalarFunction & substrait_func, ActionsDAGPtr & actions_dag) const { auto ch_func_name = getCHFunctionName(substrait_func); - auto parsed_args = parseFunctionArguments(substrait_func, ch_func_name, actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); const auto * func_node = toFunctionNode(actions_dag, ch_func_name, parsed_args); return convertNodeTypeIfNeeded(substrait_func, func_node, actions_dag); } @@ -76,13 +71,30 @@ const ActionsDAG::Node * FunctionParser::convertNodeTypeIfNeeded( { const auto & output_type = substrait_func.output_type(); if (!TypeParser::isTypeMatched(output_type, func_node->result_type)) - return ActionsDAGUtil::convertNodeType( - actions_dag, - func_node, - // as stated in isTypeMatched, currently we don't change nullability of the result type - func_node->result_type->isNullable() ? local_engine::wrapNullableType(true, TypeParser::parseType(output_type))->getName() - : DB::removeNullable(TypeParser::parseType(output_type))->getName(), - func_node->result_name); + { + auto result_type = TypeParser::parseType(substrait_func.output_type()); + if (DB::isDecimalOrNullableDecimal(result_type)) + { + return ActionsDAGUtil::convertNodeType( + actions_dag, + func_node, + // as stated in isTypeMatched, currently we don't change nullability of the result type + func_node->result_type->isNullable() ? local_engine::wrapNullableType(true, result_type)->getName() + : local_engine::removeNullable(result_type)->getName(), + func_node->result_name, + CastType::accurateOrNull); + } + else + { + return ActionsDAGUtil::convertNodeType( + actions_dag, + func_node, + // as stated in isTypeMatched, currently we don't change nullability of the result type + func_node->result_type->isNullable() ? local_engine::wrapNullableType(true, TypeParser::parseType(output_type))->getName() + : DB::removeNullable(TypeParser::parseType(output_type))->getName(), + func_node->result_name); + } + } else return func_node; } diff --git a/cpp-ch/local-engine/Parser/FunctionParser.h b/cpp-ch/local-engine/Parser/FunctionParser.h index 36cf9f5ce5d5d..6ac162a953c63 100644 --- a/cpp-ch/local-engine/Parser/FunctionParser.h +++ b/cpp-ch/local-engine/Parser/FunctionParser.h @@ -51,10 +51,16 @@ class FunctionParser virtual String getCHFunctionName(const substrait::Expression_ScalarFunction & substrait_func) const; protected: - + /// Deprecated method + virtual DB::ActionsDAG::NodeRawConstPtrs parseFunctionArguments( + const substrait::Expression_ScalarFunction & substrait_func, + const String & /*function_name*/, + DB::ActionsDAGPtr & actions_dag) const + { + return parseFunctionArguments(substrait_func, actions_dag); + } virtual DB::ActionsDAG::NodeRawConstPtrs parseFunctionArguments( const substrait::Expression_ScalarFunction & substrait_func, - const String & ch_func_name, DB::ActionsDAGPtr & actions_dag) const; virtual const DB::ActionsDAG::Node * convertNodeTypeIfNeeded( @@ -84,6 +90,11 @@ class FunctionParser return &action_dag->addFunction(function_builder, args, result_name); } + const ActionsDAG::Node * + parseFunctionWithDAG(const substrait::Expression & rel, std::string & result_name, DB::ActionsDAGPtr actions_dag, bool keep_result = false) const + { + return plan_parser->parseFunctionWithDAG(rel, result_name, actions_dag, keep_result); + } const DB::ActionsDAG::Node * parseExpression(DB::ActionsDAGPtr actions_dag, const substrait::Expression & rel) const { return plan_parser->parseExpression(actions_dag, rel); @@ -91,7 +102,7 @@ class FunctionParser std::pair parseLiteral(const substrait::Expression_Literal & literal) const { return plan_parser->parseLiteral(literal); } - SerializedPlanParser * plan_parser; + mutable SerializedPlanParser * plan_parser; }; using FunctionParserPtr = std::shared_ptr; diff --git a/cpp-ch/local-engine/Parser/JoinRelParser.cpp b/cpp-ch/local-engine/Parser/JoinRelParser.cpp index 9a3cc91baaa99..1141f479642af 100644 --- a/cpp-ch/local-engine/Parser/JoinRelParser.cpp +++ b/cpp-ch/local-engine/Parser/JoinRelParser.cpp @@ -15,21 +15,24 @@ * limitations under the License. */ #include "JoinRelParser.h" + #include #include #include #include #include -#include +#include #include #include #include #include +#include #include #include #include #include #include +#include #include #include @@ -44,105 +47,17 @@ namespace ErrorCodes extern const int BAD_ARGUMENTS; } } - -struct JoinOptimizationInfo -{ - bool is_broadcast = false; - bool is_smj = false; - bool is_null_aware_anti_join = false; - bool is_existence_join = false; - std::string storage_join_key; -}; - using namespace DB; -JoinOptimizationInfo parseJoinOptimizationInfo(const substrait::JoinRel & join) -{ - google::protobuf::StringValue optimization; - optimization.ParseFromString(join.advanced_extension().optimization().value()); - JoinOptimizationInfo info; - if (optimization.value().contains("isBHJ=")) - { - ReadBufferFromString in(optimization.value()); - assertString("JoinParameters:", in); - assertString("isBHJ=", in); - readBoolText(info.is_broadcast, in); - assertChar('\n', in); - if (info.is_broadcast) - { - assertString("isNullAwareAntiJoin=", in); - readBoolText(info.is_null_aware_anti_join, in); - assertChar('\n', in); - assertString("buildHashTableId=", in); - readString(info.storage_join_key, in); - assertChar('\n', in); - } - } - else - { - ReadBufferFromString in(optimization.value()); - assertString("JoinParameters:", in); - assertString("isSMJ=", in); - readBoolText(info.is_smj, in); - assertChar('\n', in); - if (info.is_smj) - { - assertString("isNullAwareAntiJoin=", in); - readBoolText(info.is_null_aware_anti_join, in); - assertChar('\n', in); - assertString("isExistenceJoin=", in); - readBoolText(info.is_existence_join, in); - assertChar('\n', in); - } - } - return info; -} - - -void reorderJoinOutput(DB::QueryPlan & plan, DB::Names cols) -{ - ActionsDAGPtr project = std::make_shared(plan.getCurrentDataStream().header.getNamesAndTypesList()); - NamesWithAliases project_cols; - for (const auto & col : cols) - { - project_cols.emplace_back(NameWithAlias(col, col)); - } - project->project(project_cols); - QueryPlanStepPtr project_step = std::make_unique(plan.getCurrentDataStream(), project); - project_step->setStepDescription("Reorder Join Output"); - plan.addStep(std::move(project_step)); -} - namespace local_engine { - -std::pair getJoinKindAndStrictness(substrait::JoinRel_JoinType join_type) -{ - switch (join_type) - { - case substrait::JoinRel_JoinType_JOIN_TYPE_INNER: - return {DB::JoinKind::Inner, DB::JoinStrictness::All}; - case substrait::JoinRel_JoinType_JOIN_TYPE_LEFT_SEMI: - return {DB::JoinKind::Left, DB::JoinStrictness::Semi}; - case substrait::JoinRel_JoinType_JOIN_TYPE_ANTI: - return {DB::JoinKind::Left, DB::JoinStrictness::Anti}; - case substrait::JoinRel_JoinType_JOIN_TYPE_LEFT: - return {DB::JoinKind::Left, DB::JoinStrictness::All}; - case substrait::JoinRel_JoinType_JOIN_TYPE_RIGHT: - return {DB::JoinKind::Right, DB::JoinStrictness::All}; - case substrait::JoinRel_JoinType_JOIN_TYPE_OUTER: - return {DB::JoinKind::Full, DB::JoinStrictness::All}; - default: - throw Exception(ErrorCodes::UNKNOWN_TYPE, "unsupported join type {}.", magic_enum::enum_name(join_type)); - } -} std::shared_ptr createDefaultTableJoin(substrait::JoinRel_JoinType join_type) { auto & global_context = SerializedPlanParser::global_context; auto table_join = std::make_shared( global_context->getSettings(), global_context->getGlobalTemporaryVolume(), global_context->getTempDataOnDisk()); - std::pair kind_and_strictness = getJoinKindAndStrictness(join_type); + std::pair kind_and_strictness = JoinUtil::getJoinKindAndStrictness(join_type); table_join->setKind(kind_and_strictness.first); table_join->setStrictness(kind_and_strictness.second); return table_join; @@ -295,7 +210,9 @@ void JoinRelParser::renamePlanColumns(DB::QueryPlan & left, DB::QueryPlan & righ DB::QueryPlanPtr JoinRelParser::parseJoin(const substrait::JoinRel & join, DB::QueryPlanPtr left, DB::QueryPlanPtr right) { - auto join_opt_info = parseJoinOptimizationInfo(join); + google::protobuf::StringValue optimization_info; + optimization_info.ParseFromString(join.advanced_extension().optimization().value()); + auto join_opt_info = JoinOptimizationInfo::parse(optimization_info.value()); auto storage_join = join_opt_info.is_broadcast ? BroadCastJoinBuilder::getJoin(join_opt_info.storage_join_key) : nullptr; if (storage_join) { @@ -436,7 +353,7 @@ DB::QueryPlanPtr JoinRelParser::parseJoin(const substrait::JoinRel & join, DB::Q query_plan = std::make_unique(); query_plan->unitePlans(std::move(join_step), {std::move(plans)}); } - reorderJoinOutput(*query_plan, after_join_names); + JoinUtil::reorderJoinOutput(*query_plan, after_join_names); return query_plan; } diff --git a/cpp-ch/local-engine/Parser/JoinRelParser.h b/cpp-ch/local-engine/Parser/JoinRelParser.h index c423f43908e70..e6d31e6d31d6e 100644 --- a/cpp-ch/local-engine/Parser/JoinRelParser.h +++ b/cpp-ch/local-engine/Parser/JoinRelParser.h @@ -18,6 +18,7 @@ #include #include +#include #include #include @@ -31,8 +32,6 @@ namespace local_engine class StorageJoinFromReadBuffer; -std::pair getJoinKindAndStrictness(substrait::JoinRel_JoinType join_type); - class JoinRelParser : public RelParser { public: diff --git a/cpp-ch/local-engine/Parser/MergeTreeRelParser.cpp b/cpp-ch/local-engine/Parser/MergeTreeRelParser.cpp index b51b76b974152..7d906a837441e 100644 --- a/cpp-ch/local-engine/Parser/MergeTreeRelParser.cpp +++ b/cpp-ch/local-engine/Parser/MergeTreeRelParser.cpp @@ -383,13 +383,7 @@ void MergeTreeRelParser::collectColumns(const substrait::Expression & rel, NameS String MergeTreeRelParser::getCHFunctionName(const substrait::Expression_ScalarFunction & substrait_func) { auto func_signature = getPlanParser()->function_mapping.at(std::to_string(substrait_func.function_reference())); - auto pos = func_signature.find(':'); - auto func_name = func_signature.substr(0, pos); - - auto it = SCALAR_FUNCTIONS.find(func_name); - if (it == SCALAR_FUNCTIONS.end()) - throw Exception(ErrorCodes::UNKNOWN_FUNCTION, "Unsupported substrait function on mergetree prewhere parser: {}", func_name); - return it->second; + return getPlanParser()->getFunctionName(func_signature, substrait_func); } diff --git a/cpp-ch/local-engine/Parser/ProjectRelParser.cpp b/cpp-ch/local-engine/Parser/ProjectRelParser.cpp index eb190101f170c..2f75ac396dfe3 100644 --- a/cpp-ch/local-engine/Parser/ProjectRelParser.cpp +++ b/cpp-ch/local-engine/Parser/ProjectRelParser.cpp @@ -21,6 +21,9 @@ #include #include #include +#include + +using namespace DB; namespace local_engine { @@ -109,15 +112,46 @@ ProjectRelParser::SplittedActionsDAGs ProjectRelParser::splitActionsDAGInGenerat return res; } +bool ProjectRelParser::isReplicateRows(substrait::GenerateRel rel) +{ + return plan_parser->isFunction(rel.generator().scalar_function(), "replicaterows"); +} + +DB::QueryPlanPtr ProjectRelParser::parseReplicateRows(DB::QueryPlanPtr query_plan, substrait::GenerateRel generate_rel) +{ + std::vector expressions; + for (int i = 0; i < generate_rel.generator().scalar_function().arguments_size(); ++i) + { + expressions.emplace_back(generate_rel.generator().scalar_function().arguments(i).value()); + } + auto header = query_plan->getCurrentDataStream().header; + auto actions_dag = expressionsToActionsDAG(expressions, header); + auto before_replicate_rows = std::make_unique(query_plan->getCurrentDataStream(), actions_dag); + before_replicate_rows->setStepDescription("Before ReplicateRows"); + steps.emplace_back(before_replicate_rows.get()); + query_plan->addStep(std::move(before_replicate_rows)); + + auto replicate_rows_step = std::make_unique(query_plan->getCurrentDataStream()); + replicate_rows_step->setStepDescription("ReplicateRows"); + steps.emplace_back(replicate_rows_step.get()); + query_plan->addStep(std::move(replicate_rows_step)); + return query_plan; +} + DB::QueryPlanPtr ProjectRelParser::parseGenerate(DB::QueryPlanPtr query_plan, const substrait::Rel & rel, std::list & /*rel_stack_*/) { const auto & generate_rel = rel.generate(); + if (isReplicateRows(generate_rel)) + { + return parseReplicateRows(std::move(query_plan), generate_rel); + } std::vector expressions; for (int i = 0; i < generate_rel.child_output_size(); ++i) { expressions.emplace_back(generate_rel.child_output(i)); } + expressions.emplace_back(generate_rel.generator()); auto header = query_plan->getCurrentDataStream().header; auto actions_dag = expressionsToActionsDAG(expressions, header); diff --git a/cpp-ch/local-engine/Parser/ProjectRelParser.h b/cpp-ch/local-engine/Parser/ProjectRelParser.h index ae56939144758..48a16d774d887 100644 --- a/cpp-ch/local-engine/Parser/ProjectRelParser.h +++ b/cpp-ch/local-engine/Parser/ProjectRelParser.h @@ -19,7 +19,6 @@ #include #include #include -#include namespace local_engine { @@ -50,6 +49,9 @@ class ProjectRelParser : public RelParser /// Split actions_dag of generate rel into 3 parts: before array join + during array join + after array join static SplittedActionsDAGs splitActionsDAGInGenerate(ActionsDAGPtr actions_dag); + bool isReplicateRows(substrait::GenerateRel rel); + + DB::QueryPlanPtr parseReplicateRows(QueryPlanPtr query_plan, substrait::GenerateRel generate_rel); const substrait::Rel & getSingleInput(const substrait::Rel & rel) override { diff --git a/cpp-ch/local-engine/Parser/RelMetric.cpp b/cpp-ch/local-engine/Parser/RelMetric.cpp index eec31213a69ef..7b8b4cfd95a85 100644 --- a/cpp-ch/local-engine/Parser/RelMetric.cpp +++ b/cpp-ch/local-engine/Parser/RelMetric.cpp @@ -61,9 +61,9 @@ RelMetricTimes RelMetric::getTotalTime() const { for (const auto & processor : step->getProcessors()) { - timeMetrics.time += processor->getElapsedUs(); - timeMetrics.input_wait_elapsed_us += processor->getInputWaitElapsedUs(); - timeMetrics.output_wait_elapsed_us += processor->getOutputWaitElapsedUs(); + timeMetrics.time += processor->getElapsedNs() / 1000U ; + timeMetrics.input_wait_elapsed_us += processor->getInputWaitElapsedNs() / 1000U; + timeMetrics.output_wait_elapsed_us += processor->getInputWaitElapsedNs() / 1000U; } } } @@ -104,7 +104,7 @@ void RelMetric::serialize(Writer & writer, bool) const writer.Key("name"); writer.String(processor->getName().c_str()); writer.Key("time"); - writer.Uint64(processor->getElapsedUs()); + writer.Uint64(processor->getElapsedNs() / 1000U); writer.Key("output_rows"); writer.Uint64(processor->getProcessorDataStats().output_rows); writer.Key("output_bytes"); @@ -142,7 +142,7 @@ const String & RelMetric::getName() const return name; } -std::string RelMetricSerializer::serializeRelMetric(RelMetricPtr rel_metric, bool flatten) +std::string RelMetricSerializer::serializeRelMetric(const RelMetricPtr & rel_metric, bool flatten) { StringBuffer result; Writer writer(result); diff --git a/cpp-ch/local-engine/Parser/RelMetric.h b/cpp-ch/local-engine/Parser/RelMetric.h index 8255654a8dde5..8706bed2ff022 100644 --- a/cpp-ch/local-engine/Parser/RelMetric.h +++ b/cpp-ch/local-engine/Parser/RelMetric.h @@ -58,6 +58,6 @@ class RelMetric class RelMetricSerializer { public: - static std::string serializeRelMetric(RelMetricPtr rel_metric, bool flatten = true); + static std::string serializeRelMetric(const RelMetricPtr & rel_metric, bool flatten = true); }; } diff --git a/cpp-ch/local-engine/Parser/RelParser.cpp b/cpp-ch/local-engine/Parser/RelParser.cpp index 282339c4d641f..f651146a391d3 100644 --- a/cpp-ch/local-engine/Parser/RelParser.cpp +++ b/cpp-ch/local-engine/Parser/RelParser.cpp @@ -156,6 +156,7 @@ void registerAggregateParser(RelParserFactory & factory); void registerProjectRelParser(RelParserFactory & factory); void registerJoinRelParser(RelParserFactory & factory); void registerFilterRelParser(RelParserFactory & factory); +void registerCrossRelParser(RelParserFactory & factory); void registerRelParsers() { @@ -166,6 +167,7 @@ void registerRelParsers() registerAggregateParser(factory); registerProjectRelParser(factory); registerJoinRelParser(factory); + registerCrossRelParser(factory); registerFilterRelParser(factory); } } diff --git a/cpp-ch/local-engine/Parser/RelParser.h b/cpp-ch/local-engine/Parser/RelParser.h index 6ca8af5359551..0228c2867a269 100644 --- a/cpp-ch/local-engine/Parser/RelParser.h +++ b/cpp-ch/local-engine/Parser/RelParser.h @@ -85,7 +85,6 @@ class RelParser static std::map parseFormattedRelAdvancedOptimization(const substrait::extensions::AdvancedExtension &advanced_extension); static std::string getStringConfig(const std::map & configs, const std::string & key, const std::string & default_value = ""); -private: SerializedPlanParser * plan_parser; }; diff --git a/cpp-ch/local-engine/Parser/SerializedPlanParser.cpp b/cpp-ch/local-engine/Parser/SerializedPlanParser.cpp index 77819fd73e75d..50431abd9fdba 100644 --- a/cpp-ch/local-engine/Parser/SerializedPlanParser.cpp +++ b/cpp-ch/local-engine/Parser/SerializedPlanParser.cpp @@ -528,6 +528,7 @@ QueryPlanPtr SerializedPlanParser::parseOp(const substrait::Rel & rel, std::list case substrait::Rel::RelTypeCase::kSort: case substrait::Rel::RelTypeCase::kWindow: case substrait::Rel::RelTypeCase::kJoin: + case substrait::Rel::RelTypeCase::kCross: case substrait::Rel::RelTypeCase::kExpand: { auto op_parser = RelParserFactory::instance().getBuilder(rel.rel_type_case())(this); query_plan = op_parser->parseOp(rel, rel_stack); @@ -564,101 +565,26 @@ NamesAndTypesList SerializedPlanParser::blockToNameAndTypeList(const Block & hea return types; } +std::optional SerializedPlanParser::getFunctionSignatureName(UInt32 function_ref) const +{ + auto it = function_mapping.find(std::to_string(function_ref)); + if (it == function_mapping.end()) + return {}; + auto function_signature = it->second; + auto pos = function_signature.find(':'); + return function_signature.substr(0, pos); +} + std::string SerializedPlanParser::getFunctionName(const std::string & function_signature, const substrait::Expression_ScalarFunction & function) { auto args = function.arguments(); auto pos = function_signature.find(':'); auto function_name = function_signature.substr(0, pos); - if (!SCALAR_FUNCTIONS.contains(function_name)) - throw Exception(ErrorCodes::UNKNOWN_FUNCTION, "Unsupported function {}", function_name); - - std::string ch_function_name; - if (function_name == "trim") - ch_function_name = args.size() == 1 ? "trimBoth" : "trimBothSpark"; - else if (function_name == "ltrim") - ch_function_name = args.size() == 1 ? "trimLeft" : "trimLeftSpark"; - else if (function_name == "rtrim") - ch_function_name = args.size() == 1 ? "trimRight" : "trimRightSpark"; - else if (function_name == "extract") - { - if (args.size() != 2) - throw Exception( - ErrorCodes::BAD_ARGUMENTS, "Spark function extract requires two args, function:{}", function.ShortDebugString()); - - // Get the first arg: field - const auto & extract_field = args.at(0); - - if (extract_field.value().has_literal()) - { - const auto & field_value = extract_field.value().literal().string(); - if (field_value == "YEAR") - ch_function_name = "toYear"; // spark: extract(YEAR FROM) or year - else if (field_value == "YEAR_OF_WEEK") - ch_function_name = "toISOYear"; // spark: extract(YEAROFWEEK FROM) - else if (field_value == "QUARTER") - ch_function_name = "toQuarter"; // spark: extract(QUARTER FROM) or quarter - else if (field_value == "MONTH") - ch_function_name = "toMonth"; // spark: extract(MONTH FROM) or month - else if (field_value == "WEEK_OF_YEAR") - ch_function_name = "toISOWeek"; // spark: extract(WEEK FROM) or weekofyear - else if (field_value == "WEEK_DAY") - /// Spark WeekDay(date) (0 = Monday, 1 = Tuesday, ..., 6 = Sunday) - /// Substrait: extract(WEEK_DAY from date) - /// CH: toDayOfWeek(date, 1) - ch_function_name = "toDayOfWeek"; - else if (field_value == "DAY_OF_WEEK") - /// Spark: DayOfWeek(date) (1 = Sunday, 2 = Monday, ..., 7 = Saturday) - /// Substrait: extract(DAY_OF_WEEK from date) - /// CH: toDayOfWeek(date, 3) - /// DAYOFWEEK is alias of function toDayOfWeek. - /// This trick is to distinguish between extract fields DAY_OF_WEEK and WEEK_DAY in latter codes - ch_function_name = "DAYOFWEEK"; - else if (field_value == "DAY") - ch_function_name = "toDayOfMonth"; // spark: extract(DAY FROM) or dayofmonth - else if (field_value == "DAY_OF_YEAR") - ch_function_name = "toDayOfYear"; // spark: extract(DOY FROM) or dayofyear - else if (field_value == "HOUR") - ch_function_name = "toHour"; // spark: extract(HOUR FROM) or hour - else if (field_value == "MINUTE") - ch_function_name = "toMinute"; // spark: extract(MINUTE FROM) or minute - else if (field_value == "SECOND") - ch_function_name = "toSecond"; // spark: extract(SECOND FROM) or secondwithfraction - else - throw Exception(ErrorCodes::BAD_ARGUMENTS, "The first arg of spark extract function is wrong."); - } - else - throw Exception(ErrorCodes::BAD_ARGUMENTS, "The first arg of spark extract function is wrong."); - } - else if (function_name == "check_overflow") - { - if (args.size() < 2) - throw Exception(ErrorCodes::BAD_ARGUMENTS, "check_overflow function requires at least two args."); - ch_function_name = SCALAR_FUNCTIONS.at(function_name); - auto null_on_overflow = args.at(1).value().literal().boolean(); - if (null_on_overflow) - ch_function_name = ch_function_name + "OrNull"; - } - else if (function_name == "make_decimal") - { - if (args.size() < 2) - throw Exception(ErrorCodes::BAD_ARGUMENTS, "make_decimal function requires at least 2 args."); - ch_function_name = SCALAR_FUNCTIONS.at(function_name); - auto null_on_overflow = args.at(1).value().literal().boolean(); - if (null_on_overflow) - ch_function_name = ch_function_name + "OrNull"; - } - else if (function_name == "reverse") - { - if (function.output_type().has_list()) - ch_function_name = "arrayReverse"; - else - ch_function_name = "reverseUTF8"; - } - else - ch_function_name = SCALAR_FUNCTIONS.at(function_name); - - return ch_function_name; + auto function_parser = FunctionParserFactory::instance().tryGet(function_name, this); + if (!function_parser) + throw DB::Exception(DB::ErrorCodes::UNKNOWN_FUNCTION, "Unsupported function: {}", function_name); + return function_parser->getCHFunctionName(function); } void SerializedPlanParser::parseArrayJoinArguments( @@ -680,8 +606,7 @@ void SerializedPlanParser::parseArrayJoinArguments( throw Exception( ErrorCodes::BAD_ARGUMENTS, "Argument number of arrayJoin should be 1 instead of {}", scalar_function.arguments_size()); - auto function_name_copy = function_name; - parseFunctionArguments(actions_dag, parsed_args, function_name_copy, scalar_function); + parseFunctionArguments(actions_dag, parsed_args, scalar_function); auto arg = parsed_args[0]; auto arg_type = removeNullable(arg->result_type); @@ -725,7 +650,7 @@ ActionsDAG::NodeRawConstPtrs SerializedPlanParser::parseArrayJoinWithDAG( const auto & scalar_function = rel.scalar_function(); auto function_signature = function_mapping.at(std::to_string(rel.scalar_function().function_reference())); - auto function_name = getFunctionName(function_signature, scalar_function); + String function_name = "arrayJoin"; /// Whether the input argument of explode/posexplode is map type bool is_map; @@ -846,290 +771,29 @@ const ActionsDAG::Node * SerializedPlanParser::parseFunctionWithDAG( auto pos = function_signature.find(':'); auto func_name = function_signature.substr(0, pos); - if (auto func_parser = FunctionParserFactory::instance().tryGet(func_name, this)) - { - LOG_DEBUG( - &Poco::Logger::get("SerializedPlanParser"), "parse function {} by function parser: {}", func_name, func_parser->getName()); - const auto * result_node = func_parser->parse(scalar_function, actions_dag); - if (keep_result) - actions_dag->addOrReplaceInOutputs(*result_node); - - result_name = result_node->result_name; - return result_node; - } - - auto ch_func_name = getFunctionName(function_signature, scalar_function); - ActionsDAG::NodeRawConstPtrs args; - parseFunctionArguments(actions_dag, args, ch_func_name, scalar_function); - - /// If the first argument of function formatDateTimeInJodaSyntax is integer, replace formatDateTimeInJodaSyntax with fromUnixTimestampInJodaSyntax - /// to avoid exception - if (ch_func_name == "formatDateTimeInJodaSyntax") - { - if (args.size() > 1 && isInteger(removeNullable(args[0]->result_type))) - ch_func_name = "fromUnixTimestampInJodaSyntax"; - } - - if (ch_func_name == "alias") - { - result_name = args[0]->result_name; - actions_dag->addOrReplaceInOutputs(*args[0]); - return &actions_dag->addAlias(actions_dag->findInOutputs(result_name), result_name); - } - - if (ch_func_name == "toYear") - { - const ActionsDAG::Node * arg_node = args[0]; - const String & arg_func_name = arg_node->function ? arg_node->function->getName() : ""; - if ((arg_func_name == "sparkToDate" || arg_func_name == "sparkToDateTime") && arg_node->children.size() > 0) - { - const ActionsDAG::Node * child_node = arg_node->children[0]; - if (child_node && isString(removeNullable(child_node->result_type))) - { - auto extract_year_builder = FunctionFactory::instance().get("sparkExtractYear", context); - auto func_result_name = "sparkExtractYear(" + child_node->result_name + ")"; - return &actions_dag->addFunction(extract_year_builder, {child_node}, func_result_name); - } - } - } - - const ActionsDAG::Node * result_node; - - if (ch_func_name == "splitByRegexp") - { - if (args.size() >= 2) - { - /// In Spark: split(str, regex [, limit] ) - /// In CH: splitByRegexp(regexp, str [, limit]) - std::swap(args[0], args[1]); - } - } - - /// TODO: FunctionParser for check_overflow and make_decimal - if (function_signature.find("check_overflow:", 0) != String::npos) - { - if (scalar_function.arguments().size() < 2) - throw Exception(ErrorCodes::BAD_ARGUMENTS, "check_overflow function requires at least two args."); - - ActionsDAG::NodeRawConstPtrs new_args; - new_args.reserve(3); - new_args.emplace_back(args[0]); - - UInt32 precision = rel.scalar_function().output_type().decimal().precision(); - UInt32 scale = rel.scalar_function().output_type().decimal().scale(); - auto uint32_type = std::make_shared(); - new_args.emplace_back(&actions_dag->addColumn( - ColumnWithTypeAndName(uint32_type->createColumnConst(1, precision), uint32_type, getUniqueName(toString(precision))))); - new_args.emplace_back(&actions_dag->addColumn( - ColumnWithTypeAndName(uint32_type->createColumnConst(1, scale), uint32_type, getUniqueName(toString(scale))))); - args = std::move(new_args); - } - else if (startsWith(function_signature, "make_decimal:")) - { - if (scalar_function.arguments().size() < 2) - throw Exception(ErrorCodes::BAD_ARGUMENTS, "make_decimal function requires at least 2 args."); - - ActionsDAG::NodeRawConstPtrs new_args; - new_args.reserve(3); - new_args.emplace_back(args[0]); - - UInt32 precision = rel.scalar_function().output_type().decimal().precision(); - UInt32 scale = rel.scalar_function().output_type().decimal().scale(); - auto uint32_type = std::make_shared(); - new_args.emplace_back(&actions_dag->addColumn( - ColumnWithTypeAndName(uint32_type->createColumnConst(1, precision), uint32_type, getUniqueName(toString(precision))))); - new_args.emplace_back(&actions_dag->addColumn( - ColumnWithTypeAndName(uint32_type->createColumnConst(1, scale), uint32_type, getUniqueName(toString(scale))))); - args = std::move(new_args); - } - - auto function_builder = FunctionFactory::instance().get(ch_func_name, context); - std::string args_name = join(args, ','); - result_name = ch_func_name + "(" + args_name + ")"; - const auto * function_node = &actions_dag->addFunction(function_builder, args, result_name); - result_node = function_node; - if (!TypeParser::isTypeMatched(rel.scalar_function().output_type(), function_node->result_type)) - { - auto result_type = TypeParser::parseType(rel.scalar_function().output_type()); - if (isDecimalOrNullableDecimal(result_type)) - { - result_node = ActionsDAGUtil::convertNodeType( - actions_dag, - function_node, - // as stated in isTypeMatched, currently we don't change nullability of the result type - function_node->result_type->isNullable() ? local_engine::wrapNullableType(true, result_type)->getName() - : local_engine::removeNullable(result_type)->getName(), - function_node->result_name, - CastType::accurateOrNull); - } - else - { - result_node = ActionsDAGUtil::convertNodeType( - actions_dag, - function_node, - // as stated in isTypeMatched, currently we don't change nullability of the result type - function_node->result_type->isNullable() ? local_engine::wrapNullableType(true, result_type)->getName() - : local_engine::removeNullable(result_type)->getName(), - function_node->result_name); - } - } - + auto func_parser = FunctionParserFactory::instance().tryGet(func_name, this); + if (!func_parser) + throw DB::Exception(DB::ErrorCodes::LOGICAL_ERROR, "Not found function parser for {}", func_name); + LOG_DEBUG(&Poco::Logger::get("SerializedPlanParser"), "parse function {} by function parser: {}", func_name, func_parser->getName()); + const auto * result_node = func_parser->parse(scalar_function, actions_dag); if (keep_result) actions_dag->addOrReplaceInOutputs(*result_node); + result_name = result_node->result_name; return result_node; } void SerializedPlanParser::parseFunctionArguments( ActionsDAGPtr & actions_dag, ActionsDAG::NodeRawConstPtrs & parsed_args, - std::string & function_name, const substrait::Expression_ScalarFunction & scalar_function) { auto function_signature = function_mapping.at(std::to_string(scalar_function.function_reference())); const auto & args = scalar_function.arguments(); parsed_args.reserve(args.size()); + for (const auto & arg : args) + parsed_args.emplace_back(parseExpression(actions_dag, arg.value())); - // Some functions need to be handled specially. - if (function_name == "JSONExtract") - { - parseFunctionArgument(actions_dag, parsed_args, function_name, args[0]); - auto data_type = TypeParser::parseType(scalar_function.output_type()); - parsed_args.emplace_back(addColumn(actions_dag, std::make_shared(), data_type->getName())); - } - else if (function_name == "sparkTupleElement" || function_name == "tupleElement") - { - parseFunctionArgument(actions_dag, parsed_args, function_name, args[0]); - - if (!args[1].value().has_literal()) - throw Exception(ErrorCodes::BAD_ARGUMENTS, "get_struct_field's second argument must be a literal"); - - auto [data_type, field] = parseLiteral(args[1].value().literal()); - if (data_type->getTypeId() != TypeIndex::Int32) - throw Exception(ErrorCodes::BAD_ARGUMENTS, "get_struct_field's second argument must be i32"); - - // tuple indecies start from 1, in spark, start from 0 - Int32 field_index = static_cast(field.get() + 1); - const auto * index_node = addColumn(actions_dag, std::make_shared(), field_index); - parsed_args.emplace_back(index_node); - } - else if (function_name == "tuple") - { - // Arguments in the format, (, [, , ...]) - // We don't need to care the field names here. - for (int index = 1; index < args.size(); index += 2) - parseFunctionArgument(actions_dag, parsed_args, function_name, args[index]); - } - else if (function_name == "repeat") - { - // repeat. the field index must be unsigned integer in CH, cast the signed integer in substrait - // which must be a positive value into unsigned integer here. - parseFunctionArgument(actions_dag, parsed_args, function_name, args[0]); - const ActionsDAG::Node * repeat_times_node = parseFunctionArgument(actions_dag, function_name, args[1]); - DataTypeNullable target_type(std::make_shared()); - repeat_times_node = ActionsDAGUtil::convertNodeType(actions_dag, repeat_times_node, target_type.getName()); - parsed_args.emplace_back(repeat_times_node); - } - else if (function_name == "isNaN") - { - // the result of isNaN(NULL) is NULL in CH, but false in Spark - const ActionsDAG::Node * arg_node = nullptr; - if (args[0].value().has_cast()) - { - arg_node = parseExpression(actions_dag, args[0].value().cast().input()); - const auto * res_type = arg_node->result_type.get(); - if (res_type->isNullable()) - { - res_type = typeid_cast(res_type)->getNestedType().get(); - } - if (isString(*res_type)) - { - ActionsDAG::NodeRawConstPtrs cast_func_args = {arg_node}; - arg_node = toFunctionNode(actions_dag, "toFloat64OrZero", cast_func_args); - } - else - { - arg_node = parseFunctionArgument(actions_dag, function_name, args[0]); - } - } - else - { - arg_node = parseFunctionArgument(actions_dag, function_name, args[0]); - } - - ActionsDAG::NodeRawConstPtrs ifnull_func_args = {arg_node, addColumn(actions_dag, std::make_shared(), 0)}; - parsed_args.emplace_back(toFunctionNode(actions_dag, "IfNull", ifnull_func_args)); - } - else if (function_name == "space") - { - // convert space function to repeat - const ActionsDAG::Node * repeat_times_node = parseFunctionArgument(actions_dag, "repeat", args[0]); - const ActionsDAG::Node * space_str_node = addColumn(actions_dag, std::make_shared(), " "); - function_name = "repeat"; - parsed_args.emplace_back(space_str_node); - parsed_args.emplace_back(repeat_times_node); - } - else if (function_name == "trimBothSpark" || function_name == "trimLeftSpark" || function_name == "trimRightSpark") - { - /// In substrait, the first arg is srcStr, the second arg is trimStr - /// But in CH, the first arg is trimStr, the second arg is srcStr - parseFunctionArgument(actions_dag, parsed_args, function_name, args[1]); - parseFunctionArgument(actions_dag, parsed_args, function_name, args[0]); - } - else if (startsWith(function_signature, "extract:")) - { - /// Skip the first arg of extract in substrait - for (int i = 1; i < args.size(); i++) - parseFunctionArgument(actions_dag, parsed_args, function_name, args[i]); - - /// Append extra mode argument for extract(WEEK_DAY from date) or extract(DAY_OF_WEEK from date) in substrait - if (function_name == "toDayOfWeek" || function_name == "DAYOFWEEK") - { - UInt8 mode = function_name == "toDayOfWeek" ? 1 : 3; - auto mode_type = std::make_shared(); - ColumnWithTypeAndName mode_col(mode_type->createColumnConst(1, mode), mode_type, getUniqueName(std::to_string(mode))); - const auto & mode_node = actions_dag->addColumn(std::move(mode_col)); - parsed_args.emplace_back(&mode_node); - } - } - else if (startsWith(function_signature, "sha2:")) - { - for (int i = 0; i < args.size() - 1; i++) - parseFunctionArgument(actions_dag, parsed_args, function_name, args[i]); - } - else - { - // Default handle - for (const auto & arg : args) - parseFunctionArgument(actions_dag, parsed_args, function_name, arg); - } -} - -void SerializedPlanParser::parseFunctionArgument( - ActionsDAGPtr & actions_dag, - ActionsDAG::NodeRawConstPtrs & parsed_args, - const std::string & function_name, - const substrait::FunctionArgument & arg) -{ - parsed_args.emplace_back(parseFunctionArgument(actions_dag, function_name, arg)); -} - -const ActionsDAG::Node * SerializedPlanParser::parseFunctionArgument( - ActionsDAGPtr & actions_dag, const std::string & function_name, const substrait::FunctionArgument & arg) -{ - const ActionsDAG::Node * res; - if (arg.value().has_scalar_function()) - { - std::string arg_name; - bool keep_arg = FUNCTION_NEED_KEEP_ARGUMENTS.contains(function_name); - parseFunctionWithDAG(arg.value(), arg_name, actions_dag, keep_arg); - res = &actions_dag->getNodes().back(); - } - else - { - res = parseExpression(actions_dag, arg.value()); - } - return res; } // Convert signed integer index into unsigned integer index @@ -1153,6 +817,12 @@ std::pair SerializedPlanParser::convertStructFieldType(const #undef UINT_CONVERT } +bool SerializedPlanParser::isFunction(substrait::Expression_ScalarFunction rel, String function_name) +{ + auto func_signature = function_mapping[std::to_string(rel.function_reference())]; + return func_signature.starts_with(function_name + ":"); +} + ActionsDAGPtr SerializedPlanParser::parseFunction( const Block & header, const substrait::Expression & rel, std::string & result_name, ActionsDAGPtr actions_dag, bool keep_result) { @@ -1210,7 +880,7 @@ ActionsDAGPtr SerializedPlanParser::parseJsonTuple( const auto & scalar_function = rel.scalar_function(); auto function_signature = function_mapping.at(std::to_string(rel.scalar_function().function_reference())); - auto function_name = getFunctionName(function_signature, scalar_function); + String function_name = "json_tuple"; auto args = scalar_function.arguments(); if (args.size() < 2) { @@ -1733,7 +1403,7 @@ std::unique_ptr SerializedPlanParser::createExecutor(DB::QueryPla context, std::move(query_plan), std::move(pipeline), query_plan->getCurrentDataStream().header.cloneEmpty()); } -QueryPlanPtr SerializedPlanParser::parse(const std::string_view & plan) +QueryPlanPtr SerializedPlanParser::parse(const std::string_view plan) { substrait::Plan s_plan; /// https://stackoverflow.com/questions/52028583/getting-error-parsing-protobuf-data @@ -1832,8 +1502,7 @@ ASTPtr ASTParser::parseToAST(const Names & names, const substrait::Expression & auto substrait_name = function_signature.substr(0, function_signature.find(':')); auto func_parser = FunctionParserFactory::instance().tryGet(substrait_name, plan_parser); - String function_name - = func_parser ? func_parser->getName() : SerializedPlanParser::getFunctionName(function_signature, scalar_function); + String function_name = func_parser->getName(); ASTs ast_args; parseFunctionArgumentsToAST(names, scalar_function, ast_args); @@ -2018,33 +1687,6 @@ void SerializedPlanParser::wrapNullable( SharedContextHolder SerializedPlanParser::shared_context; -std::unordered_map LocalExecutor::executors; -std::mutex LocalExecutor::executors_mutex; - -void LocalExecutor::cancelAll() -{ - std::lock_guard lock{executors_mutex}; - - for (auto & [handle, executor] : executors) - executor->asyncCancel(); - - for (auto & [handle, executor] : executors) - executor->waitCancelFinished(); -} - -void LocalExecutor::addExecutor(LocalExecutor * executor) -{ - std::lock_guard lock{executors_mutex}; - Int64 handle = reinterpret_cast(executor); - executors.emplace(handle, executor); -} - -void LocalExecutor::removeExecutor(Int64 handle) -{ - std::lock_guard lock{executors_mutex}; - executors.erase(handle); -} - LocalExecutor::~LocalExecutor() { if (context->getConfigRef().getBool("dump_pipeline", false)) @@ -2112,35 +1754,8 @@ Block * LocalExecutor::nextColumnar() void LocalExecutor::cancel() { - asyncCancel(); - waitCancelFinished(); -} - -void LocalExecutor::asyncCancel() -{ - if (executor && !is_cancelled) - { - LOG_INFO(&Poco::Logger::get("LocalExecutor"), "Cancel LocalExecutor {}", reinterpret_cast(this)); + if (executor) executor->cancel(); - } -} - -void LocalExecutor::waitCancelFinished() -{ - if (executor && !is_cancelled) - { - Stopwatch watch; - Chunk chunk; - while (executor->pull(chunk)) - ; - is_cancelled = true; - - LOG_INFO( - &Poco::Logger::get("LocalExecutor"), - "Finish cancel LocalExecutor {}, takes {} ms", - reinterpret_cast(this), - watch.elapsedMilliseconds()); - } } Block & LocalExecutor::getHeader() @@ -2166,9 +1781,9 @@ std::string LocalExecutor::dumpPipeline() const WriteBufferFromOwnString buffer; auto data_stats = processor->getProcessorDataStats(); buffer << "("; - buffer << "\nexcution time: " << processor->getElapsedUs() << " us."; - buffer << "\ninput wait time: " << processor->getInputWaitElapsedUs() << " us."; - buffer << "\noutput wait time: " << processor->getOutputWaitElapsedUs() << " us."; + buffer << "\nexcution time: " << processor->getElapsedNs() / 1000U << " us."; + buffer << "\ninput wait time: " << processor->getInputWaitElapsedNs() / 1000U << " us."; + buffer << "\noutput wait time: " << processor->getOutputWaitElapsedNs() / 1000U << " us."; buffer << "\ninput rows: " << data_stats.input_rows; buffer << "\ninput bytes: " << data_stats.input_bytes; buffer << "\noutput rows: " << data_stats.output_rows; diff --git a/cpp-ch/local-engine/Parser/SerializedPlanParser.h b/cpp-ch/local-engine/Parser/SerializedPlanParser.h index ad2b0d50ec6a8..fbc22a41dd050 100644 --- a/cpp-ch/local-engine/Parser/SerializedPlanParser.h +++ b/cpp-ch/local-engine/Parser/SerializedPlanParser.h @@ -35,181 +35,6 @@ namespace local_engine { -static const std::map SCALAR_FUNCTIONS - = {{"is_not_null", "isNotNull"}, - {"is_null", "isNull"}, - {"gte", "greaterOrEquals"}, - {"gt", "greater"}, - {"lte", "lessOrEquals"}, - {"lt", "less"}, - {"equal", "equals"}, - - {"and", "and"}, - {"or", "or"}, - {"not", "not"}, - {"xor", "xor"}, - - {"extract", ""}, - {"cast", "CAST"}, - {"alias", "alias"}, - - /// datetime functions - {"get_timestamp", "parseDateTimeInJodaSyntaxOrNull"}, // for spark function: to_date/to_timestamp - {"quarter", "toQuarter"}, - {"to_unix_timestamp", "parseDateTimeInJodaSyntaxOrNull"}, - //{"unix_timestamp", "toUnixTimestamp"}, - {"date_format", "formatDateTimeInJodaSyntax"}, - {"timestamp_add", "timestamp_add"}, - - - /// arithmetic functions - {"subtract", "minus"}, - {"multiply", "multiply"}, - {"add", "plus"}, - {"divide", "divide"}, - {"positive", "identity"}, - {"negative", "negate"}, - {"modulus", "modulo"}, - {"pmod", "pmod"}, - {"abs", "abs"}, - {"ceil", "ceil"}, - {"round", "roundHalfUp"}, - {"bround", "roundBankers"}, - {"exp", "exp"}, - {"power", "power"}, - {"cos", "cos"}, - {"cosh", "cosh"}, - {"sin", "sin"}, - {"sinh", "sinh"}, - {"tan", "tan"}, - {"tanh", "tanh"}, - {"acos", "acos"}, - {"asin", "asin"}, - {"atan", "atan"}, - {"atan2", "atan2"}, - {"asinh", "asinh"}, - {"acosh", "acosh"}, - {"atanh", "atanh"}, - {"bitwise_not", "bitNot"}, - {"bitwise_and", "bitAnd"}, - {"bitwise_or", "bitOr"}, - {"bitwise_xor", "bitXor"}, - {"bit_get", "bitTest"}, - {"bit_count", "bitCount"}, - {"sqrt", "sqrt"}, - {"cbrt", "cbrt"}, - {"degrees", "degrees"}, - {"e", "e"}, - {"pi", "pi"}, - {"hex", "hex"}, - {"unhex", "unhex"}, - {"hypot", "hypot"}, - {"sign", "sign"}, - {"radians", "radians"}, - {"greatest", "sparkGreatest"}, - {"least", "sparkLeast"}, - {"shiftleft", "bitShiftLeft"}, - {"shiftright", "bitShiftRight"}, - {"check_overflow", "checkDecimalOverflowSpark"}, - {"rand", "randCanonical"}, - {"isnan", "isNaN"}, - {"bin", "sparkBin"}, - {"rint", "sparkRint"}, - - /// string functions - {"like", "like"}, - {"not_like", "notLike"}, - {"starts_with", "startsWithUTF8"}, - {"ends_with", "endsWithUTF8"}, - {"contains", "countSubstrings"}, - {"substring", "substringUTF8"}, - {"substring_index", "substringIndexUTF8"}, - {"lower", "lowerUTF8"}, - {"upper", "upperUTF8"}, - {"trim", ""}, // trimLeft or trimLeftSpark, depends on argument size - {"ltrim", ""}, // trimRight or trimRightSpark, depends on argument size - {"rtrim", ""}, // trimBoth or trimBothSpark, depends on argument size - {"strpos", "positionUTF8"}, - {"replace", "replaceAll"}, - {"regexp_replace", "replaceRegexpAll"}, - {"regexp_extract_all", "regexpExtractAllSpark"}, - {"rlike", "match"}, - {"ascii", "ascii"}, - {"split", "splitByRegexp"}, - {"concat_ws", "concat_ws"}, - {"base64", "base64Encode"}, - {"unbase64", "base64Decode"}, - {"lpad", "leftPadUTF8"}, - {"rpad", "rightPadUTF8"}, - {"reverse", ""}, /// dummy mapping - {"translate", "translateUTF8"}, - {"repeat", "repeat"}, - {"space", "space"}, - {"initcap", "initcapUTF8"}, - {"conv", "sparkConv"}, - {"uuid", "generateUUIDv4"}, - {"levenshteinDistance", "editDistanceUTF8"}, - - /// hash functions - {"crc32", "CRC32"}, - {"murmur3hash", "sparkMurmurHash3_32"}, - {"xxhash64", "sparkXxHash64"}, - - // in functions - {"in", "in"}, - - // null related functions - {"coalesce", "coalesce"}, - - // date or datetime functions - {"from_unixtime", "fromUnixTimestampInJodaSyntax"}, - {"date_add", "addDays"}, - {"date_sub", "subtractDays"}, - {"datediff", "dateDiff"}, - {"second", "toSecond"}, - {"add_months", "addMonths"}, - {"date_trunc", "dateTrunc"}, - {"floor_datetime", "dateTrunc"}, - {"floor", "sparkFloor"}, - {"months_between", "sparkMonthsBetween"}, - - // array functions - {"array", "array"}, - {"shuffle", "arrayShuffle"}, - {"range", "range"}, /// dummy mapping - {"flatten", "sparkArrayFlatten"}, - - // map functions - {"map", "map"}, - {"get_map_value", "arrayElement"}, - {"map_keys", "mapKeys"}, - {"map_values", "mapValues"}, - {"map_from_arrays", "mapFromArrays"}, - - // tuple functions - {"get_struct_field", "sparkTupleElement"}, - {"get_array_struct_fields", "sparkTupleElement"}, - {"named_struct", "tuple"}, - - // table-valued generator function - {"explode", "arrayJoin"}, - {"posexplode", "arrayJoin"}, - - // json functions - {"flattenJSONStringOnRequired", "flattenJSONStringOnRequired"}, - {"get_json_object", "get_json_object"}, - {"to_json", "toJSONString"}, - {"from_json", "JSONExtract"}, - {"json_tuple", "json_tuple"}, - {"json_array_length", "JSONArrayLength"}, - {"make_decimal", "makeDecimalSpark"}, - {"unscaled_value", "unscaleValueSpark"}, - - // runtime filter - {"might_contain", "bloomFilterContains"}}; - -static const std::set FUNCTION_NEED_KEEP_ARGUMENTS = {"alias"}; - DataTypePtr wrapNullableType(substrait::Type_Nullability nullable, DataTypePtr nested_type); DataTypePtr wrapNullableType(bool nullable, DataTypePtr nested_type); @@ -254,11 +79,13 @@ class SerializedPlanParser friend class FunctionExecutor; friend class NonNullableColumnsResolver; friend class JoinRelParser; + friend class CrossRelParser; friend class MergeTreeRelParser; + friend class ProjectRelParser; std::unique_ptr createExecutor(DB::QueryPlanPtr query_plan); - DB::QueryPlanPtr parse(const std::string_view & plan); + DB::QueryPlanPtr parse(const std::string_view plan); DB::QueryPlanPtr parse(const substrait::Plan & plan); public: @@ -270,7 +97,7 @@ class SerializedPlanParser /// template - std::unique_ptr createExecutor(const std::string_view & plan); + std::unique_ptr createExecutor(const std::string_view plan); DB::QueryPlanStepPtr parseReadRealWithLocalFile(const substrait::ReadRel & rel); DB::QueryPlanStepPtr parseReadRealWithJavaIter(const substrait::ReadRel & rel); @@ -306,11 +133,14 @@ class SerializedPlanParser RelMetricPtr getMetric() { return metrics.empty() ? nullptr : metrics.at(0); } const std::unordered_map & getFunctionMapping() { return function_mapping; } - static std::string getFunctionName(const std::string & function_sig, const substrait::Expression_ScalarFunction & function); + std::string getFunctionName(const std::string & function_sig, const substrait::Expression_ScalarFunction & function); + std::optional getFunctionSignatureName(UInt32 function_ref) const; IQueryPlanStep * addRemoveNullableStep(QueryPlan & plan, const std::set & columns); IQueryPlanStep * addRollbackFilterHeaderStep(QueryPlanPtr & query_plan, const Block & input_header); + static std::pair parseLiteral(const substrait::Expression_Literal & literal); + static ContextMutablePtr global_context; static Context::ConfigurationPtr config; static SharedContextHolder shared_context; @@ -359,15 +189,7 @@ class SerializedPlanParser void parseFunctionArguments( DB::ActionsDAGPtr & actions_dag, ActionsDAG::NodeRawConstPtrs & parsed_args, - std::string & function_name, const substrait::Expression_ScalarFunction & scalar_function); - void parseFunctionArgument( - DB::ActionsDAGPtr & actions_dag, - ActionsDAG::NodeRawConstPtrs & parsed_args, - const std::string & function_name, - const substrait::FunctionArgument & arg); - const DB::ActionsDAG::Node * - parseFunctionArgument(DB::ActionsDAGPtr & actions_dag, const std::string & function_name, const substrait::FunctionArgument & arg); void parseArrayJoinArguments( DB::ActionsDAGPtr & actions_dag, @@ -384,11 +206,12 @@ class SerializedPlanParser // remove nullable after isNotNull void removeNullableForRequiredColumns(const std::set & require_columns, const ActionsDAGPtr & actions_dag) const; std::string getUniqueName(const std::string & name) { return name + "_" + std::to_string(name_no++); } - static std::pair parseLiteral(const substrait::Expression_Literal & literal); void wrapNullable( const std::vector & columns, ActionsDAGPtr actions_dag, std::map & nullable_measure_names); static std::pair convertStructFieldType(const DB::DataTypePtr & type, const DB::Field & field); + bool isFunction(substrait::Expression_ScalarFunction rel, String function_name); + int name_no = 0; std::unordered_map function_mapping; std::vector input_iters; @@ -405,7 +228,7 @@ class SerializedPlanParser }; template -std::unique_ptr SerializedPlanParser::createExecutor(const std::string_view & plan) +std::unique_ptr SerializedPlanParser::createExecutor(const std::string_view plan) { return createExecutor(JsonPlan ? parseJson(plan) : parse(plan)); } @@ -434,16 +257,9 @@ class LocalExecutor : public BlockIterator void setMetric(RelMetricPtr metric_) { metric = metric_; } void setExtraPlanHolder(std::vector & extra_plan_holder_) { extra_plan_holder = std::move(extra_plan_holder_); } - static void cancelAll(); - static void addExecutor(LocalExecutor * executor); - static void removeExecutor(Int64 handle); - private: std::unique_ptr writeBlockToSparkRow(const DB::Block & block) const; - void asyncCancel(); - void waitCancelFinished(); - /// Dump processor runtime information to log std::string dumpPipeline() const; @@ -456,11 +272,6 @@ class LocalExecutor : public BlockIterator QueryPlanPtr current_query_plan; RelMetricPtr metric; std::vector extra_plan_holder; - std::atomic is_cancelled{false}; - - /// Record all active LocalExecutor in current executor to cancel them when executor receives shutdown command from driver. - static std::unordered_map executors; - static std::mutex executors_mutex; }; diff --git a/cpp-ch/local-engine/Parser/TypeParser.cpp b/cpp-ch/local-engine/Parser/TypeParser.cpp index 3ad19bb2bd733..40360ea77302f 100644 --- a/cpp-ch/local-engine/Parser/TypeParser.cpp +++ b/cpp-ch/local-engine/Parser/TypeParser.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -59,7 +60,8 @@ std::unordered_map TypeParser::type_names_mapping {"FloatType", "Float32"}, {"DoubleType", "Float64"}, {"StringType", "String"}, - {"DateType", "Date32"}}; + {"DateType", "Date32"}, + {"TimestampType", "DateTime64"}}; String TypeParser::getCHTypeName(const String & spark_type_name) { @@ -283,10 +285,8 @@ DB::Block TypeParser::buildBlockFromNamedStruct( /// This may remove elements from args_types, because some of them are used to determine CH function name, but not needed for the following /// call `AggregateFunctionFactory::instance().get` auto agg_function_name = function_parser->getCHFunctionName(args_types); - auto action = NullsAction::EMPTY; - ch_type = AggregateFunctionFactory::instance() - .get(agg_function_name, action, args_types, function_parser->getDefaultFunctionParameters(), properties) - ->getStateType(); + ch_type = RelParser::getAggregateFunction(agg_function_name, args_types, properties, function_parser->getDefaultFunctionParameters()) + ->getStateType(); } internal_cols.push_back(ColumnWithTypeAndName(ch_type, name)); diff --git a/cpp-ch/local-engine/Parser/WindowRelParser.cpp b/cpp-ch/local-engine/Parser/WindowRelParser.cpp index 4125879b5ec7f..2317c8098b858 100644 --- a/cpp-ch/local-engine/Parser/WindowRelParser.cpp +++ b/cpp-ch/local-engine/Parser/WindowRelParser.cpp @@ -172,6 +172,7 @@ WindowRelParser::parseWindowFrameType(const std::string & function_name, const s static const std::unordered_map special_function_frame_type = { {"rank", substrait::RANGE}, {"dense_rank", substrait::RANGE}, + {"percent_rank", substrait::RANGE} }; substrait::WindowType frame_type; diff --git a/cpp-ch/local-engine/Parser/aggregate_function_parser/CommonAggregateFunctionParser.cpp b/cpp-ch/local-engine/Parser/aggregate_function_parser/CommonAggregateFunctionParser.cpp index 1619c74106d1c..d88885a312b2e 100644 --- a/cpp-ch/local-engine/Parser/aggregate_function_parser/CommonAggregateFunctionParser.cpp +++ b/cpp-ch/local-engine/Parser/aggregate_function_parser/CommonAggregateFunctionParser.cpp @@ -40,10 +40,8 @@ REGISTER_COMMON_AGGREGATE_FUNCTION_PARSER(FirstIgnoreNull, first_ignore_null, fi REGISTER_COMMON_AGGREGATE_FUNCTION_PARSER(Last, last, last_value_respect_nulls) REGISTER_COMMON_AGGREGATE_FUNCTION_PARSER(LastIgnoreNull, last_ignore_null, last_value) REGISTER_COMMON_AGGREGATE_FUNCTION_PARSER(DenseRank, dense_rank, dense_rank) +REGISTER_COMMON_AGGREGATE_FUNCTION_PARSER(PercentRank, percent_rank, percent_rank) REGISTER_COMMON_AGGREGATE_FUNCTION_PARSER(Rank, rank, rank) REGISTER_COMMON_AGGREGATE_FUNCTION_PARSER(RowNumber, row_number, row_number) -REGISTER_COMMON_AGGREGATE_FUNCTION_PARSER(Ntile, ntile, ntile) -REGISTER_COMMON_AGGREGATE_FUNCTION_PARSER(PercentRank, percent_rank, percent_rank) -REGISTER_COMMON_AGGREGATE_FUNCTION_PARSER(CumeDist, cume_dist, cume_dist) REGISTER_COMMON_AGGREGATE_FUNCTION_PARSER(CountDistinct, count_distinct, uniqExact) } diff --git a/cpp-ch/local-engine/Parser/aggregate_function_parser/CountParser.cpp b/cpp-ch/local-engine/Parser/aggregate_function_parser/CountParser.cpp index da99eb19537f9..123d13c365875 100644 --- a/cpp-ch/local-engine/Parser/aggregate_function_parser/CountParser.cpp +++ b/cpp-ch/local-engine/Parser/aggregate_function_parser/CountParser.cpp @@ -43,7 +43,7 @@ String CountParser::getCHFunctionName(DB::DataTypes &) const } DB::ActionsDAG::NodeRawConstPtrs CountParser::parseFunctionArguments( - const CommonFunctionInfo & func_info, const String & /*ch_func_name*/, DB::ActionsDAGPtr & actions_dag) const + const CommonFunctionInfo & func_info, DB::ActionsDAGPtr & actions_dag) const { if (func_info.arguments.size() < 1) { diff --git a/cpp-ch/local-engine/Parser/aggregate_function_parser/CountParser.h b/cpp-ch/local-engine/Parser/aggregate_function_parser/CountParser.h index a561f87d940d4..a83ec2d5a337c 100644 --- a/cpp-ch/local-engine/Parser/aggregate_function_parser/CountParser.h +++ b/cpp-ch/local-engine/Parser/aggregate_function_parser/CountParser.h @@ -30,6 +30,6 @@ class CountParser : public AggregateFunctionParser String getCHFunctionName(const CommonFunctionInfo &) const override; String getCHFunctionName(DB::DataTypes &) const override; DB::ActionsDAG::NodeRawConstPtrs parseFunctionArguments( - const CommonFunctionInfo & func_info, const String & ch_func_name, DB::ActionsDAGPtr & actions_dag) const override; + const CommonFunctionInfo & func_info, DB::ActionsDAGPtr & actions_dag) const override; }; } diff --git a/cpp-ch/local-engine/Parser/aggregate_function_parser/LeadLagParser.cpp b/cpp-ch/local-engine/Parser/aggregate_function_parser/LeadLagParser.cpp index dd9e3ff445fb9..6a56a82d5044d 100644 --- a/cpp-ch/local-engine/Parser/aggregate_function_parser/LeadLagParser.cpp +++ b/cpp-ch/local-engine/Parser/aggregate_function_parser/LeadLagParser.cpp @@ -24,7 +24,7 @@ namespace local_engine { DB::ActionsDAG::NodeRawConstPtrs -LeadParser::parseFunctionArguments(const CommonFunctionInfo & func_info, const String & /*ch_func_name*/, DB::ActionsDAGPtr & actions_dag) const +LeadParser::parseFunctionArguments(const CommonFunctionInfo & func_info, DB::ActionsDAGPtr & actions_dag) const { DB::ActionsDAG::NodeRawConstPtrs args; const auto & arg0 = func_info.arguments[0].value(); @@ -67,7 +67,7 @@ LeadParser::parseFunctionArguments(const CommonFunctionInfo & func_info, const S AggregateFunctionParserRegister lead_register; DB::ActionsDAG::NodeRawConstPtrs -LagParser::parseFunctionArguments(const CommonFunctionInfo & func_info, const String & /*ch_func_name*/, DB::ActionsDAGPtr & actions_dag) const +LagParser::parseFunctionArguments(const CommonFunctionInfo & func_info, DB::ActionsDAGPtr & actions_dag) const { DB::ActionsDAG::NodeRawConstPtrs args; const auto & arg0 = func_info.arguments[0].value(); diff --git a/cpp-ch/local-engine/Parser/aggregate_function_parser/LeadLagParser.h b/cpp-ch/local-engine/Parser/aggregate_function_parser/LeadLagParser.h index 4fa1c1bbca139..25f679c77b401 100644 --- a/cpp-ch/local-engine/Parser/aggregate_function_parser/LeadLagParser.h +++ b/cpp-ch/local-engine/Parser/aggregate_function_parser/LeadLagParser.h @@ -29,7 +29,7 @@ class LeadParser : public AggregateFunctionParser String getCHFunctionName(const CommonFunctionInfo &) const override { return "leadInFrame"; } String getCHFunctionName(DB::DataTypes &) const override { return "leadInFrame"; } DB::ActionsDAG::NodeRawConstPtrs parseFunctionArguments( - const CommonFunctionInfo & func_info, const String & ch_func_name, DB::ActionsDAGPtr & actions_dag) const override; + const CommonFunctionInfo & func_info, DB::ActionsDAGPtr & actions_dag) const override; }; class LagParser : public AggregateFunctionParser @@ -42,6 +42,6 @@ class LagParser : public AggregateFunctionParser String getCHFunctionName(const CommonFunctionInfo &) const override { return "lagInFrame"; } String getCHFunctionName(DB::DataTypes &) const override { return "lagInFrame"; } DB::ActionsDAG::NodeRawConstPtrs parseFunctionArguments( - const CommonFunctionInfo & func_info, const String & ch_func_name, DB::ActionsDAGPtr & actions_dag) const override; + const CommonFunctionInfo & func_info, DB::ActionsDAGPtr & actions_dag) const override; }; } diff --git a/cpp-ch/local-engine/Parser/aggregate_function_parser/NtileParser.cpp b/cpp-ch/local-engine/Parser/aggregate_function_parser/NtileParser.cpp new file mode 100644 index 0000000000000..19d7930fc1fc0 --- /dev/null +++ b/cpp-ch/local-engine/Parser/aggregate_function_parser/NtileParser.cpp @@ -0,0 +1,42 @@ +/* + * 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. + */ +#include "NtileParser.h" +#include +#include +#include + +namespace local_engine +{ +DB::ActionsDAG::NodeRawConstPtrs +NtileParser::parseFunctionArguments(const CommonFunctionInfo & func_info, DB::ActionsDAGPtr & actions_dag) const +{ + if (func_info.arguments.size() != 1) + throw Exception(ErrorCodes::BAD_ARGUMENTS, "Function ntile takes exactly one argument"); + DB::ActionsDAG::NodeRawConstPtrs args; + + const auto & arg0 = func_info.arguments[0].value(); + auto [data_type, field] = parseLiteral(arg0.literal()); + if (!(DB::WhichDataType(data_type).isInt32())) + throw Exception(ErrorCodes::BAD_ARGUMENTS, "ntile's argument must be i32"); + Int32 field_index = static_cast(field.get()); + // For CH, the data type of the args[0] must be the UInt32 + const auto * index_node = addColumnToActionsDAG(actions_dag, std::make_shared(), field_index); + args.emplace_back(index_node); + return args; +} +AggregateFunctionParserRegister ntile_register; +} diff --git a/cpp-ch/local-engine/Parser/aggregate_function_parser/NtileParser.h b/cpp-ch/local-engine/Parser/aggregate_function_parser/NtileParser.h new file mode 100644 index 0000000000000..28878a9f89db8 --- /dev/null +++ b/cpp-ch/local-engine/Parser/aggregate_function_parser/NtileParser.h @@ -0,0 +1,34 @@ +/* + * 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. + */ +#pragma once +#include + +namespace local_engine +{ +class NtileParser : public AggregateFunctionParser +{ +public: + explicit NtileParser(SerializedPlanParser * plan_parser_) : AggregateFunctionParser(plan_parser_) { } + ~NtileParser() override = default; + static constexpr auto name = "ntile"; + String getName() const override { return name; } + String getCHFunctionName(const CommonFunctionInfo &) const override { return "ntile"; } + String getCHFunctionName(DB::DataTypes &) const override { return "ntile"; } + DB::ActionsDAG::NodeRawConstPtrs parseFunctionArguments( + const CommonFunctionInfo & func_info, DB::ActionsDAGPtr & actions_dag) const override; +}; +} diff --git a/cpp-ch/local-engine/Parser/example_udf/myMd5.cpp b/cpp-ch/local-engine/Parser/example_udf/myMd5.cpp index 99e0a0041335f..1e70c775e130c 100644 --- a/cpp-ch/local-engine/Parser/example_udf/myMd5.cpp +++ b/cpp-ch/local-engine/Parser/example_udf/myMd5.cpp @@ -43,7 +43,7 @@ class FunctionParserMyMd5 : public FunctionParser { // In Spark: md5(str) // In CH: lower(hex(MD5(str))) - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 1) throw Exception(ErrorCodes::BAD_ARGUMENTS, "Function {} requires exactly one arguments", getName()); diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/CommonScalarFunctionParser.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/CommonScalarFunctionParser.cpp index 9ed777131a7e9..e4855b507f90e 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/CommonScalarFunctionParser.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/CommonScalarFunctionParser.cpp @@ -33,7 +33,6 @@ namespace local_engine { \ return #substrait_name; \ } \ - protected: \ String getCHFunctionName(const substrait::Expression_ScalarFunction & /*substrait_func*/) const override \ { \ return #ch_name; \ @@ -44,4 +43,136 @@ namespace local_engine REGISTER_COMMON_SCALAR_FUNCTION_PARSER(NextDay, next_day, spark_next_day) REGISTER_COMMON_SCALAR_FUNCTION_PARSER(LastDay, last_day, toLastDayOfMonth) REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Str2Map, str_to_map, spark_str_to_map) + +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(IsNotNull, is_not_null, isNotNull); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(IsNull, is_null, isNull); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(GTE, gte, greaterOrEquals); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(GT, gt, greater); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(LTE, lte, lessOrEquals); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(LT, lt, less); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(And, and, and); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Or, or, or); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Equal, equal, equals); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Not, not, not); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Xor, xor, xor); + +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Cast, cast, CAST); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(GetTimestamp, get_timestamp, parseDateTimeInJodaSyntaxOrNull); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Quarter, quarter, toQuarter); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(ToUnixTimestamp, to_unix_timestamp, parseDateTimeInJodaSyntaxOrNull); + +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Position, positive, identity); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Negative, negative, negate); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Pmod, pmod, pmod); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(abs, abs, abs); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Ceil, ceil, ceil); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Round, round, roundHalfUp); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Bround, bround, roundBankers); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Exp, exp, exp); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Power, power, power); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Cos, cos, cos); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Cosh, cosh, cosh); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Sin, sin, sin); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Sinh, sinh, sinh); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Tan, tan, tan); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Tanh, tanh, tanh); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Acos, acos, acos); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Asin, asin, asin); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Atan, atan, atan); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Atan2, atan2, atan2); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Asinh, asinh, asinh); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Acosh, acosh, acosh); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Atanh, atanh, atanh); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(BitwiseNot, bitwise_not, bitNot); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(BitwiseAnd, bitwise_and, bitAnd); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(BitwiseOr, bitwise_or, bitOr); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(BitwiseXor, bitwise_xor, bitXor); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(BitGet, bit_get, bitTest); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(BitCount, bit_count, bitCount); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Sqrt, sqrt, sqrt); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Cbrc, cbrt, cbrt); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Degrees, degrees, degrees); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(E, e, e); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Pi, pi, pi); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Hex, hex, hex); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Unhex, unhex, unhex); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Hypot, hypot, hypot); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Sign, sign, sign); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Radians, radians, radians); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Greatest, greatest, sparkGreatest); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Least, least, sparkLeast); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(ShiftLeft, shiftleft, bitShiftLeft); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(ShiftRight, shiftright, bitShiftRight); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Rand, rand, randCanonical); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Bin, bin, sparkBin); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Rint, rint, sparkRint); + +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Like, like, like); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(NotLike, not_like, notLike); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(StartsWith, starts_with, startsWithUTF8); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(EndsWith, ends_with, endsWithUTF8); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Contains, contains, countSubstrings); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(SubstringIndex, substring_index, substringIndexUTF8); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Lower, lower, lowerUTF8); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Upper, upper, upperUTF8); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Strpos, strpos, positionUTF8); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Replace, replace, replaceAll); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(RegexpReplace, regexp_replace, replaceRegexpAll); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(RegexpExtractAll, regexp_extract_all, regexpExtractAllSpark); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Rlike, rlike, match); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Ascii, ascii, ascii); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Base64, base64, base64Encode); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Unbase64, unbase64, base64Decode); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Lpad, lpad, leftPadUTF8); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Rpad, rpad, rightPadUTF8); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Translate, translate, translateUTF8); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Initcap, initcap, initcapUTF8); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Conv, conv, sparkConv); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Uuid, uuid, generateUUIDv4); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Levenshtein, levenshtein, editDistanceUTF8); + +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Crc32, crc32, CRC32); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Murmur3Hash, murmur3hash, sparkMurmurHash3_32); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Xxhash64, xxhash64, sparkXxHash64); + +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(In, in, in); + +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Coalesce, coalesce, coalesce); + +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(FromUnixtime, from_unixtime, fromUnixTimestampInJodaSyntax); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(DateAdd, date_add, addDays); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(DateSub, date_sub, subtractDays); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(DateDiff, datediff, dateDiff); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Second, second, toSecond); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(AddMonths, add_months, addMonths); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(DateTrunc, date_trunc, dateTrunc); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(FloorDatetime, floor_datetime, dateTrunc); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Floor, floor, sparkFloor); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(MothsBetween, months_between, sparkMonthsBetween); + + +// array functions +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Array, array, array); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Shuffle, shuffle, arrayShuffle); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Range, range, range); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Flatten, flatten, sparkArrayFlatten); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(ArrayJoin, array_join, sparkArrayJoin); + +// map functions +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(Map, map, map); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(GetMapValue, get_map_value, arrayElement); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(MapKeys, map_keys, mapKeys); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(MapValues, map_values, mapValues); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(MapFromArrays, map_from_arrays, mapFromArrays); + + +// json functions +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(FlattenJsonStringOnRequired, flattenJSONStringOnRequired, flattenJSONStringOnRequired); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(ToJson, to_json, toJSONString); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(JsonTuple, json_tuple, json_tuple); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(JsonArrayLen, json_array_length, JSONArrayLength); +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(UnscaledValue, unscaled_value, unscaleValueSpark); + +// runtime filter +REGISTER_COMMON_SCALAR_FUNCTION_PARSER(MightContain, might_contain, bloomFilterContains); } diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/alias.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/alias.cpp new file mode 100644 index 0000000000000..e5493eb80b2a2 --- /dev/null +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/alias.cpp @@ -0,0 +1,53 @@ +/* + * 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. + */ +#include +#include + +namespace local_engine +{ +class SparkFunctionAliasParser : public FunctionParser +{ +public: + SparkFunctionAliasParser(SerializedPlanParser * plan_parser_) : FunctionParser(plan_parser_) {} + ~SparkFunctionAliasParser() override = default; + static constexpr auto name = "alias"; + String getName() const { return name; } + String getCHFunctionName(const substrait::Expression_ScalarFunction &) const override { return name; } + + const DB::ActionsDAG::Node * parse(const substrait::Expression_ScalarFunction & substrait_func, DB::ActionsDAGPtr & actions_dag) const override + { + DB::ActionsDAG::NodeRawConstPtrs parsed_args; + const auto & args = substrait_func.arguments(); + for (const auto & arg : args) + { + if (arg.value().has_scalar_function()) + { + String empty_result_name;// no meaning + parsed_args.emplace_back(parseFunctionWithDAG(arg.value(), empty_result_name, actions_dag, true)); + } + else + parsed_args.emplace_back(parseExpression(actions_dag, arg.value())); + } + String result_name = parsed_args[0]->result_name; + actions_dag->addOrReplaceInOutputs(*parsed_args[0]); + return &actions_dag->addAlias(actions_dag->findInOutputs(result_name), result_name); + } + +}; +static FunctionParserRegister register_alias; +} + diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/arithmetic.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/arithmetic.cpp index d58b22a87e6cc..7d8c3f948c631 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/arithmetic.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/arithmetic.cpp @@ -146,7 +146,7 @@ class FunctionParserBinaryArithmetic : public FunctionParser const ActionsDAG::Node * parse(const substrait::Expression_ScalarFunction & substrait_func, ActionsDAGPtr & actions_dag) const override { const auto ch_func_name = getCHFunctionName(substrait_func); - auto parsed_args = parseFunctionArguments(substrait_func, ch_func_name, actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 2) throw Exception(DB::ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires exactly two arguments", getName()); @@ -191,6 +191,7 @@ class FunctionParserPlus final : public FunctionParserBinaryArithmetic static constexpr auto name = "add"; String getName() const override { return name; } + String getCHFunctionName(const substrait::Expression_ScalarFunction & substrait_func) const override { return "plus"; } protected: DecimalType internalEvalType(const Int32 p1, const Int32 s1, const Int32 p2, const Int32 s2) const override @@ -206,6 +207,7 @@ class FunctionParserMinus final : public FunctionParserBinaryArithmetic static constexpr auto name = "subtract"; String getName() const override { return name; } + String getCHFunctionName(const substrait::Expression_ScalarFunction & substrait_func) const override { return "minus"; } protected: DecimalType internalEvalType(const Int32 p1, const Int32 s1, const Int32 p2, const Int32 s2) const override @@ -220,6 +222,7 @@ class FunctionParserMultiply final : public FunctionParserBinaryArithmetic explicit FunctionParserMultiply(SerializedPlanParser * plan_parser_) : FunctionParserBinaryArithmetic(plan_parser_) { } static constexpr auto name = "multiply"; String getName() const override { return name; } + String getCHFunctionName(const substrait::Expression_ScalarFunction & substrait_func) const override { return "multiply"; } protected: DecimalType internalEvalType(const Int32 p1, const Int32 s1, const Int32 p2, const Int32 s2) const override @@ -234,6 +237,7 @@ class FunctionParserModulo final : public FunctionParserBinaryArithmetic explicit FunctionParserModulo(SerializedPlanParser * plan_parser_) : FunctionParserBinaryArithmetic(plan_parser_) { } static constexpr auto name = "modulus"; String getName() const override { return name; } + String getCHFunctionName(const substrait::Expression_ScalarFunction & substrait_func) const override { return "modulo"; } protected: DecimalType internalEvalType(const Int32 p1, const Int32 s1, const Int32 p2, const Int32 s2) const override @@ -248,6 +252,7 @@ class FunctionParserDivide final : public FunctionParserBinaryArithmetic explicit FunctionParserDivide(SerializedPlanParser * plan_parser_) : FunctionParserBinaryArithmetic(plan_parser_) { } static constexpr auto name = "divide"; String getName() const override { return name; } + String getCHFunctionName(const substrait::Expression_ScalarFunction & substrait_func) const override { return "divide"; } protected: DecimalType internalEvalType(const Int32 p1, const Int32 s1, const Int32 p2, const Int32 s2) const override diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/arrayContains.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/arrayContains.cpp index 05301cc827368..d92a1eac7da2e 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/arrayContains.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/arrayContains.cpp @@ -45,8 +45,8 @@ class FunctionParserArrayContains : public FunctionParser String getName() const override { return name; } const ActionsDAG::Node * parse( - const substrait::Expression_ScalarFunction & substrait_func, - ActionsDAGPtr & actions_dag) const override + const substrait::Expression_ScalarFunction & substrait_func, + ActionsDAGPtr & actions_dag) const override { /** parse array_contains(arr, value) as @@ -65,7 +65,7 @@ class FunctionParserArrayContains : public FunctionParser arr.nullable || value.nullable || arr.dataType.asInstanceOf[ArrayType].containsNull */ - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 2) throw Exception(DB::ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires exactly two arguments", getName()); @@ -108,7 +108,7 @@ class FunctionParserArrayContains : public FunctionParser }); return convertNodeTypeIfNeeded(substrait_func, multi_if_node, actions_dag); } -protected: + String getCHFunctionName(const substrait::Expression_ScalarFunction & /*substrait_func*/) const override { return "has"; diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/arrayDistinct.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/arrayDistinct.cpp index b828b29f7ee28..30709a7e9ed6e 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/arrayDistinct.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/arrayDistinct.cpp @@ -44,7 +44,7 @@ class FunctionParserArrayDistinct : public FunctionParser const substrait::Expression_ScalarFunction & substrait_func, ActionsDAGPtr & actions_dag) const override { - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 1) throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires exactly one arguments", getName()); diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/arrayElement.h b/cpp-ch/local-engine/Parser/scalar_function_parser/arrayElement.h index 9081a37bd89e9..5873d39cc22bf 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/arrayElement.h +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/arrayElement.h @@ -52,7 +52,7 @@ class FunctionParserArrayElement : public FunctionParser else arrayElement(arr, idx) */ - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 2) throw Exception(DB::ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires exactly two arguments", getName()); @@ -70,7 +70,7 @@ class FunctionParserArrayElement : public FunctionParser auto * if_node = toFunctionNode(actions_dag, "if", {greater_or_equals_node, null_const_node, array_element_node}); return if_node; } -protected: + String getCHFunctionName(const substrait::Expression_ScalarFunction & /*substrait_func*/) const override { return "arrayElement"; diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/arrayHighOrderFunctions.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/arrayHighOrderFunctions.cpp new file mode 100644 index 0000000000000..eacd72ed044fa --- /dev/null +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/arrayHighOrderFunctions.cpp @@ -0,0 +1,298 @@ +/* + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace DB::ErrorCodes +{ + extern const int LOGICAL_ERROR; +} + +namespace local_engine +{ +class ArrayFilter : public FunctionParser +{ +public: + static constexpr auto name = "filter"; + explicit ArrayFilter(SerializedPlanParser * plan_parser_) : FunctionParser(plan_parser_) {} + ~ArrayFilter() override = default; + + String getName() const override { return name; } + + String getCHFunctionName(const substrait::Expression_ScalarFunction & scalar_function) const override + { + return "arrayFilter"; + } + + const DB::ActionsDAG::Node * parse(const substrait::Expression_ScalarFunction & substrait_func, + DB::ActionsDAGPtr & actions_dag) const + { + auto ch_func_name = getCHFunctionName(substrait_func); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); + assert(parsed_args.size() == 2); + if (collectLambdaArguments(*plan_parser, substrait_func.arguments()[1].value().scalar_function()).size() == 1) + return toFunctionNode(actions_dag, ch_func_name, {parsed_args[1], parsed_args[0]}); + + /// filter with index argument. + const auto * range_end_node = toFunctionNode(actions_dag, "length", {toFunctionNode(actions_dag, "assumeNotNull", {parsed_args[0]})}); + range_end_node = ActionsDAGUtil::convertNodeType( + actions_dag, range_end_node, "Nullable(Int32)", range_end_node->result_name); + const auto * index_array_node = toFunctionNode( + actions_dag, + "range", + {addColumnToActionsDAG(actions_dag, std::make_shared(), 0), range_end_node}); + return toFunctionNode(actions_dag, ch_func_name, {parsed_args[1], parsed_args[0], index_array_node}); + } +}; +static FunctionParserRegister register_array_filter; + +class ArrayTransform : public FunctionParser +{ +public: + static constexpr auto name = "transform"; + explicit ArrayTransform(SerializedPlanParser * plan_parser_) : FunctionParser(plan_parser_) {} + ~ArrayTransform() override = default; + String getName() const override { return name; } + String getCHFunctionName(const substrait::Expression_ScalarFunction & scalar_function) const override + { + return "arrayMap"; + } + + const DB::ActionsDAG::Node * parse(const substrait::Expression_ScalarFunction & substrait_func, + DB::ActionsDAGPtr & actions_dag) const + { + auto ch_func_name = getCHFunctionName(substrait_func); + auto lambda_args = collectLambdaArguments(*plan_parser, substrait_func.arguments()[1].value().scalar_function()); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); + assert(parsed_args.size() == 2); + if (lambda_args.size() == 1) + { + return toFunctionNode(actions_dag, ch_func_name, {parsed_args[1], parsed_args[0]}); + } + + /// transform with index argument. + const auto * range_end_node = toFunctionNode(actions_dag, "length", {toFunctionNode(actions_dag, "assumeNotNull", {parsed_args[0]})}); + range_end_node = ActionsDAGUtil::convertNodeType( + actions_dag, range_end_node, "Nullable(Int32)", range_end_node->result_name); + const auto * index_array_node = toFunctionNode( + actions_dag, + "range", + {addColumnToActionsDAG(actions_dag, std::make_shared(), 0), range_end_node}); + return toFunctionNode(actions_dag, ch_func_name, {parsed_args[1], parsed_args[0], index_array_node}); + } +}; +static FunctionParserRegister register_array_map; + +class ArrayAggregate : public FunctionParser +{ +public: + static constexpr auto name = "aggregate"; + explicit ArrayAggregate(SerializedPlanParser * plan_parser_) : FunctionParser(plan_parser_) {} + ~ArrayAggregate() override = default; + String getName() const override { return name; } + String getCHFunctionName(const substrait::Expression_ScalarFunction & scalar_function) const override + { + return "arrayFold"; + } + const DB::ActionsDAG::Node * parse(const substrait::Expression_ScalarFunction & substrait_func, + DB::ActionsDAGPtr & actions_dag) const + { + auto ch_func_name = getCHFunctionName(substrait_func); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); + assert(parsed_args.size() == 3); + const auto * function_type = typeid_cast(parsed_args[2]->result_type.get()); + if (!function_type) + throw DB::Exception(DB::ErrorCodes::LOGICAL_ERROR, "The third argument of aggregate function must be a lambda function"); + if (!parsed_args[1]->result_type->equals(*(function_type->getReturnType()))) + { + parsed_args[1] = ActionsDAGUtil::convertNodeType( + actions_dag, + parsed_args[1], + function_type->getReturnType()->getName(), + parsed_args[1]->result_name); + } + + /// arrayFold cannot accept nullable(array) + const auto * array_col_node = parsed_args[0]; + if (parsed_args[0]->result_type->isNullable()) + { + array_col_node = toFunctionNode(actions_dag, "assumeNotNull", {parsed_args[0]}); + } + const auto * func_node = toFunctionNode(actions_dag, ch_func_name, {parsed_args[2], array_col_node, parsed_args[1]}); + /// For null array, result is null. + /// TODO: make a new version of arrayFold that can handle nullable array. + const auto * is_null_node = toFunctionNode(actions_dag, "isNull", {parsed_args[0]}); + const auto * null_node = addColumnToActionsDAG(actions_dag, DB::makeNullable(func_node->result_type), DB::Null()); + return toFunctionNode(actions_dag, "if", {is_null_node, null_node, func_node}); + } +}; +static FunctionParserRegister register_array_aggregate; + +class ArraySort : public FunctionParser +{ +public: + static constexpr auto name = "array_sort"; + explicit ArraySort(SerializedPlanParser * plan_parser_) : FunctionParser(plan_parser_) {} + ~ArraySort() override = default; + String getName() const override { return name; } + String getCHFunctionName(const substrait::Expression_ScalarFunction & scalar_function) const override + { + return "arraySortSpark"; + } + const DB::ActionsDAG::Node * parse(const substrait::Expression_ScalarFunction & substrait_func, + DB::ActionsDAGPtr & actions_dag) const + { + auto ch_func_name = getCHFunctionName(substrait_func); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); + + if (parsed_args.size() != 2) + throw DB::Exception(DB::ErrorCodes::LOGICAL_ERROR, "array_sort function must have two arguments"); + if (isDefaultCompare(substrait_func.arguments()[1].value().scalar_function())) + { + return toFunctionNode(actions_dag, ch_func_name, {parsed_args[0]}); + } + + return toFunctionNode(actions_dag, ch_func_name, {parsed_args[1], parsed_args[0]}); + } +private: + + /// The default lambda compare function for array_sort, `array_sort(x)`. + bool isDefaultCompare(const substrait::Expression_ScalarFunction & scalar_function) const + { + String left_variable_name, right_variable_name; + auto names_types = collectLambdaArguments(*plan_parser, scalar_function); + { + auto it = names_types.begin(); + left_variable_name = it->name; + it++; + right_variable_name = it->name; + } + + auto is_function = [&](const substrait::Expression & expr, const String & function_name) { + return expr.has_scalar_function() + && *(plan_parser->getFunctionSignatureName(expr.scalar_function().function_reference())) == function_name; + }; + + auto is_variable = [&](const substrait::Expression & expr, const String & var) { + if (!is_function(expr, "namedlambdavariable")) + { + return false; + } + const auto var_expr = expr.scalar_function().arguments()[0].value(); + if (!var_expr.has_literal()) + return false; + auto [_, name] = plan_parser->parseLiteral(var_expr.literal()); + return var == name.get(); + }; + + auto is_int_value = [&](const substrait::Expression & expr, Int32 val) { + if (!expr.has_literal()) + return false; + auto [_, x] = plan_parser->parseLiteral(expr.literal()); + return val == x.get(); + }; + + auto is_variable_null = [&](const substrait::Expression & expr, const String & var) { + return is_function(expr, "is_null") && is_variable(expr.scalar_function().arguments(0).value(), var); + }; + + auto is_both_null = [&](const substrait::Expression & expr) { + return is_function(expr, "and") + && is_variable_null(expr.scalar_function().arguments(0).value(), left_variable_name) + && is_variable_null(expr.scalar_function().arguments(1).value(), right_variable_name); + }; + + auto is_left_greater_right = [&](const substrait::Expression & expr) { + if (!expr.has_if_then()) + return false; + + const auto & if_ = expr.if_then().ifs(0); + if (!is_function(if_.if_(), "gt")) + return false; + + const auto & less_args = if_.if_().scalar_function().arguments(); + return is_variable(less_args[0].value(), left_variable_name) + && is_variable(less_args[1].value(), right_variable_name) + && is_int_value(if_.then(), 1) + && is_int_value(expr.if_then().else_(), 0); + }; + + auto is_left_less_right = [&](const substrait::Expression & expr) { + if (!expr.has_if_then()) + return false; + + const auto & if_ = expr.if_then().ifs(0); + if (!is_function(if_.if_(), "lt")) + return false; + + const auto & less_args = if_.if_().scalar_function().arguments(); + return is_variable(less_args[0].value(), left_variable_name) + && is_variable(less_args[1].value(), right_variable_name) + && is_int_value(if_.then(), -1) + && is_left_greater_right(expr.if_then().else_()); + }; + + auto is_right_null_else = [&](const substrait::Expression & expr) { + if (!expr.has_if_then()) + return false; + + /// if right arg is null, return 1 + const auto & if_then = expr.if_then(); + return is_variable_null(if_then.ifs(0).if_(), right_variable_name) + && is_int_value(if_then.ifs(0).then(), -1) + && is_left_less_right(if_then.else_()); + + }; + + auto is_left_null_else = [&](const substrait::Expression & expr) { + if (!expr.has_if_then()) + return false; + + /// if left arg is null, return 1 + const auto & if_then = expr.if_then(); + return is_variable_null(if_then.ifs(0).if_(), left_variable_name) + && is_int_value(if_then.ifs(0).then(), 1) + && is_right_null_else(if_then.else_()); + }; + + auto is_if_both_null_else = [&](const substrait::Expression & expr) { + if (!expr.has_if_then()) + { + return false; + } + const auto & if_ = expr.if_then().ifs(0); + return is_both_null(if_.if_()) + && is_int_value(if_.then(), 0) + && is_left_null_else(expr.if_then().else_()); + }; + + const auto & lambda_body = scalar_function.arguments()[0].value(); + return is_if_both_null_else(lambda_body); + } +}; +static FunctionParserRegister register_array_sort; + +} diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/arrayIntersect.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/arrayIntersect.cpp index 03eec981a516b..2891846ef014a 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/arrayIntersect.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/arrayIntersect.cpp @@ -47,7 +47,7 @@ class FunctionParserArrayIntersect : public FunctionParser const substrait::Expression_ScalarFunction & substrait_func, ActionsDAGPtr & actions_dag) const override { - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 2) throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires exactly two arguments", getName()); diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/arrayMaxAndMin.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/arrayMaxAndMin.cpp index 87ae8ab7764a8..a0e6786442ee0 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/arrayMaxAndMin.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/arrayMaxAndMin.cpp @@ -42,7 +42,7 @@ class BaseFunctionParserArrayMaxAndMin : public FunctionParser const substrait::Expression_ScalarFunction & substrait_func, ActionsDAGPtr & actions_dag) const override { - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 1) throw Exception(ErrorCodes::BAD_ARGUMENTS, "Function {} requires exactly one arguments", getName()); diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/arrayPosition.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/arrayPosition.cpp index 35b61c99d2734..d3eed7c67568d 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/arrayPosition.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/arrayPosition.cpp @@ -58,7 +58,7 @@ class FunctionParserArrayPosition : public FunctionParser 2. CH indexOf function cannot accept Nullable(Array()) type as first argument */ - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 2) throw Exception(DB::ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires exactly two arguments", getName()); @@ -92,7 +92,7 @@ class FunctionParserArrayPosition : public FunctionParser const auto * if_node = toFunctionNode(actions_dag, "if", {or_condition_node, null_const_node, wrap_index_of_node}); return convertNodeTypeIfNeeded(substrait_func, if_node, actions_dag); } -protected: + String getCHFunctionName(const substrait::Expression_ScalarFunction & /*substrait_func*/) const override { return "indexOf"; diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/arrayUnion.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/arrayUnion.cpp index 917f37d53104c..7a48d7920d2c0 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/arrayUnion.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/arrayUnion.cpp @@ -45,7 +45,7 @@ class FunctionParserArrayUnion : public FunctionParser ActionsDAGPtr & actions_dag) const override { /// parse array_union(a, b) as arrayDistinctSpark(arrayConcat(a, b)) - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 2) throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires exactly two arguments", getName()); diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/bitLength.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/bitLength.cpp index 9358c45788cf8..b2389d276f105 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/bitLength.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/bitLength.cpp @@ -41,7 +41,7 @@ class FunctionParserBitLength : public FunctionParser const ActionsDAG::Node * parse(const substrait::Expression_ScalarFunction & substrait_func, ActionsDAGPtr & actions_dag) const override { // parse bit_length(a) as octet_length(a) * 8 - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 1) throw Exception(DB::ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires exactly one arguments", getName()); diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/checkOverflow.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/checkOverflow.cpp new file mode 100644 index 0000000000000..e5228d1608700 --- /dev/null +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/checkOverflow.cpp @@ -0,0 +1,67 @@ +/* + * 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. + */ +#include +#include + +namespace DB +{ +namespace ErrorCodes +{ + extern const int BAD_ARGUMENTS; +} +} + +namespace local_engine +{ +class SparkFunctionCheckOverflow : public FunctionParser +{ +public: + SparkFunctionCheckOverflow(SerializedPlanParser * plan_parser_) : FunctionParser(plan_parser_) {} + ~SparkFunctionCheckOverflow() override = default; + + static constexpr auto name = "check_overflow"; + String getName() const override { return name; } + String getCHFunctionName(const substrait::Expression_ScalarFunction & func) const override + { + const auto & args = func.arguments(); + if (args.size() < 2) + throw DB::Exception(DB::ErrorCodes::BAD_ARGUMENTS, "check_overflow function requires at least two arguments"); + String ch_function_name = "checkDecimalOverflowSpark"; + auto null_on_overflow = args[1].value().literal().boolean(); + if (null_on_overflow) + ch_function_name += "OrNull"; + return ch_function_name; + } + + const DB::ActionsDAG::Node * parse(const substrait::Expression_ScalarFunction & substrait_func, DB::ActionsDAGPtr & actions_dag) const override + { + DB::ActionsDAG::NodeRawConstPtrs parsed_args; + const auto & args = substrait_func.arguments(); + parsed_args.emplace_back(parseExpression(actions_dag, args[0].value())); + UInt32 precision = substrait_func.output_type().decimal().precision(); + UInt32 scale = substrait_func.output_type().decimal().scale(); + auto uint32_type = std::make_shared(); + parsed_args.emplace_back(addColumnToActionsDAG(actions_dag, uint32_type, precision)); + parsed_args.emplace_back(addColumnToActionsDAG(actions_dag, uint32_type, scale)); + + auto ch_function_name = getCHFunctionName(substrait_func); + const auto * func_node = toFunctionNode(actions_dag, ch_function_name, parsed_args); + return convertNodeTypeIfNeeded(substrait_func, func_node, actions_dag); + } +}; +static FunctionParserRegister register_check_overflow; +} diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/chr.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/chr.cpp index d168e63d11dc6..7b755b1856374 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/chr.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/chr.cpp @@ -39,10 +39,10 @@ class FunctionParserChr : public FunctionParser String getName() const override { return name; } const ActionsDAG::Node * parse( - const substrait::Expression_ScalarFunction & substrait_func, - ActionsDAGPtr & actions_dag) const override + const substrait::Expression_ScalarFunction & substrait_func, + ActionsDAGPtr & actions_dag) const override { - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 1) throw Exception(DB::ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires two or three arguments", getName()); diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/concat.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/concat.cpp index 416fe7741812d..cfafdfd98c377 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/concat.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/concat.cpp @@ -42,6 +42,7 @@ class FunctionParserConcat : public FunctionParser static constexpr auto name = "concat"; String getName() const override { return name; } + String getCHFunctionName(const substrait::Expression_ScalarFunction &) const override { return name; } const ActionsDAG::Node * parse( const substrait::Expression_ScalarFunction & substrait_func, @@ -55,7 +56,7 @@ class FunctionParserConcat : public FunctionParser 2) if args have size 1, return identity(args[0]) 3) otherwise return concat(args) */ - auto args = parseFunctionArguments(substrait_func, "", actions_dag); + auto args = parseFunctionArguments(substrait_func, actions_dag); const auto & output_type = substrait_func.output_type(); const ActionsDAG::Node * result_node = nullptr; if (output_type.has_list()) diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/concatWs.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/concatWs.cpp index d7f9d39b139ad..e2993f1f2d66a 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/concatWs.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/concatWs.cpp @@ -42,6 +42,7 @@ class FunctionParserConcatWS : public FunctionParser static constexpr auto name = "concat_ws"; String getName() const override { return name; } + String getCHFunctionName(const substrait::Expression_ScalarFunction &) const override { return name; } const ActionsDAG::Node * parse( const substrait::Expression_ScalarFunction & substrait_func, @@ -51,7 +52,7 @@ class FunctionParserConcatWS : public FunctionParser parse concat_ws(sep, s1, s2, arr1, arr2, ...)) as arrayStringConcat(arrayFlatten(array(s1), array(s2), arr1, arr2, ...), sep) */ - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.empty()) throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires at least one argument", getName()); diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/cot.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/cot.cpp index 84eaa3ea615af..47750403049ce 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/cot.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/cot.cpp @@ -44,7 +44,7 @@ class FunctionParserCot : public FunctionParser ActionsDAGPtr & actions_dag) const override { /// parse cot(x) as 1 / tan(x) - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 1) throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires exactly one arguments", getName()); diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/csc.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/csc.cpp index b63a76ed5305f..009c1b764f985 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/csc.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/csc.cpp @@ -44,7 +44,7 @@ class FunctionParserCsc : public FunctionParser ActionsDAGPtr & actions_dag) const override { /// parse csc(x) as 1 / sin(x) - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 1) throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires exactly one arguments", getName()); diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/dateFormat.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/dateFormat.cpp new file mode 100644 index 0000000000000..980fdd4cfec06 --- /dev/null +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/dateFormat.cpp @@ -0,0 +1,53 @@ +/* + * 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. + */ +#include +#include + +namespace local_engine +{ +class SparkFunctionDateFormatParser : public FunctionParser +{ +public: + SparkFunctionDateFormatParser(SerializedPlanParser * plan_paser_) : FunctionParser(plan_paser_) {} + ~SparkFunctionDateFormatParser() override = default; + + static constexpr auto name = "date_format"; + String getName() const override { return name; } + String getCHFunctionName(const substrait::Expression_ScalarFunction & func) const override + { + return "formatDateTimeInJodaSyntax"; + } + + const DB::ActionsDAG::Node * parse(const substrait::Expression_ScalarFunction & substrait_func, DB::ActionsDAGPtr & actions_dag) const override + { + DB::ActionsDAG::NodeRawConstPtrs parsed_args; + const auto & args = substrait_func.arguments(); + for (const auto & arg : args) + parsed_args.emplace_back(parseExpression(actions_dag, arg.value())); + /// If the first argument of function formatDateTimeInJodaSyntax is integer, replace formatDateTimeInJodaSyntax with fromUnixTimestampInJodaSyntax + /// to avoid exception + auto ch_function_name = getCHFunctionName(substrait_func); + if (args.size() > 1 && DB::isInteger(parsed_args[0]->result_type)) + ch_function_name = "fromUnixTimestampInJodaSyntax"; + const auto * func_node = toFunctionNode(actions_dag, ch_function_name, parsed_args); + return convertNodeTypeIfNeeded(substrait_func, func_node, actions_dag); + + } +}; +static FunctionParserRegister register_date_format; +} + diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/decode.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/decode.cpp index 212c401156757..48b86ed6b58bf 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/decode.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/decode.cpp @@ -41,11 +41,11 @@ class FunctionParserDecode : public FunctionParser String getName() const override { return name; } const ActionsDAG::Node * parse( - const substrait::Expression_ScalarFunction & substrait_func, - ActionsDAGPtr & actions_dag) const override + const substrait::Expression_ScalarFunction & substrait_func, + ActionsDAGPtr & actions_dag) const override { /// Parse decode(bin, charset) as convertCharset(bin, charset, 'UTF-8') - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 2) throw Exception(DB::ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires exactly two arguments", getName()); diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/elementAt.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/elementAt.cpp index eb369a373bf5d..ce18859174ade 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/elementAt.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/elementAt.cpp @@ -31,7 +31,7 @@ class FunctionParserElementAt : public FunctionParserArrayElement const ActionsDAG::Node * parse(const substrait::Expression_ScalarFunction & substrait_func, ActionsDAGPtr & actions_dag) const override { - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 2) throw Exception(DB::ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires exactly two arguments", getName()); if (isMap(removeNullable(parsed_args[0]->result_type))) diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/elt.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/elt.cpp index 916e16e7b70b5..23f372e5aef86 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/elt.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/elt.cpp @@ -56,7 +56,7 @@ class FunctionParserElt : public FunctionParser else arrayElement(array(e1, e2, e3, ...), index) */ - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() < 2) throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires at least two arguments", getName()); diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/empty2null.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/empty2null.cpp index 557d1e986e77d..081cff67ee447 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/empty2null.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/empty2null.cpp @@ -1,3 +1,19 @@ +/* + * 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. + */ #include #include #include @@ -27,7 +43,7 @@ class FunctionParserEmpty2Null : public FunctionParser const ActionsDAG::Node * parse(const substrait::Expression_ScalarFunction & substrait_func, ActionsDAGPtr & actions_dag) const override { - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 1) throw Exception(ErrorCodes::BAD_ARGUMENTS, "Function {} requires exactly one arguments", getName()); if (parsed_args.at(0)->result_type->getName() != "Nullable(String)") diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/encode.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/encode.cpp index f370c9957f258..2dcbffca2098a 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/encode.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/encode.cpp @@ -41,11 +41,11 @@ class FunctionParserEncode : public FunctionParser String getName() const override { return name; } const ActionsDAG::Node * parse( - const substrait::Expression_ScalarFunction & substrait_func, - ActionsDAGPtr & actions_dag) const override + const substrait::Expression_ScalarFunction & substrait_func, + ActionsDAGPtr & actions_dag) const override { /// Parse encode(str, charset) as convertCharset(str, 'UTF-8', charset) - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 2) throw Exception(DB::ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires exactly two arguments", getName()); diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/equalNullSafe.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/equalNullSafe.cpp index 1ec0df52dce39..d35bf810ffc69 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/equalNullSafe.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/equalNullSafe.cpp @@ -49,7 +49,7 @@ class FunctionParserEqualNullSafe : public FunctionParser /// return false /// else /// return equals(left, right) - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 2) throw Exception(DB::ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires exactly two arguments", getName()); @@ -71,4 +71,4 @@ class FunctionParserEqualNullSafe : public FunctionParser }; static FunctionParserRegister register_equal_null_safe; -} \ No newline at end of file +} diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/expm1.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/expm1.cpp index 7470da62b4243..ef98de6417ff7 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/expm1.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/expm1.cpp @@ -42,7 +42,7 @@ class FunctionParserExpm1 : public FunctionParser ActionsDAGPtr & actions_dag) const override { /// parse expm1(x) as exp(x) - 1 - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 1) throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires exactly one arguments", getName()); diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/extract.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/extract.cpp new file mode 100644 index 0000000000000..43cf1f3a34ef1 --- /dev/null +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/extract.cpp @@ -0,0 +1,126 @@ +/* + * 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. + */ +#include +#include +#include +#include + +namespace DB::ErrorCodes +{ + extern const int BAD_ARGUMENTS; +} + +namespace local_engine +{ +class SparkFunctionExtractParser : public FunctionParser +{ +public: + SparkFunctionExtractParser(SerializedPlanParser * plan_parser_) : FunctionParser(plan_parser_) {} + ~SparkFunctionExtractParser() override = default; + + static constexpr auto name = "extract"; + String getName() const override { return name; } + + String getCHFunctionName(const substrait::Expression_ScalarFunction & func) const override + { + const auto & args = func.arguments(); + if (args.size() != 2) + throw DB::Exception(DB::ErrorCodes::BAD_ARGUMENTS, "Spark function extract requires two args, function:{}", func.ShortDebugString()); + const auto & extract_field = args.at(0); + String ch_function_name = ""; + if (extract_field.value().has_literal()) + { + const auto & field_value = extract_field.value().literal().string(); + if (field_value == "YEAR") + ch_function_name = "toYear"; // spark: extract(YEAR FROM) or year + else if (field_value == "YEAR_OF_WEEK") + ch_function_name = "toISOYear"; // spark: extract(YEAROFWEEK FROM) + else if (field_value == "QUARTER") + ch_function_name = "toQuarter"; // spark: extract(QUARTER FROM) or quarter + else if (field_value == "MONTH") + ch_function_name = "toMonth"; // spark: extract(MONTH FROM) or month + else if (field_value == "WEEK_OF_YEAR") + ch_function_name = "toISOWeek"; // spark: extract(WEEK FROM) or weekofyear + else if (field_value == "WEEK_DAY") + /// Spark WeekDay(date) (0 = Monday, 1 = Tuesday, ..., 6 = Sunday) + /// Substrait: extract(WEEK_DAY from date) + /// CH: toDayOfWeek(date, 1) + ch_function_name = "toDayOfWeek"; + else if (field_value == "DAY_OF_WEEK") + /// Spark: DayOfWeek(date) (1 = Sunday, 2 = Monday, ..., 7 = Saturday) + /// Substrait: extract(DAY_OF_WEEK from date) + /// CH: toDayOfWeek(date, 3) + /// DAYOFWEEK is alias of function toDayOfWeek. + /// This trick is to distinguish between extract fields DAY_OF_WEEK and WEEK_DAY in latter codes + ch_function_name = "DAYOFWEEK"; + else if (field_value == "DAY") + ch_function_name = "toDayOfMonth"; // spark: extract(DAY FROM) or dayofmonth + else if (field_value == "DAY_OF_YEAR") + ch_function_name = "toDayOfYear"; // spark: extract(DOY FROM) or dayofyear + else if (field_value == "HOUR") + ch_function_name = "toHour"; // spark: extract(HOUR FROM) or hour + else if (field_value == "MINUTE") + ch_function_name = "toMinute"; // spark: extract(MINUTE FROM) or minute + else if (field_value == "SECOND") + ch_function_name = "toSecond"; // spark: extract(SECOND FROM) or secondwithfraction + } + + if (ch_function_name.empty()) + throw DB::Exception(DB::ErrorCodes::BAD_ARGUMENTS, "The first arg of spark extract function is wrong."); + return ch_function_name; + } + + const DB::ActionsDAG::Node * parse(const substrait::Expression_ScalarFunction & substrait_func, DB::ActionsDAGPtr & actions_dag) const override + { + DB::ActionsDAG::NodeRawConstPtrs parsed_args; + auto ch_function_name = getCHFunctionName(substrait_func); + const auto & args = substrait_func.arguments(); + + /// Skip the first arg of extract in substrait + for (int i = 1; i < args.size(); i++) + parsed_args.emplace_back(parseExpression(actions_dag, args[i].value())); + + /// Append extra mode argument for extract(WEEK_DAY from date) or extract(DAY_OF_WEEK from date) in substrait + if (ch_function_name == "toDayOfWeek" || ch_function_name == "DAYOFWEEK") + { + UInt8 mode = ch_function_name == "toDayOfWeek" ? 1 : 3; + auto mode_type = std::make_shared(); + parsed_args.emplace_back(addColumnToActionsDAG(actions_dag, mode_type, mode)); + } + + const DB::ActionsDAG::Node * func_node = nullptr; + if (ch_function_name == "toYear") + { + auto arg_func_name = parsed_args[0]->function ? parsed_args[0]->function->getName() : ""; + if (arg_func_name == "sparkToDate" || arg_func_name == "sparkToDateTime" && parsed_args[0]->children.size() > 0) + { + const auto * child_node = parsed_args[0]->children[0]; + if (child_node && DB::isString(DB::removeNullable(child_node->result_type))) + { + func_node = toFunctionNode(actions_dag, "sparkExtractYear", {child_node}); + } + } + } + + if (!func_node) + func_node = toFunctionNode(actions_dag, ch_function_name, parsed_args); + return convertNodeTypeIfNeeded(substrait_func, func_node, actions_dag); + } +}; +static FunctionParserRegister register_extract; +} + diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/factorial.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/factorial.cpp index c2f0a383b4efc..f1ef4ec8b9bae 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/factorial.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/factorial.cpp @@ -46,7 +46,7 @@ class FunctionParserFactorial : public FunctionParser ActionsDAGPtr & actions_dag) const override { /// parse factorial(x) as if (x > 20 || x < 0) null else factorial(x) - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 1) throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires exactly one arguments", getName()); diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/findInset.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/findInset.cpp index b297d7a67f665..3453431199638 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/findInset.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/findInset.cpp @@ -55,7 +55,7 @@ class FunctionParserFindInSet : public FunctionParser null else indexOf(assumeNotNull(splitByChar(',', str_array)), str) */ - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 2) throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires exactly two arguments", getName()); diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/fromJson.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/fromJson.cpp new file mode 100644 index 0000000000000..2dd8754189b70 --- /dev/null +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/fromJson.cpp @@ -0,0 +1,50 @@ +/* + * 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. + */ +#include +#include +#include +#include + +namespace local_engine +{ +class SparkFunctionFromJsonParser : public FunctionParser +{ +public: + SparkFunctionFromJsonParser(SerializedPlanParser * plan_parser_) : FunctionParser(plan_parser_) {} + ~SparkFunctionFromJsonParser() override = default; + + static constexpr auto name = "from_json"; + String getName() const override { return name; } + String getCHFunctionName(const substrait::Expression_ScalarFunction & /*func*/) const override + { + return "JSONExtract"; + } + + const DB::ActionsDAG::Node * parse(const substrait::Expression_ScalarFunction & substrait_func, DB::ActionsDAGPtr & actions_dag) const override + { + DB::ActionsDAG::NodeRawConstPtrs parsed_args; + auto ch_function_name = getCHFunctionName(substrait_func); + parsed_args.emplace_back(parseExpression(actions_dag, substrait_func.arguments()[0].value())); + auto data_type = TypeParser::parseType(substrait_func.output_type()); + parsed_args.emplace_back(addColumnToActionsDAG(actions_dag, std::make_shared(), data_type->getName())); + const auto * func_node = toFunctionNode(actions_dag, ch_function_name, parsed_args); + return convertNodeTypeIfNeeded(substrait_func, func_node, actions_dag); + } +}; +static FunctionParserRegister register_from_json; +} + diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/getJSONObject.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/getJSONObject.cpp index 5757cb7d6f457..aad75130aa476 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/getJSONObject.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/getJSONObject.cpp @@ -41,7 +41,6 @@ class GetJSONObjectParser : public FunctionParser ~GetJSONObjectParser() override = default; String getName() const override { return name; } -protected: String getCHFunctionName(const substrait::Expression_ScalarFunction & scalar_function) const override { const auto & args = scalar_function.arguments(); @@ -53,16 +52,16 @@ class GetJSONObjectParser : public FunctionParser return name; } +protected: /// Force to reuse the same flatten json column node DB::ActionsDAG::NodeRawConstPtrs parseFunctionArguments( const substrait::Expression_ScalarFunction & substrait_func, - const String & ch_func_name, DB::ActionsDAGPtr & actions_dag) const override { const auto & args = substrait_func.arguments(); if (args.size() != 2) { - throw DB::Exception(DB::ErrorCodes::BAD_ARGUMENTS, "Function {} requires 2 arguments", ch_func_name); + throw DB::Exception(DB::ErrorCodes::BAD_ARGUMENTS, "Function {} requires 2 arguments", getCHFunctionName(substrait_func)); } if (args[0].value().has_scalar_function() && args[0].value().scalar_function().function_reference() == SelfDefinedFunctionReference::GET_JSON_OBJECT) diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/isNaN.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/isNaN.cpp new file mode 100644 index 0000000000000..3409c61d4651c --- /dev/null +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/isNaN.cpp @@ -0,0 +1,64 @@ +/* + * 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. + */ +#include +#include +#include +#include +#include +#include + +namespace local_engine +{ +class SparkFunctionIsNaNParser : public FunctionParser +{ +public: + SparkFunctionIsNaNParser(SerializedPlanParser * plan_parser_) : FunctionParser(plan_parser_) {} + ~SparkFunctionIsNaNParser() override = default; + + static constexpr auto name = "isnan"; + String getName() const override { return name; } + String getCHFunctionName(const substrait::Expression_ScalarFunction &) const override { return "isNaN"; } + + const DB::ActionsDAG::Node * parse(const substrait::Expression_ScalarFunction & substrait_func, DB::ActionsDAGPtr & actions_dag) const override + { + // the result of isNaN(NULL) is NULL in CH, but false in Spark + DB::ActionsDAG::NodeRawConstPtrs parsed_args; + auto ch_function_name = getCHFunctionName(substrait_func); + const auto & args = substrait_func.arguments(); + const DB::ActionsDAG::Node * arg_node = nullptr; + if (args[0].value().has_cast()) + { + arg_node = parseExpression(actions_dag, args[0].value().cast().input()); + auto result_type = DB::removeNullable(arg_node->result_type); + if (DB::isString(*result_type)) + arg_node = toFunctionNode(actions_dag, "toFloat64OrZero", {arg_node}); + else + arg_node = parseExpression(actions_dag, args[0].value()); + } + else + arg_node = parseExpression(actions_dag, args[0].value()); + + DB::ActionsDAG::NodeRawConstPtrs ifnull_args = {arg_node, addColumnToActionsDAG(actions_dag, std::make_shared(), 0)}; + parsed_args.emplace_back(toFunctionNode(actions_dag, "IfNull", ifnull_args)); + + const auto * func_node = toFunctionNode(actions_dag, ch_function_name, parsed_args); + return convertNodeTypeIfNeeded(substrait_func, func_node, actions_dag); + } +}; +static FunctionParserRegister register_isnan; +} + diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/lambdaFunction.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/lambdaFunction.cpp new file mode 100644 index 0000000000000..6647b82b95666 --- /dev/null +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/lambdaFunction.cpp @@ -0,0 +1,220 @@ +/* + * 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. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace DB::ErrorCodes +{ + extern const int LOGICAL_ERROR; +} + +namespace local_engine +{ +DB::NamesAndTypesList collectLambdaArguments(const SerializedPlanParser & plan_parser_, const substrait::Expression_ScalarFunction & substrait_func) +{ + DB::NamesAndTypesList lambda_arguments; + std::unordered_set collected_names; + + for (const auto & arg : substrait_func.arguments()) + { + if (arg.value().has_scalar_function() + && plan_parser_.getFunctionSignatureName(arg.value().scalar_function().function_reference()) == "namedlambdavariable") + { + auto [_, col_name_field] = plan_parser_.parseLiteral(arg.value().scalar_function().arguments()[0].value().literal()); + String col_name = col_name_field.get(); + if (collected_names.contains(col_name)) + { + continue; + } + collected_names.insert(col_name); + auto type = TypeParser::parseType(arg.value().scalar_function().output_type()); + lambda_arguments.emplace_back(col_name, type); + } + } + return lambda_arguments; +} + +/// Refer to `PlannerActionsVisitorImpl::visitLambda` for how to build a lambda function node. +class LambdaFunction : public FunctionParser +{ +public: + static constexpr auto name = "lambdafunction"; + explicit LambdaFunction(SerializedPlanParser * plan_parser_) : FunctionParser(plan_parser_) {} + ~LambdaFunction() override = default; + + String getName() const override { return name; } + + String getCHFunctionName(const substrait::Expression_ScalarFunction & scalar_function) const override + { + throw DB::Exception(DB::ErrorCodes::LOGICAL_ERROR, "getCHFunctionName is not implemented for LambdaFunction"); + } + + const DB::ActionsDAG::Node * parse(const substrait::Expression_ScalarFunction & substrait_func, DB::ActionsDAGPtr & actions_dag) const override + { + /// Some special cases, for example, `transform(arr, x -> concat(arr, array(x)))` refers to + /// a column `arr` out of it directly. We need a `arr` as an input column for `lambda_actions_dag` + DB::NamesAndTypesList parent_header; + for (const auto * output_node : actions_dag->getOutputs()) + { + parent_header.emplace_back(output_node->result_name, output_node->result_type); + } + auto lambda_actions_dag = std::make_shared(parent_header); + + /// The first argument is the lambda function body, followings are the lambda arguments which is + /// needed by the lambda function body. + /// There could be a nested lambda function in the lambda function body, and it refer a variable from + /// this outside lambda function's arguments. For an example, transform(number, x -> transform(letter, y -> struct(x, y))). + /// Before parsing the lambda function body, we add lambda function arguments int actions dag at first. + for (size_t i = 1; i < substrait_func.arguments().size(); ++i) + { + (void)parseExpression(lambda_actions_dag, substrait_func.arguments()[i].value()); + } + const auto & substrait_lambda_body = substrait_func.arguments()[0].value(); + const auto * lambda_body_node = parseExpression(lambda_actions_dag, substrait_lambda_body); + lambda_actions_dag->getOutputs().push_back(lambda_body_node); + lambda_actions_dag->removeUnusedActions(Names(1, lambda_body_node->result_name)); + + auto expression_actions_settings = DB::ExpressionActionsSettings::fromContext(getContext(), DB::CompileExpressions::yes); + auto lambda_actions = std::make_shared(lambda_actions_dag, expression_actions_settings); + + DB::Names captured_column_names; + DB::Names required_column_names = lambda_actions->getRequiredColumns(); + DB::ActionsDAG::NodeRawConstPtrs lambda_children; + auto lambda_function_args = collectLambdaArguments(*plan_parser, substrait_func); + const auto & lambda_actions_inputs = lambda_actions_dag->getInputs(); + + std::unordered_map parent_nodes; + for (const auto & node : actions_dag->getNodes()) + { + parent_nodes[node.result_name] = &node; + } + for (const auto & required_column_name : required_column_names) + { + if (std::find_if( + lambda_function_args.begin(), + lambda_function_args.end(), + [&required_column_name](const DB::NameAndTypePair & name_type) { return name_type.name == required_column_name; }) + == lambda_function_args.end()) + { + auto it = std::find_if( + lambda_actions_inputs.begin(), + lambda_actions_inputs.end(), + [&required_column_name](const auto & node) { return node->result_name == required_column_name; }); + if (it == lambda_actions_inputs.end()) + { + throw DB::Exception(DB::ErrorCodes::LOGICAL_ERROR, "Required column not found: {}", required_column_name); + } + auto parent_node_it = parent_nodes.find(required_column_name); + if (parent_node_it == parent_nodes.end()) + { + throw DB::Exception(DB::ErrorCodes::LOGICAL_ERROR, "Not found column {} in actions dag:\n{}", + required_column_name, + actions_dag->dumpDAG()); + } + /// The nodes must be the ones in `actions_dag`, otherwise `ActionsDAG::evaluatePartialResult` will fail. Because nodes may have the + /// same name but their addresses are different. + lambda_children.push_back(parent_node_it->second); + captured_column_names.push_back(required_column_name); + } + } + + auto function_capture = std::make_shared( + lambda_actions, + captured_column_names, + lambda_function_args, + lambda_body_node->result_type, + lambda_body_node->result_name); + + const auto * result = &actions_dag->addFunction(function_capture, lambda_children, lambda_body_node->result_name); + return result; + } +protected: + DB::ActionsDAG::NodeRawConstPtrs parseFunctionArguments( + const substrait::Expression_ScalarFunction & substrait_func, + DB::ActionsDAGPtr & actions_dag) const override + { + throw DB::Exception(DB::ErrorCodes::LOGICAL_ERROR, "parseFunctionArguments is not implemented for LambdaFunction"); + } + + const DB::ActionsDAG::Node * convertNodeTypeIfNeeded( + const substrait::Expression_ScalarFunction & substrait_func, + const DB::ActionsDAG::Node * func_node, + DB::ActionsDAGPtr & actions_dag) const override + { + throw DB::Exception(DB::ErrorCodes::LOGICAL_ERROR, "convertNodeTypeIfNeeded is not implemented for NamedLambdaVariable"); + } +}; + +static FunctionParserRegister register_lambda_function; + + +class NamedLambdaVariable : public FunctionParser +{ +public: + static constexpr auto name = "namedlambdavariable"; + explicit NamedLambdaVariable(SerializedPlanParser * plan_parser_) : FunctionParser(plan_parser_) {} + ~NamedLambdaVariable() override = default; + + String getName() const override { return name; } + + String getCHFunctionName(const substrait::Expression_ScalarFunction & scalar_function) const override + { + throw DB::Exception(DB::ErrorCodes::LOGICAL_ERROR, "getCHFunctionName is not implemented for NamedLambdaVariable"); + } + + const DB::ActionsDAG::Node * parse(const substrait::Expression_ScalarFunction & substrait_func, DB::ActionsDAGPtr & actions_dag) const override + { + auto [_, col_name_field] = parseLiteral(substrait_func.arguments()[0].value().literal()); + String col_name = col_name_field.get(); + + auto type = TypeParser::parseType(substrait_func.output_type()); + const auto & inputs = actions_dag->getInputs(); + auto it = std::find_if(inputs.begin(), inputs.end(), [&col_name](const auto * node) { return node->result_name == col_name; }); + if (it == inputs.end()) + { + return &(actions_dag->addInput(col_name, type)); + } + return *it; + } +protected: + DB::ActionsDAG::NodeRawConstPtrs parseFunctionArguments( + const substrait::Expression_ScalarFunction & substrait_func, + DB::ActionsDAGPtr & actions_dag) const override + { + throw DB::Exception(DB::ErrorCodes::LOGICAL_ERROR, "parseFunctionArguments is not implemented for NamedLambdaVariable"); + } + + const DB::ActionsDAG::Node * convertNodeTypeIfNeeded( + const substrait::Expression_ScalarFunction & substrait_func, + const DB::ActionsDAG::Node * func_node, + DB::ActionsDAGPtr & actions_dag) const override + { + throw DB::Exception(DB::ErrorCodes::LOGICAL_ERROR, "convertNodeTypeIfNeeded is not implemented for NamedLambdaVariable"); + } +}; + +static FunctionParserRegister register_named_lambda_variable; + +} diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/lambdaFunction.h b/cpp-ch/local-engine/Parser/scalar_function_parser/lambdaFunction.h new file mode 100644 index 0000000000000..327c72ade47c1 --- /dev/null +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/lambdaFunction.h @@ -0,0 +1,23 @@ +/* + * 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. + */ +#pragma once +#include +#include +namespace local_engine +{ +DB::NamesAndTypesList collectLambdaArguments(const SerializedPlanParser & plan_parser_, const substrait::Expression_ScalarFunction & substrait_func); +} diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/length.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/length.cpp index 85fe1f29aa253..af998d4d2e69b 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/length.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/length.cpp @@ -47,7 +47,7 @@ class FunctionParserLength : public FunctionParser else length(a) as char_length(a) */ - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 1) throw Exception(DB::ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires exactly one arguments", getName()); diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/locate.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/locate.cpp index bc9ea41f853a8..efc6da7c4659d 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/locate.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/locate.cpp @@ -44,7 +44,7 @@ class FunctionParserLocate : public FunctionParser const ActionsDAG::Node * parse(const substrait::Expression_ScalarFunction & substrait_func, ActionsDAGPtr & actions_dag) const override { /// Parse locate(substr, str, start_pos) as if(isNull(start_pos), 0, positionUTF8Spark(str, substr, start_pos) - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 3) throw Exception(DB::ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires exactly three arguments", getName()); diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/log.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/log.cpp index bafca3b213d71..75a6894597f52 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/log.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/log.cpp @@ -53,7 +53,7 @@ class FunctionParserLog : public FunctionParser else ln(y) / ln(x) */ - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 2) throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires exactly two arguments", getName()); diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/logarithm.h b/cpp-ch/local-engine/Parser/scalar_function_parser/logarithm.h index 2a879623ad889..7a83d78fa8459 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/logarithm.h +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/logarithm.h @@ -52,7 +52,7 @@ class FunctionParserLogBase : public FunctionParser else log(x) */ - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 1) throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires exactly one arguments", getName()); diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/makeDecimal.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/makeDecimal.cpp new file mode 100644 index 0000000000000..977167ef36015 --- /dev/null +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/makeDecimal.cpp @@ -0,0 +1,66 @@ +/* + * 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. + */ +#include +#include + +namespace DB +{ +namespace ErrorCodes +{ + extern const int BAD_ARGUMENTS; +} +} + +namespace local_engine +{ +class SparkFunctionMakeDecimalParser : public FunctionParser +{ +public: + SparkFunctionMakeDecimalParser(SerializedPlanParser * plan_parser_) : FunctionParser(plan_parser_) {} + ~SparkFunctionMakeDecimalParser() override = default; + + static constexpr auto name = "make_decimal"; + String getName() const override { return name; } + String getCHFunctionName(const substrait::Expression_ScalarFunction & func) const override + { + const auto & args = func.arguments(); + if (args.size() < 2) + throw DB::Exception(DB::ErrorCodes::BAD_ARGUMENTS, "make_decimal function requires at least two arguments"); + String ch_function_name = "makeDecimalSpark"; + if (args[1].value().literal().boolean()) + ch_function_name += "OrNull"; + return ch_function_name; + } + + const DB::ActionsDAG::Node * parse(const substrait::Expression_ScalarFunction & substrait_func, DB::ActionsDAGPtr & actions_dag) const override + { + DB::ActionsDAG::NodeRawConstPtrs parsed_args; + const auto & args = substrait_func.arguments(); + parsed_args.emplace_back(parseExpression(actions_dag, args[0].value())); + UInt32 precision = substrait_func.output_type().decimal().precision(); + UInt32 scale = substrait_func.output_type().decimal().scale(); + auto uint32_type = std::make_shared(); + parsed_args.emplace_back(addColumnToActionsDAG(actions_dag, uint32_type, precision)); + parsed_args.emplace_back(addColumnToActionsDAG(actions_dag, uint32_type, scale)); + + auto ch_function_name = getCHFunctionName(substrait_func); + const auto * func_node = toFunctionNode(actions_dag, ch_function_name, parsed_args); + return convertNodeTypeIfNeeded(substrait_func, func_node, actions_dag); + } +}; +static FunctionParserRegister register_make_decimal; +} diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/md5.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/md5.cpp index 84d497fa90ea7..c57197e70d0b6 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/md5.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/md5.cpp @@ -43,7 +43,7 @@ class FunctionParserMd5 : public FunctionParser const ActionsDAG::Node * parse(const substrait::Expression_ScalarFunction & substrait_func, ActionsDAGPtr & actions_dag) const override { /// Parse md5(str) as lower(hex(md5(str))) - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 1) throw Exception(DB::ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires exactly one arguments", getName()); diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/nanvl.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/nanvl.cpp index 010f3eef32b52..d8f29d7275764 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/nanvl.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/nanvl.cpp @@ -55,7 +55,7 @@ class FunctionParserNaNvl : public FunctionParser else e1 */ - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 2) throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires at least two arguments", getName()); diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/octetLength.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/octetLength.cpp index 52cbd03172906..d2c159a1b69e9 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/octetLength.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/octetLength.cpp @@ -40,7 +40,7 @@ class FunctionParserOctetLength : public FunctionParser const ActionsDAG::Node * parse(const substrait::Expression_ScalarFunction & substrait_func, ActionsDAGPtr & actions_dag) const override { - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 1) throw Exception(DB::ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires exactly one arguments", getName()); diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/parseUrl.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/parseUrl.cpp index ed30b0727f5d1..af573367448fa 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/parseUrl.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/parseUrl.cpp @@ -99,7 +99,7 @@ String ParseURLParser::selectCHFunctionName(const substrait::Expression_ScalarFu } DB::ActionsDAG::NodeRawConstPtrs ParseURLParser::parseFunctionArguments( - const substrait::Expression_ScalarFunction & substrait_func, const String & /*ch_func_name*/, DB::ActionsDAGPtr & actions_dag) const + const substrait::Expression_ScalarFunction & substrait_func, DB::ActionsDAGPtr & actions_dag) const { DB::ActionsDAG::NodeRawConstPtrs arg_nodes; arg_nodes.push_back(parseExpression(actions_dag, substrait_func.arguments(0).value())); diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/parseUrl.h b/cpp-ch/local-engine/Parser/scalar_function_parser/parseUrl.h index 9d8aae8e21a6c..a4d6e0f057ea3 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/parseUrl.h +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/parseUrl.h @@ -26,12 +26,11 @@ class ParseURLParser final : public FunctionParser ~ParseURLParser() override = default; String getName() const override { return name; } -protected: String getCHFunctionName(const substrait::Expression_ScalarFunction & substrait_func) const override; +protected: DB::ActionsDAG::NodeRawConstPtrs parseFunctionArguments( const substrait::Expression_ScalarFunction & substrait_func, - const String & ch_func_name, DB::ActionsDAGPtr & actions_dag) const override; const DB::ActionsDAG::Node * convertNodeTypeIfNeeded( diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/regexp_extract.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/regexp_extract.cpp index 8f75baf689b26..ba30a3c59e4ca 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/regexp_extract.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/regexp_extract.cpp @@ -61,7 +61,7 @@ class FunctionParserRegexpExtract : public FunctionParser String sparkRegexp = adjustSparkRegexpRule(expr_str); const auto * regex_expr_node = addColumnToActionsDAG(actions_dag, std::make_shared(), sparkRegexp); - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); parsed_args[1] = regex_expr_node; const auto * result_node = toFunctionNode(actions_dag, "regexpExtract", parsed_args); return convertNodeTypeIfNeeded(substrait_func, result_node, actions_dag); diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/repeat.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/repeat.cpp new file mode 100644 index 0000000000000..cc32fc0155357 --- /dev/null +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/repeat.cpp @@ -0,0 +1,53 @@ +/* + * 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. + */ +#include +#include +#include +#include +#include +#include + +namespace local_engine +{ +class SparkFunctionRepeatParser : public FunctionParser +{ +public: + SparkFunctionRepeatParser(SerializedPlanParser * plan_parser_) : FunctionParser(plan_parser_) {} + ~SparkFunctionRepeatParser() override = default; + + static constexpr auto name = "repeat"; + String getName() const override { return name; } + String getCHFunctionName(const substrait::Expression_ScalarFunction &) const override { return name; } + + const DB::ActionsDAG::Node * parse(const substrait::Expression_ScalarFunction & substrait_func, DB::ActionsDAGPtr & actions_dag) const override + { + // repeat. the field index must be unsigned integer in CH, cast the signed integer in substrait + // which must be a positive value into unsigned integer here. + DB::ActionsDAG::NodeRawConstPtrs parsed_args; + auto ch_function_name = getCHFunctionName(substrait_func); + const auto & args = substrait_func.arguments(); + parsed_args.emplace_back(parseExpression(actions_dag, args[0].value())); + const auto * repeat_times_node = parseExpression(actions_dag, args[1].value()); + DB::DataTypeNullable target_type(std::make_shared()); + repeat_times_node = ActionsDAGUtil::convertNodeType(actions_dag, repeat_times_node, target_type.getName()); + parsed_args.emplace_back(repeat_times_node); + const auto * func_node = toFunctionNode(actions_dag, ch_function_name, parsed_args); + return convertNodeTypeIfNeeded(substrait_func, func_node, actions_dag); + } +}; +static FunctionParserRegister register_repeat; +} diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/reverse.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/reverse.cpp new file mode 100644 index 0000000000000..86406c4339597 --- /dev/null +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/reverse.cpp @@ -0,0 +1,46 @@ +/* + * 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. + */ +#include +#include + +namespace DB +{ +namespace ErrorCodes +{ + extern const int BAD_ARGUMENTS; +} +} + +namespace local_engine +{ +class SparkFunctionReverseParser : public FunctionParser +{ +public: + SparkFunctionReverseParser(SerializedPlanParser * plan_parser_) : FunctionParser(plan_parser_) {} + ~SparkFunctionReverseParser() override = default; + + static constexpr auto name = "reverse"; + String getName() const override { return name; } + String getCHFunctionName(const substrait::Expression_ScalarFunction & func) const override + { + if (func.output_type().has_list()) + return "arrayReverse"; + return "reverseUTF8"; + } +}; +static FunctionParserRegister register_reverse; +} diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/sec.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/sec.cpp index 70765e07d0370..4b95bcbe530f4 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/sec.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/sec.cpp @@ -44,7 +44,7 @@ class FunctionParserSec : public FunctionParser ActionsDAGPtr & actions_dag) const override { /// parse sec(x) as 1 / cos(x) - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 1) throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires exactly one arguments", getName()); diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/sequence.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/sequence.cpp index 373bd53132b33..0e98759f6c7fe 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/sequence.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/sequence.cpp @@ -61,7 +61,7 @@ class FunctionParserSequence : public FunctionParser step = if(start <= end, 1, -1) */ - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() < 2 || parsed_args.size() > 3) throw Exception(DB::ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires two or three arguments", getName()); diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/sha1.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/sha1.cpp index 4e7872c9633e5..eb7578a3f4b65 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/sha1.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/sha1.cpp @@ -43,7 +43,7 @@ class FunctionParserSha1 : public FunctionParser const ActionsDAG::Node * parse(const substrait::Expression_ScalarFunction & substrait_func, ActionsDAGPtr & actions_dag) const override { /// Parse sha1(str) as lower(hex(sha1(str))) - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 1) throw Exception(DB::ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires exactly one arguments", getName()); diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/sha2.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/sha2.cpp index 139d49936964e..75db4cd173fd6 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/sha2.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/sha2.cpp @@ -47,7 +47,7 @@ class FunctionParserSha2 : public FunctionParser /// Parse sha2(str, 224) as lower(hex(SHA224(str))) /// Parse sha2(str, 384) as lower(hex(SHA384(str))) /// Parse sha2(str, 512) as lower(hex(SHA512(str))) - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 2) throw Exception(DB::ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires exactly two arguments", getName()); diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/shiftRightUnsigned.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/shiftRightUnsigned.cpp index b638e234fbc54..e0932e621b758 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/shiftRightUnsigned.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/shiftRightUnsigned.cpp @@ -49,7 +49,7 @@ class FunctionParserShiftRightUnsigned : public FunctionParser /// else /// throw Exception - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 2) throw Exception(DB::ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires exactly two arguments", getName()); diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/size.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/size.cpp index 544da96f92cc0..09db14ced0f09 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/size.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/size.cpp @@ -44,7 +44,7 @@ class FunctionParserSize : public FunctionParser { /// Parse size(child, true) as ifNull(length(child), -1) /// Parse size(child, false) as length(child) - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 2) throw Exception(DB::ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires exactly two arguments", getName()); diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/slice.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/slice.cpp index 3fd26a41f6b37..2dca0cee182e2 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/slice.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/slice.cpp @@ -60,7 +60,7 @@ class FunctionParserArraySlice : public FunctionParser 2. Spark slice returns null if any of the argument is null */ - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 3) throw Exception(ErrorCodes::BAD_ARGUMENTS, "Function {} requires exactly three arguments", getName()); diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/sortArray.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/sortArray.cpp index 85416bd71864b..3386b642fa21a 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/sortArray.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/sortArray.cpp @@ -45,15 +45,15 @@ class FunctionParserSortArray : public FunctionParser const substrait::Expression_ScalarFunction & substrait_func, ActionsDAGPtr & actions_dag) const override { - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 2) throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires exactly two arguments", getName()); const auto * array_arg = parsed_args[0]; const auto * order_arg = parsed_args[1]; - const auto * sort_node = toFunctionNode(actions_dag, "arraySortSpark", {array_arg}); - const auto * reverse_sort_node = toFunctionNode(actions_dag, "arrayReverseSortSpark", {array_arg}); + const auto * sort_node = toFunctionNode(actions_dag, "sortArraySpark", {array_arg}); + const auto * reverse_sort_node = toFunctionNode(actions_dag, "reverseSortArraySpark", {array_arg}); const auto * result_node = toFunctionNode(actions_dag, "if", {order_arg, sort_node, reverse_sort_node}); return result_node; diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/space.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/space.cpp new file mode 100644 index 0000000000000..3698ddad78cfa --- /dev/null +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/space.cpp @@ -0,0 +1,50 @@ +/* + * 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. + */ +#include +#include +#include +#include +#include + +namespace local_engine +{ +class SparkFunctionSpaceParser : public FunctionParser +{ +public: + SparkFunctionSpaceParser(SerializedPlanParser * plan_parser_) : FunctionParser(plan_parser_) {} + ~SparkFunctionSpaceParser() override = default; + + static constexpr auto name = "space"; + String getName() const override { return name; } + String getCHFunctionName(const substrait::Expression_ScalarFunction &) const override { return "repeat"; } + + const DB::ActionsDAG::Node * parse(const substrait::Expression_ScalarFunction & substrait_func, DB::ActionsDAGPtr & actions_dag) const override + { + // convert space function to repeat + DB::ActionsDAG::NodeRawConstPtrs parsed_args; + auto ch_function_name = getCHFunctionName(substrait_func); + const auto & args = substrait_func.arguments(); + + const auto * repeat_times_node = parseExpression(actions_dag, args[0].value()); + const auto * space_str_node = addColumnToActionsDAG(actions_dag, std::make_shared(), " "); + parsed_args = {space_str_node, repeat_times_node}; + const auto * func_node = toFunctionNode(actions_dag, ch_function_name, parsed_args); + return convertNodeTypeIfNeeded(substrait_func, func_node, actions_dag); + } +}; +static FunctionParserRegister register_space; +} diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/split.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/split.cpp new file mode 100644 index 0000000000000..05749da895528 --- /dev/null +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/split.cpp @@ -0,0 +1,48 @@ +/* + * 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. + */ +#include +#include + +namespace local_engine +{ +class SparkFunctionSplitParser : public FunctionParser +{ +public: + SparkFunctionSplitParser(SerializedPlanParser * plan_paser_) : FunctionParser(plan_paser_) {} + ~SparkFunctionSplitParser() override = default; + static constexpr auto name = "split"; + String getName() const override { return name; } + String getCHFunctionName(const substrait::Expression_ScalarFunction &) const override { return "splitByRegexp"; } + + const DB::ActionsDAG::Node * parse(const substrait::Expression_ScalarFunction & substrait_func, DB::ActionsDAGPtr & actions_dag) const override + { + DB::ActionsDAG::NodeRawConstPtrs parsed_args; + const auto & args = substrait_func.arguments(); + for (const auto & arg : args) + parsed_args.emplace_back(parseExpression(actions_dag, arg.value())); + /// In Spark: split(str, regex [, limit] ) + /// In CH: splitByRegexp(regexp, str [, limit]) + if (parsed_args.size() >= 2) + std::swap(parsed_args[0], parsed_args[1]); + auto ch_function_name = getCHFunctionName(substrait_func); + const auto * func_node = toFunctionNode(actions_dag, ch_function_name, parsed_args); + return convertNodeTypeIfNeeded(substrait_func, func_node, actions_dag); + } +}; +static FunctionParserRegister register_split; +} + diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/substring.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/substring.cpp index 550e77344ddf3..444213973cb23 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/substring.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/substring.cpp @@ -42,7 +42,7 @@ class FunctionParserSubstring : public FunctionParser const substrait::Expression_ScalarFunction & substrait_func, ActionsDAGPtr & actions_dag) const override { - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 3) throw Exception(DB::ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires two or three arguments", getName()); @@ -64,7 +64,7 @@ class FunctionParserSubstring : public FunctionParser const auto * substring_func_node = toFunctionNode(actions_dag, "substringUTF8", {str_arg, if_node, if_len_node}); return convertNodeTypeIfNeeded(substrait_func, substring_func_node, actions_dag); } -protected: + String getCHFunctionName(const substrait::Expression_ScalarFunction & /*substrait_func*/) const override { return "substringUTF8"; diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/timestampAdd.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/timestampAdd.cpp index d76431c0a0964..af81e2bd7455b 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/timestampAdd.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/timestampAdd.cpp @@ -42,27 +42,32 @@ class FunctionParserTimestampAdd : public FunctionParser static constexpr auto name = "timestamp_add"; String getName() const override { return name; } + String getCHFunctionName(const substrait::Expression_ScalarFunction &) const override { return "timestamp_add"; } const ActionsDAG::Node * parse(const substrait::Expression_ScalarFunction & substrait_func, ActionsDAGPtr & actions_dag) const override { - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); - if (parsed_args.size() != 4) - throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires exactly four arguments", getName()); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); + if (parsed_args.size() < 3) + throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires at least three arguments", getName()); const auto & unit_field = substrait_func.arguments().at(0); if (!unit_field.value().has_literal() || !unit_field.value().literal().has_string()) throw Exception( ErrorCodes::BAD_ARGUMENTS, "Unsupported unit argument, should be a string literal, but: {}", unit_field.DebugString()); - const auto & timezone_field = substrait_func.arguments().at(3); - if (!timezone_field.value().has_literal() || !timezone_field.value().literal().has_string()) + String timezone; + if (parsed_args.size() == 4) + { + const auto & timezone_field = substrait_func.arguments().at(3); + if (!timezone_field.value().has_literal() || !timezone_field.value().literal().has_string()) throw Exception( ErrorCodes::BAD_ARGUMENTS, "Unsupported timezone_field argument, should be a string literal, but: {}", timezone_field.DebugString()); + timezone = timezone_field.value().literal().string(); + } const auto & unit = Poco::toUpper(unit_field.value().literal().string()); - auto timezone = timezone_field.value().literal().string(); std::string ch_function_name; if (unit == "MICROSECOND") diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/trimFunctions.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/trimFunctions.cpp new file mode 100644 index 0000000000000..e07196b282e0c --- /dev/null +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/trimFunctions.cpp @@ -0,0 +1,131 @@ +/* + * 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. + */ +#include +#include + +namespace local_engine +{ +class SparkFunctionTrimParser : public FunctionParser +{ +public: + SparkFunctionTrimParser(SerializedPlanParser * plan_parser_) : FunctionParser(plan_parser_) {} + ~SparkFunctionTrimParser() override = default; + + static constexpr auto name = "trim"; + String getName() const override { return name; } + + String getCHFunctionName(const substrait::Expression_ScalarFunction & func) const override + { + return func.arguments().size() == 1 ? "trimBoth" : "trimBothSpark"; + } + + const DB::ActionsDAG::Node * parse(const substrait::Expression_ScalarFunction & substrait_func, DB::ActionsDAGPtr & actions_dag) const override + { + DB::ActionsDAG::NodeRawConstPtrs parsed_args; + auto ch_function_name = getCHFunctionName(substrait_func); + const auto & args = substrait_func.arguments(); + + /// In substrait, the first arg is srcStr, the second arg is trimStr + /// But in CH, the first arg is trimStr, the second arg is srcStr + if (args.size() > 1) + { + parsed_args.emplace_back(parseExpression(actions_dag, args[1].value())); + parsed_args.emplace_back(parseExpression(actions_dag, args[0].value())); + } + else + parsed_args.emplace_back(parseExpression(actions_dag, args[0].value())); + + const auto * func_node = toFunctionNode(actions_dag, ch_function_name, parsed_args); + return convertNodeTypeIfNeeded(substrait_func, func_node, actions_dag); + } +}; + +static FunctionParserRegister register_trim; + +class SparkFunctionLtrimParser : public FunctionParser +{ +public: + SparkFunctionLtrimParser(SerializedPlanParser * plan_parser_) : FunctionParser(plan_parser_) {} + ~SparkFunctionLtrimParser() override = default; + + static constexpr auto name = "ltrim"; + String getName() const override { return name; } + + String getCHFunctionName(const substrait::Expression_ScalarFunction & func) const override + { + return func.arguments().size() == 1 ? "trimLeft" : "trimLeftSpark"; + } + + const DB::ActionsDAG::Node * parse(const substrait::Expression_ScalarFunction & substrait_func, DB::ActionsDAGPtr & actions_dag) const override + { + DB::ActionsDAG::NodeRawConstPtrs parsed_args; + auto ch_function_name = getCHFunctionName(substrait_func); + const auto & args = substrait_func.arguments(); + + /// In substrait, the first arg is srcStr, the second arg is trimStr + /// But in CH, the first arg is trimStr, the second arg is srcStr + if (args.size() > 1) + { + parsed_args.emplace_back(parseExpression(actions_dag, args[1].value())); + parsed_args.emplace_back(parseExpression(actions_dag, args[0].value())); + } + else + parsed_args.emplace_back(parseExpression(actions_dag, args[0].value())); + + const auto * func_node = toFunctionNode(actions_dag, ch_function_name, parsed_args); + return convertNodeTypeIfNeeded(substrait_func, func_node, actions_dag); + } +}; +static FunctionParserRegister register_ltrim; + +class SparkFunctionRtrimParser : public FunctionParser +{ +public: + SparkFunctionRtrimParser(SerializedPlanParser * plan_parser_) : FunctionParser(plan_parser_) {} + ~SparkFunctionRtrimParser() override = default; + + static constexpr auto name = "rtrim"; + String getName() const override { return name; } + + String getCHFunctionName(const substrait::Expression_ScalarFunction & func) const override + { + return func.arguments().size() == 1 ? "trimRight" : "trimRightSpark"; + } + + const DB::ActionsDAG::Node * parse(const substrait::Expression_ScalarFunction & substrait_func, DB::ActionsDAGPtr & actions_dag) const override + { + DB::ActionsDAG::NodeRawConstPtrs parsed_args; + auto ch_function_name = getCHFunctionName(substrait_func); + const auto & args = substrait_func.arguments(); + + /// In substrait, the first arg is srcStr, the second arg is trimStr + /// But in CH, the first arg is trimStr, the second arg is srcStr + if (args.size() > 1) + { + parsed_args.emplace_back(parseExpression(actions_dag, args[1].value())); + parsed_args.emplace_back(parseExpression(actions_dag, args[0].value())); + } + else + parsed_args.emplace_back(parseExpression(actions_dag, args[0].value())); + + const auto * func_node = toFunctionNode(actions_dag, ch_function_name, parsed_args); + return convertNodeTypeIfNeeded(substrait_func, func_node, actions_dag); + } +}; +static FunctionParserRegister register_rtrim; +} + diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/trunc.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/trunc.cpp index db45bb464a52e..625d67a7e1c65 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/trunc.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/trunc.cpp @@ -47,7 +47,7 @@ class FunctionParserTrunc : public FunctionParser const substrait::Expression_ScalarFunction & substrait_func, ActionsDAGPtr & actions_dag) const override { - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 2) throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires two arguments", getName()); diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/tuple.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/tuple.cpp new file mode 100644 index 0000000000000..3228efb0ed887 --- /dev/null +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/tuple.cpp @@ -0,0 +1,51 @@ +/* + * 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. + */ +#include +#include +#include + +namespace local_engine +{ +class SparkFunctionNamedStructParser : public FunctionParser +{ +public: + SparkFunctionNamedStructParser(SerializedPlanParser * plan_parser_) : FunctionParser(plan_parser_) {} + ~SparkFunctionNamedStructParser() override = default; + + static constexpr auto name = "named_struct"; + String getName () const override { return name; } + String getCHFunctionName(const substrait::Expression_ScalarFunction &) const override { return "tuple"; } + + const DB::ActionsDAG::Node * parse(const substrait::Expression_ScalarFunction & substrait_func, DB::ActionsDAGPtr & actions_dag) const override + { + DB::ActionsDAG::NodeRawConstPtrs parsed_args; + const auto & args = substrait_func.arguments(); + auto ch_function_name = getCHFunctionName(substrait_func); + // Arguments in the format, (, [, , ...]) + // We don't need to care the field names here. + for (int i = 1; i < args.size(); i += 2) + { + parsed_args.emplace_back(parseExpression(actions_dag, args[i].value())); + } + const auto * func_node = toFunctionNode(actions_dag, ch_function_name, parsed_args); + return convertNodeTypeIfNeeded(substrait_func, func_node, actions_dag); + } +}; + +static FunctionParserRegister register_named_struct; +} + diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/tupleElement.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/tupleElement.cpp new file mode 100644 index 0000000000000..6cf0acff0d04f --- /dev/null +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/tupleElement.cpp @@ -0,0 +1,60 @@ +/* + * 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. + */ +#include +#include +#include + +namespace DB::ErrorCodes +{ + extern const int BAD_ARGUMENTS; +} +namespace local_engine +{ +// tuple indecies start from 1, in spark, start from 0 +#define REGISTER_TUPLE_ELEMENT_PARSER(class_name, substrait_name, ch_name) \ + class SparkFunctionParser##class_name : public FunctionParser \ + { \ + public: \ + SparkFunctionParser##class_name(SerializedPlanParser * plan_parser_) : FunctionParser(plan_parser_) {}\ + ~SparkFunctionParser##class_name() override = default; \ + static constexpr auto name = #substrait_name; \ + String getName () const override { return name; } \ + String getCHFunctionName(const substrait::Expression_ScalarFunction &) const override { return #ch_name; } \ + const DB::ActionsDAG::Node * parse(const substrait::Expression_ScalarFunction & substrait_func, DB::ActionsDAGPtr & actions_dag) const override \ + { \ + DB::ActionsDAG::NodeRawConstPtrs parsed_args; \ + auto ch_function_name = getCHFunctionName(substrait_func); \ + const auto & args = substrait_func.arguments(); \ + parsed_args.emplace_back(parseExpression(actions_dag, args[0].value())); \ + if (!args[1].value().has_literal()) \ + throw DB::Exception(DB::ErrorCodes::BAD_ARGUMENTS, "{}'s sceond argument must be a literal", #substrait_name); \ + auto [data_type, field] = parseLiteral(args[1].value().literal()); \ + if (!DB::WhichDataType(data_type).isInt32()) \ + throw DB::Exception(DB::ErrorCodes::BAD_ARGUMENTS, "{}'s second argument must be i32", #substrait_name); \ + Int32 field_index = static_cast(field.get() + 1); \ + const auto * index_node = addColumnToActionsDAG(actions_dag, std::make_shared(), field_index); \ + parsed_args.emplace_back(index_node); \ + const auto * func_node = toFunctionNode(actions_dag, ch_function_name, parsed_args); \ + return convertNodeTypeIfNeeded(substrait_func, func_node, actions_dag); \ + } \ + }; \ + static FunctionParserRegister register_##substrait_name; + +REGISTER_TUPLE_ELEMENT_PARSER(GetStructField, get_struct_field, sparkTupleElement); +REGISTER_TUPLE_ELEMENT_PARSER(GetArrayStructFields, get_array_struct_fields, sparkTupleElement); +} + diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/unixTimestamp.cpp b/cpp-ch/local-engine/Parser/scalar_function_parser/unixTimestamp.cpp index c12a6d33fd17e..9488b89be67a1 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/unixTimestamp.cpp +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/unixTimestamp.cpp @@ -53,7 +53,7 @@ class FunctionParserUnixTimestamp : public FunctionParser 2. If expr type is date/TIMESTAMP, ch function = toUnixTimestamp(expr, format) 3. Otherwise, throw exception */ - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); if (parsed_args.size() != 2) throw Exception(ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {} requires exactly two arguments", getName()); diff --git a/cpp-ch/local-engine/Parser/scalar_function_parser/utcTimestampTransform.h b/cpp-ch/local-engine/Parser/scalar_function_parser/utcTimestampTransform.h index 87ea19024169a..b3b639c562bd5 100644 --- a/cpp-ch/local-engine/Parser/scalar_function_parser/utcTimestampTransform.h +++ b/cpp-ch/local-engine/Parser/scalar_function_parser/utcTimestampTransform.h @@ -44,14 +44,14 @@ class FunctionParserUtcTimestampTransform : public FunctionParser /// Convert timezone value to clickhouse backend supported, i.e. GMT+8 -> Etc/GMT-8, +08:00 -> Etc/GMT-8 if (substrait_func.arguments_size() != 2) throw DB::Exception(DB::ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH, "Function {}'s must have 2 arguments", getName()); - + const substrait::Expression & arg1 = substrait_func.arguments()[1].value(); if (!arg1.has_literal() || !arg1.literal().has_string()) throw DB::Exception(DB::ErrorCodes::ILLEGAL_TYPE_OF_ARGUMENT, "Function {}'s 2nd argument should be string literal", getName()); - + const String & arg1_literal = arg1.literal().string(); String time_zone_val = DateTimeUtil::convertTimeZone(arg1_literal); - auto parsed_args = parseFunctionArguments(substrait_func, "", actions_dag); + auto parsed_args = parseFunctionArguments(substrait_func, actions_dag); auto nullable_string_type = DB::makeNullable(std::make_shared()); const auto * time_zone_node = addColumnToActionsDAG(actions_dag, nullable_string_type, time_zone_val); const auto * result_node = toFunctionNode(actions_dag, getCHFunctionName(substrait_func), {parsed_args[0], time_zone_node}); diff --git a/cpp-ch/local-engine/Shuffle/PartitionWriter.h b/cpp-ch/local-engine/Shuffle/PartitionWriter.h index 5b4285afda1f9..e2c10b0cbd464 100644 --- a/cpp-ch/local-engine/Shuffle/PartitionWriter.h +++ b/cpp-ch/local-engine/Shuffle/PartitionWriter.h @@ -19,13 +19,14 @@ #include #include #include +#include #include #include +#include +#include #include #include -#include -#include "CachedShuffleWriter.h" namespace DB { diff --git a/cpp-ch/local-engine/Shuffle/SelectorBuilder.cpp b/cpp-ch/local-engine/Shuffle/SelectorBuilder.cpp index 7e3642dacd523..6804770c34c15 100644 --- a/cpp-ch/local-engine/Shuffle/SelectorBuilder.cpp +++ b/cpp-ch/local-engine/Shuffle/SelectorBuilder.cpp @@ -291,6 +291,11 @@ void RangeSelectorBuilder::initRangeBlock(Poco::JSON::Array::Ptr range_bounds) int val = field_value.convert(); col->insert(val); } + else if (const auto * timestamp = dynamic_cast(type_info.inner_type.get())) + { + auto value = field_value.convert(); + col->insert(DecimalField(value, 6)); + } else if (const auto * decimal32 = dynamic_cast *>(type_info.inner_type.get())) { auto value = decimal32->parseFromString(field_value.convert()); diff --git a/cpp-ch/local-engine/Storages/CustomStorageMergeTree.cpp b/cpp-ch/local-engine/Storages/CustomStorageMergeTree.cpp index ec0e0932fc763..961f482c7cae9 100644 --- a/cpp-ch/local-engine/Storages/CustomStorageMergeTree.cpp +++ b/cpp-ch/local-engine/Storages/CustomStorageMergeTree.cpp @@ -16,9 +16,9 @@ */ #include "CustomStorageMergeTree.h" - -#include #include +#include +#include #include namespace DB @@ -148,9 +148,26 @@ CustomStorageMergeTree::CustomStorageMergeTree( std::atomic CustomStorageMergeTree::part_num; + + +void CustomStorageMergeTree::prefectchMetaDataFile(std::unordered_set parts) +{ + auto disk = getDisks().front(); + if (!disk->isRemote()) return; + std::vector meta_paths; + std::ranges::for_each(parts, [&](const String & name) { meta_paths.emplace_back(fs::path(relative_data_path) / name / "meta.bin"); }); + for (const auto & meta_path: meta_paths) + { + if (!disk->exists(meta_path)) continue; + auto in = disk->readFile(meta_path); + String ignore_data; + readStringUntilEOF(ignore_data, *in); + } +} + std::vector CustomStorageMergeTree::loadDataPartsWithNames(std::unordered_set parts) { - auto parts_lock = lockParts(); + prefectchMetaDataFile(parts); std::vector data_parts; const auto disk = getStoragePolicy()->getDisks().at(0); for (const auto& name : parts) @@ -161,8 +178,6 @@ std::vector CustomStorageMergeTree::loadDataPartsWithNames data_parts.emplace_back(res.part); } - // without it "test mergetree optimize partitioned by one low card column" will log ERROR - calculateColumnAndSecondaryIndexSizesImpl(); return data_parts; } @@ -211,6 +226,7 @@ MergeTreeData::LoadPartResult CustomStorageMergeTree::loadDataPart( res.part->loadVersionMetadata(); res.part->setState(to_state); + auto parts_lock = lockParts(); DataPartIteratorByInfo it; bool inserted; @@ -239,6 +255,9 @@ MergeTreeData::LoadPartResult CustomStorageMergeTree::loadDataPart( if (res.part->hasLightweightDelete()) has_lightweight_delete_parts.store(true); + // without it "test mergetree optimize partitioned by one low card column" will log ERROR + calculateColumnAndSecondaryIndexSizesImpl(); + LOG_TRACE(log, "Finished loading {} part {} on disk {}", magic_enum::enum_name(to_state), part_name, part_disk_ptr->getName()); return res; } diff --git a/cpp-ch/local-engine/Storages/CustomStorageMergeTree.h b/cpp-ch/local-engine/Storages/CustomStorageMergeTree.h index cd507a3ac7516..9144aba429c0a 100644 --- a/cpp-ch/local-engine/Storages/CustomStorageMergeTree.h +++ b/cpp-ch/local-engine/Storages/CustomStorageMergeTree.h @@ -65,6 +65,7 @@ class CustomStorageMergeTree final : public MergeTreeData private: SimpleIncrement increment; + void prefectchMetaDataFile(std::unordered_set parts); void startBackgroundMovesIfNeeded() override; std::unique_ptr getDefaultSettings() const override; LoadPartResult loadDataPart( diff --git a/cpp-ch/local-engine/Storages/Mergetree/MergeSparkMergeTreeTask.cpp b/cpp-ch/local-engine/Storages/Mergetree/MergeSparkMergeTreeTask.cpp index 8e8e4c556beb2..05b2623b4d160 100644 --- a/cpp-ch/local-engine/Storages/Mergetree/MergeSparkMergeTreeTask.cpp +++ b/cpp-ch/local-engine/Storages/Mergetree/MergeSparkMergeTreeTask.cpp @@ -164,7 +164,7 @@ void MergeSparkMergeTreeTask::finish() // MergeTreeData::Transaction transaction(storage, txn.get()); // storage.merger_mutator.renameMergedTemporaryPart(new_part, future_part->parts, txn, transaction); // transaction.commit(); - + new_part->getDataPartStoragePtr()->commitTransaction(); ThreadFuzzer::maybeInjectSleep(); ThreadFuzzer::maybeInjectMemoryLimitException(); diff --git a/cpp-ch/local-engine/Storages/Mergetree/MetaDataHelper.cpp b/cpp-ch/local-engine/Storages/Mergetree/MetaDataHelper.cpp index 57bb804fa9d19..8d43af06829ce 100644 --- a/cpp-ch/local-engine/Storages/Mergetree/MetaDataHelper.cpp +++ b/cpp-ch/local-engine/Storages/Mergetree/MetaDataHelper.cpp @@ -17,7 +17,7 @@ #include "MetaDataHelper.h" #include - +#include #include #include #include @@ -113,8 +113,6 @@ void restoreMetaData(CustomStorageMergeTreePtr & storage, const MergeTreeTable & auto item_path = part_path / item.first; auto out = metadata_disk->writeFile(item_path); out->write(item.second.data(), item.second.size()); - out->finalize(); - out->sync(); } }; thread_pool.scheduleOrThrow(job); diff --git a/cpp-ch/local-engine/Storages/Mergetree/SparkMergeTreeWriter.cpp b/cpp-ch/local-engine/Storages/Mergetree/SparkMergeTreeWriter.cpp index 406f2aaa23df2..403b845147fa4 100644 --- a/cpp-ch/local-engine/Storages/Mergetree/SparkMergeTreeWriter.cpp +++ b/cpp-ch/local-engine/Storages/Mergetree/SparkMergeTreeWriter.cpp @@ -121,12 +121,11 @@ void SparkMergeTreeWriter::write(const DB::Block & block) checkAndMerge(); } -bool SparkMergeTreeWriter::chunkToPart(Chunk && chunk) +bool SparkMergeTreeWriter::chunkToPart(Chunk && plan_chunk) { - if (chunk.hasChunkInfo()) + if (Chunk result_chunk = DB::Squashing::squash(std::move(plan_chunk))) { - Chunk squash_chunk = DB::Squashing::squash(std::move(chunk)); - Block result = header.cloneWithColumns(squash_chunk.getColumns()); + auto result = squashing->getHeader().cloneWithColumns(result_chunk.detachColumns()); return blockToPart(result); } return false; @@ -232,18 +231,42 @@ void SparkMergeTreeWriter::commitPartToRemoteStorageIfNeeded() auto read_settings = context->getReadSettings(); auto write_settings = context->getWriteSettings(); Stopwatch watch; + + // Temporary support for S3 + bool s3_disk = dest_storage->getStoragePolicy()->getAnyDisk()->getName().contains("s3"); for (const auto & merge_tree_data_part : new_parts.unsafeGet()) { String local_relative_path = storage->getRelativeDataPath() + "/" + merge_tree_data_part->name; String remote_relative_path = dest_storage->getRelativeDataPath() + "/" + merge_tree_data_part->name; - storage->getStoragePolicy()->getAnyDisk()->copyDirectoryContent( + if (s3_disk) + { + storage->getStoragePolicy()->getAnyDisk()->copyDirectoryContent( local_relative_path, dest_storage->getStoragePolicy()->getAnyDisk(), remote_relative_path, read_settings, write_settings, nullptr); + } + else + { + std::vector files; + storage->getStoragePolicy()->getAnyDisk()->listFiles(local_relative_path, files); + auto src_disk = storage->getStoragePolicy()->getAnyDisk(); + auto dest_disk = dest_storage->getStoragePolicy()->getAnyDisk(); + auto tx = dest_disk->createTransaction(); + for (const auto & file : files) + { + auto read_buffer = src_disk->readFile(local_relative_path + "/" + file, read_settings); + auto write_buffer = tx->writeFile(remote_relative_path + "/" + file, DBMS_DEFAULT_BUFFER_SIZE, WriteMode::Rewrite, write_settings); + copyData(*read_buffer, *write_buffer); + write_buffer->finalize(); + } + tx->commit(); + } + + LOG_DEBUG( &Poco::Logger::get("SparkMergeTreeWriter"), "Upload part {} to disk {} success.", @@ -306,7 +329,6 @@ DB::MergeTreeDataWriter::TemporaryPart SparkMergeTreeWriter::writeTempPartAndFin { MergeTreeDataWriter::TemporaryPart temp_part; writeTempPart(temp_part, block_with_partition, metadata_snapshot); - temp_part.finalize(); return temp_part; } @@ -399,6 +421,7 @@ void SparkMergeTreeWriter::writeTempPart( new_data_part->partition = std::move(partition); new_data_part->minmax_idx = std::move(minmax_idx); + data_part_storage->beginTransaction(); SyncGuardPtr sync_guard; if (new_data_part->isStoredOnDisk()) { @@ -441,6 +464,8 @@ void SparkMergeTreeWriter::writeTempPart( temp_part.part = new_data_part; temp_part.streams.emplace_back(MergeTreeDataWriter::TemporaryPart::Stream{.stream = std::move(out), .finalizer = std::move(finalizer)}); + temp_part.finalize(); + data_part_storage->commitTransaction(); } std::vector SparkMergeTreeWriter::getAllPartInfo() diff --git a/cpp-ch/local-engine/Storages/Mergetree/SparkMergeTreeWriter.h b/cpp-ch/local-engine/Storages/Mergetree/SparkMergeTreeWriter.h index 13ac223944775..269b0352c0566 100644 --- a/cpp-ch/local-engine/Storages/Mergetree/SparkMergeTreeWriter.h +++ b/cpp-ch/local-engine/Storages/Mergetree/SparkMergeTreeWriter.h @@ -77,7 +77,7 @@ class SparkMergeTreeWriter void saveMetadata(); void commitPartToRemoteStorageIfNeeded(); void finalizeMerge(); - bool chunkToPart(Chunk && chunk); + bool chunkToPart(Chunk && plan_chunk); bool blockToPart(Block & block); bool useLocalStorage() const; diff --git a/cpp-ch/local-engine/Storages/SourceFromJavaIter.cpp b/cpp-ch/local-engine/Storages/SourceFromJavaIter.cpp index 37501e98504a0..1c5902c8ca67b 100644 --- a/cpp-ch/local-engine/Storages/SourceFromJavaIter.cpp +++ b/cpp-ch/local-engine/Storages/SourceFromJavaIter.cpp @@ -109,13 +109,13 @@ DB::Chunk SourceFromJavaIter::generate() auto info = std::make_shared(); info->is_overflows = data->info.is_overflows; info->bucket_num = data->info.bucket_num; - result.setChunkInfo(info); + result.getChunkInfos().add(std::move(info)); } else { result = BlockUtil::buildRowCountChunk(rows); auto info = std::make_shared(); - result.setChunkInfo(info); + result.getChunkInfos().add(std::move(info)); } } return result; diff --git a/cpp-ch/local-engine/Storages/SubstraitSource/ExcelTextFormatFile.cpp b/cpp-ch/local-engine/Storages/SubstraitSource/ExcelTextFormatFile.cpp index 31ef5b9e17159..428ef57968880 100644 --- a/cpp-ch/local-engine/Storages/SubstraitSource/ExcelTextFormatFile.cpp +++ b/cpp-ch/local-engine/Storages/SubstraitSource/ExcelTextFormatFile.cpp @@ -15,8 +15,6 @@ * limitations under the License. */ #include "ExcelTextFormatFile.h" -#include - #include #include @@ -31,6 +29,7 @@ #include #include #include +#include namespace DB { diff --git a/cpp-ch/local-engine/Storages/SubstraitSource/ExcelTextFormatFile.h b/cpp-ch/local-engine/Storages/SubstraitSource/ExcelTextFormatFile.h index 237a0383c2114..4ec69f33b9c41 100644 --- a/cpp-ch/local-engine/Storages/SubstraitSource/ExcelTextFormatFile.h +++ b/cpp-ch/local-engine/Storages/SubstraitSource/ExcelTextFormatFile.h @@ -16,8 +16,6 @@ */ #pragma once - -#include #include #include #include diff --git a/cpp-ch/local-engine/Storages/SubstraitSource/ReadBufferBuilder.cpp b/cpp-ch/local-engine/Storages/SubstraitSource/ReadBufferBuilder.cpp index ec967a869600f..e73ca8ecee2bb 100644 --- a/cpp-ch/local-engine/Storages/SubstraitSource/ReadBufferBuilder.cpp +++ b/cpp-ch/local-engine/Storages/SubstraitSource/ReadBufferBuilder.cpp @@ -20,10 +20,10 @@ #include #include #include +#include #include #include #include -#include #include #include #include @@ -52,6 +52,10 @@ #include #include +#if USE_AZURE_BLOB_STORAGE +#include +#endif + #if USE_AWS_S3 #include #include @@ -687,7 +691,19 @@ class AzureBlobReadBuffer : public ReadBufferBuilder { if (shared_client) return shared_client; - shared_client = DB::getAzureBlobContainerClient(context->getConfigRef(), "blob"); + + const std::string config_prefix = "blob"; + const Poco::Util::AbstractConfiguration & config = context->getConfigRef(); + bool is_client_for_disk = false; + auto new_settings = DB::AzureBlobStorage::getRequestSettings(config, config_prefix, context); + DB::AzureBlobStorage::ConnectionParams params + { + .endpoint = DB::AzureBlobStorage::processEndpoint(config, config_prefix), + .auth_method = DB::AzureBlobStorage::getAuthMethod(config, config_prefix), + .client_options = DB::AzureBlobStorage::getClientOptions(*new_settings, is_client_for_disk), + }; + + shared_client = DB::AzureBlobStorage::getContainerClient(params, true); return shared_client; } }; diff --git a/cpp-ch/local-engine/Storages/SubstraitSource/ReadBufferBuilder.h b/cpp-ch/local-engine/Storages/SubstraitSource/ReadBufferBuilder.h index b07b810e896a8..f5218f0aa5def 100644 --- a/cpp-ch/local-engine/Storages/SubstraitSource/ReadBufferBuilder.h +++ b/cpp-ch/local-engine/Storages/SubstraitSource/ReadBufferBuilder.h @@ -22,6 +22,7 @@ #include #include #include +#include namespace local_engine { diff --git a/cpp-ch/local-engine/jni/jni_common.cpp b/cpp-ch/local-engine/jni/jni_common.cpp index 4d05b5f48e58a..6eb02a2f450b4 100644 --- a/cpp-ch/local-engine/jni/jni_common.cpp +++ b/cpp-ch/local-engine/jni/jni_common.cpp @@ -73,13 +73,13 @@ jmethodID GetStaticMethodID(JNIEnv * env, jclass this_class, const char * name, jstring charTojstring(JNIEnv * env, const char * pat) { - jclass str_class = (env)->FindClass("Ljava/lang/String;"); - jmethodID ctor_id = (env)->GetMethodID(str_class, "", "([BLjava/lang/String;)V"); - jsize strSize = static_cast(strlen(pat)); - jbyteArray bytes = (env)->NewByteArray(strSize); - (env)->SetByteArrayRegion(bytes, 0, strSize, reinterpret_cast(const_cast(pat))); - jstring encoding = (env)->NewStringUTF("UTF-8"); - jstring result = static_cast((env)->NewObject(str_class, ctor_id, bytes, encoding)); + const jclass str_class = (env)->FindClass("Ljava/lang/String;"); + const jmethodID ctor_id = (env)->GetMethodID(str_class, "", "([BLjava/lang/String;)V"); + const jsize str_size = static_cast(strlen(pat)); + const jbyteArray bytes = (env)->NewByteArray(str_size); + (env)->SetByteArrayRegion(bytes, 0, str_size, reinterpret_cast(const_cast(pat))); + const jstring encoding = (env)->NewStringUTF("UTF-8"); + const auto result = static_cast((env)->NewObject(str_class, ctor_id, bytes, encoding)); env->DeleteLocalRef(bytes); env->DeleteLocalRef(encoding); return result; diff --git a/cpp-ch/local-engine/jni/jni_common.h b/cpp-ch/local-engine/jni/jni_common.h index 8d14370835c45..c1e0fbead5357 100644 --- a/cpp-ch/local-engine/jni/jni_common.h +++ b/cpp-ch/local-engine/jni/jni_common.h @@ -141,4 +141,103 @@ jlong safeCallStaticLongMethod(JNIEnv * env, jclass clazz, jmethodID method_id, LOCAL_ENGINE_JNI_JMETHOD_END(env) return ret; } + +// Safe version of JNI {Get|Release}ArrayElements routines. +// SafeNativeArray would release the managed array elements automatically +// during destruction. + +enum class JniPrimitiveArrayType { + kBoolean = 0, + kByte = 1, + kChar = 2, + kShort = 3, + kInt = 4, + kLong = 5, + kFloat = 6, + kDouble = 7 +}; + +#define CONCATENATE(t1, t2, t3) t1##t2##t3 + +#define DEFINE_PRIMITIVE_ARRAY(PRIM_TYPE, JAVA_TYPE, JNI_NATIVE_TYPE, NATIVE_TYPE, METHOD_VAR) \ + template <> \ + struct JniPrimitiveArray { \ + using JavaType = JAVA_TYPE; \ + using JniNativeType = JNI_NATIVE_TYPE; \ + using NativeType = NATIVE_TYPE; \ + \ + static JniNativeType get(JNIEnv* env, JavaType javaArray) { \ + return env->CONCATENATE(Get, METHOD_VAR, ArrayElements)(javaArray, nullptr); \ + } \ + \ + static void release(JNIEnv* env, JavaType javaArray, JniNativeType nativeArray) { \ + env->CONCATENATE(Release, METHOD_VAR, ArrayElements)(javaArray, nativeArray, JNI_ABORT); \ + } \ + }; + +template +struct JniPrimitiveArray {}; + +DEFINE_PRIMITIVE_ARRAY(kBoolean, jbooleanArray, jboolean*, bool*, Boolean) +DEFINE_PRIMITIVE_ARRAY(kByte, jbyteArray, jbyte*, uint8_t*, Byte) +DEFINE_PRIMITIVE_ARRAY(kChar, jcharArray, jchar*, uint16_t*, Char) +DEFINE_PRIMITIVE_ARRAY(kShort, jshortArray, jshort*, int16_t*, Short) +DEFINE_PRIMITIVE_ARRAY(kInt, jintArray, jint*, int32_t*, Int) +DEFINE_PRIMITIVE_ARRAY(kLong, jlongArray, jlong*, int64_t*, Long) +DEFINE_PRIMITIVE_ARRAY(kFloat, jfloatArray, jfloat*, float_t*, Float) +DEFINE_PRIMITIVE_ARRAY(kDouble, jdoubleArray, jdouble*, double_t*, Double) + +template +class SafeNativeArray { + using PrimitiveArray = JniPrimitiveArray; + using JavaArrayType = typename PrimitiveArray::JavaType; + using JniNativeArrayType = typename PrimitiveArray::JniNativeType; + using NativeArrayType = typename PrimitiveArray::NativeType; + + public: + virtual ~SafeNativeArray() { + PrimitiveArray::release(env_, javaArray_, nativeArray_); + } + + SafeNativeArray(const SafeNativeArray&) = delete; + SafeNativeArray(SafeNativeArray&&) = delete; + SafeNativeArray& operator=(const SafeNativeArray&) = delete; + SafeNativeArray& operator=(SafeNativeArray&&) = delete; + + const NativeArrayType elems() const { + return reinterpret_cast(nativeArray_); + } + + const jsize length() const { + return env_->GetArrayLength(javaArray_); + } + + static SafeNativeArray get(JNIEnv* env, JavaArrayType javaArray) { + JniNativeArrayType nativeArray = PrimitiveArray::get(env, javaArray); + return SafeNativeArray(env, javaArray, nativeArray); + } + + private: + SafeNativeArray(JNIEnv* env, JavaArrayType javaArray, JniNativeArrayType nativeArray) + : env_(env), javaArray_(javaArray), nativeArray_(nativeArray){}; + + JNIEnv* env_; + JavaArrayType javaArray_; + JniNativeArrayType nativeArray_; +}; + +#define DEFINE_SAFE_GET_PRIMITIVE_ARRAY_FUNCTIONS(PRIM_TYPE, JAVA_TYPE, METHOD_VAR) \ + inline SafeNativeArray CONCATENATE(get, METHOD_VAR, ArrayElementsSafe)( \ + JNIEnv * env, JAVA_TYPE array) { \ + return SafeNativeArray::get(env, array); \ + } + +DEFINE_SAFE_GET_PRIMITIVE_ARRAY_FUNCTIONS(kBoolean, jbooleanArray, Boolean) +DEFINE_SAFE_GET_PRIMITIVE_ARRAY_FUNCTIONS(kByte, jbyteArray, Byte) +DEFINE_SAFE_GET_PRIMITIVE_ARRAY_FUNCTIONS(kChar, jcharArray, Char) +DEFINE_SAFE_GET_PRIMITIVE_ARRAY_FUNCTIONS(kShort, jshortArray, Short) +DEFINE_SAFE_GET_PRIMITIVE_ARRAY_FUNCTIONS(kInt, jintArray, Int) +DEFINE_SAFE_GET_PRIMITIVE_ARRAY_FUNCTIONS(kLong, jlongArray, Long) +DEFINE_SAFE_GET_PRIMITIVE_ARRAY_FUNCTIONS(kFloat, jfloatArray, Float) +DEFINE_SAFE_GET_PRIMITIVE_ARRAY_FUNCTIONS(kDouble, jdoubleArray, Double) } diff --git a/cpp-ch/local-engine/local_engine_jni.cpp b/cpp-ch/local-engine/local_engine_jni.cpp index 9c642d70ec27d..627e6154cdcf7 100644 --- a/cpp-ch/local-engine/local_engine_jni.cpp +++ b/cpp-ch/local-engine/local_engine_jni.cpp @@ -93,16 +93,6 @@ static std::string jstring2string(JNIEnv * env, jstring jStr) return ret; } -static jstring stringTojstring(JNIEnv * env, const char * pat) -{ - jclass strClass = (env)->FindClass("java/lang/String"); - jmethodID ctorID = (env)->GetMethodID(strClass, "", "([BLjava/lang/String;)V"); - jbyteArray bytes = (env)->NewByteArray(strlen(pat)); - (env)->SetByteArrayRegion(bytes, 0, strlen(pat), reinterpret_cast(pat)); - jstring encoding = (env)->NewStringUTF("UTF-8"); - return static_cast((env)->NewObject(strClass, ctorID, bytes, encoding)); -} - extern "C" { #endif @@ -121,9 +111,6 @@ static jmethodID block_stripes_constructor; static jclass split_result_class; static jmethodID split_result_constructor; -static jclass native_metrics_class; -static jmethodID native_metrics_constructor; - JNIEXPORT jint JNI_OnLoad(JavaVM * vm, void * /*reserved*/) { JNIEnv * env; @@ -188,10 +175,6 @@ JNIEXPORT jint JNI_OnLoad(JavaVM * vm, void * /*reserved*/) local_engine::ReservationListenerWrapper::reservation_listener_currentMemory = local_engine::GetMethodID(env, local_engine::ReservationListenerWrapper::reservation_listener_class, "currentMemory", "()J"); - - native_metrics_class = local_engine::CreateGlobalClassReference(env, "Lorg/apache/gluten/metrics/NativeMetrics;"); - native_metrics_constructor = local_engine::GetMethodID(env, native_metrics_class, "", "(Ljava/lang/String;)V"); - local_engine::BroadCastJoinBuilder::init(env); local_engine::JNIUtils::vm = vm; @@ -218,16 +201,14 @@ JNIEXPORT void JNI_OnUnload(JavaVM * vm, void * /*reserved*/) env->DeleteGlobalRef(local_engine::SourceFromJavaIter::serialized_record_batch_iterator_class); env->DeleteGlobalRef(local_engine::SparkRowToCHColumn::spark_row_interator_class); env->DeleteGlobalRef(local_engine::ReservationListenerWrapper::reservation_listener_class); - env->DeleteGlobalRef(native_metrics_class); } JNIEXPORT void Java_org_apache_gluten_vectorized_ExpressionEvaluatorJniWrapper_nativeInitNative(JNIEnv * env, jobject, jbyteArray conf_plan) { LOCAL_ENGINE_JNI_METHOD_START - std::string::size_type plan_buf_size = env->GetArrayLength(conf_plan); - jbyte * plan_buf_addr = env->GetByteArrayElements(conf_plan, nullptr); - local_engine::BackendInitializerUtil::init({reinterpret_cast(plan_buf_addr), plan_buf_size}); - env->ReleaseByteArrayElements(conf_plan, plan_buf_addr, JNI_ABORT); + const auto conf_plan_a = local_engine::getByteArrayElementsSafe(env, conf_plan); + const std::string::size_type plan_buf_size = conf_plan_a.length(); + local_engine::BackendInitializerUtil::init({reinterpret_cast(conf_plan_a.elems()), plan_buf_size}); LOCAL_ENGINE_JNI_METHOD_END(env, ) } @@ -252,9 +233,10 @@ JNIEXPORT jlong Java_org_apache_gluten_vectorized_ExpressionEvaluatorJniWrapper_ auto query_context = local_engine::getAllocator(allocator_id)->query_context; // by task update new configs ( in case of dynamic config update ) - std::string::size_type plan_buf_size = env->GetArrayLength(conf_plan); - jbyte * plan_buf_addr = env->GetByteArrayElements(conf_plan, nullptr); - local_engine::BackendInitializerUtil::updateConfig(query_context, {reinterpret_cast(plan_buf_addr), plan_buf_size}); + const auto conf_plan_a = local_engine::getByteArrayElementsSafe(env, conf_plan); + const std::string::size_type conf_plan_size = conf_plan_a.length(); + local_engine::BackendInitializerUtil::updateConfig( + query_context, {reinterpret_cast(conf_plan_a.elems()), conf_plan_size}); local_engine::SerializedPlanParser parser(query_context); jsize iter_num = env->GetArrayLength(iter_arr); @@ -268,21 +250,19 @@ JNIEXPORT jlong Java_org_apache_gluten_vectorized_ExpressionEvaluatorJniWrapper_ for (jsize i = 0, split_info_arr_size = env->GetArrayLength(split_infos); i < split_info_arr_size; i++) { jbyteArray split_info = static_cast(env->GetObjectArrayElement(split_infos, i)); - std::string::size_type split_info_size = env->GetArrayLength(split_info); - jbyte * split_info_addr = env->GetByteArrayElements(split_info, nullptr); - parser.addSplitInfo(std::string{reinterpret_cast(split_info_addr), split_info_size}); + const auto split_info_a = local_engine::getByteArrayElementsSafe(env, split_info); + const std::string::size_type split_info_size = split_info_a.length(); + parser.addSplitInfo({reinterpret_cast(split_info_a.elems()), split_info_size}); } - std::string::size_type plan_size = env->GetArrayLength(plan); - jbyte * plan_address = env->GetByteArrayElements(plan, nullptr); + const auto plan_a = local_engine::getByteArrayElementsSafe(env, plan); + const std::string::size_type plan_size = plan_a.length(); local_engine::LocalExecutor * executor - = parser.createExecutor({reinterpret_cast(plan_address), plan_size}).release(); - local_engine::LocalExecutor::addExecutor(executor); + = parser.createExecutor({reinterpret_cast(plan_a.elems()), plan_size}).release(); LOG_INFO(&Poco::Logger::get("jni"), "Construct LocalExecutor {}", reinterpret_cast(executor)); executor->setMetric(parser.getMetric()); executor->setExtraPlanHolder(parser.extra_plan_holder); - env->ReleaseByteArrayElements(plan, plan_address, JNI_ABORT); - env->ReleaseByteArrayElements(conf_plan, plan_buf_addr, JNI_ABORT); + return reinterpret_cast(executor); LOCAL_ENGINE_JNI_METHOD_END(env, -1) } @@ -308,33 +288,30 @@ JNIEXPORT jlong Java_org_apache_gluten_vectorized_BatchIterator_nativeCHNext(JNI JNIEXPORT void Java_org_apache_gluten_vectorized_BatchIterator_nativeCancel(JNIEnv * env, jobject /*obj*/, jlong executor_address) { LOCAL_ENGINE_JNI_METHOD_START - local_engine::LocalExecutor::removeExecutor(executor_address); - local_engine::LocalExecutor * executor = reinterpret_cast(executor_address); + auto *executor = reinterpret_cast(executor_address); executor->cancel(); - LOG_INFO(&Poco::Logger::get("jni"), "Cancel LocalExecutor {}", reinterpret_cast(executor)); + LOG_INFO(&Poco::Logger::get("jni"), "Cancel LocalExecutor {}", reinterpret_cast(executor)); LOCAL_ENGINE_JNI_METHOD_END(env, ) } JNIEXPORT void Java_org_apache_gluten_vectorized_BatchIterator_nativeClose(JNIEnv * env, jobject /*obj*/, jlong executor_address) { LOCAL_ENGINE_JNI_METHOD_START - local_engine::LocalExecutor::removeExecutor(executor_address); - local_engine::LocalExecutor * executor = reinterpret_cast(executor_address); + auto *executor = reinterpret_cast(executor_address); LOG_INFO(&Poco::Logger::get("jni"), "Finalize LocalExecutor {}", reinterpret_cast(executor)); delete executor; LOCAL_ENGINE_JNI_METHOD_END(env, ) } -JNIEXPORT jobject Java_org_apache_gluten_vectorized_BatchIterator_nativeFetchMetrics(JNIEnv * env, jobject /*obj*/, jlong executor_address) +JNIEXPORT jstring Java_org_apache_gluten_vectorized_BatchIterator_nativeFetchMetrics(JNIEnv * env, jobject /*obj*/, jlong executor_address) { LOCAL_ENGINE_JNI_METHOD_START /// Collect metrics only if optimizations are disabled, otherwise coredump would happen. - local_engine::LocalExecutor * executor = reinterpret_cast(executor_address); - auto metric = executor->getMetric(); - String metrics_json = metric ? local_engine::RelMetricSerializer::serializeRelMetric(metric) : ""; - LOG_DEBUG(&Poco::Logger::get("jni"), "{}", metrics_json); - jobject native_metrics = env->NewObject(native_metrics_class, native_metrics_constructor, stringTojstring(env, metrics_json.c_str())); - return native_metrics; + const local_engine::LocalExecutor * executor = reinterpret_cast(executor_address); + const auto metric = executor->getMetric(); + const String metrics_json = metric ? local_engine::RelMetricSerializer::serializeRelMetric(metric) : ""; + + return local_engine::charTojstring(env, metrics_json.c_str()); LOCAL_ENGINE_JNI_METHOD_END(env, nullptr) } @@ -584,22 +561,16 @@ JNIEXPORT jlong Java_org_apache_gluten_vectorized_CHShuffleSplitterJniWrapper_na std::string out_exprs; if (expr_list != nullptr) { - int len = env->GetArrayLength(expr_list); - auto * str = reinterpret_cast(new char[len]); - memset(str, 0, len); - env->GetByteArrayRegion(expr_list, 0, len, str); - hash_exprs = std::string(str, str + len); - delete[] str; + const auto expr_list_a = local_engine::getByteArrayElementsSafe(env, expr_list); + const std::string::size_type expr_list_size = expr_list_a.length(); + hash_exprs = std::string{reinterpret_cast(expr_list_a.elems()), expr_list_size}; } if (out_expr_list != nullptr) { - int len = env->GetArrayLength(out_expr_list); - auto * str = reinterpret_cast(new char[len]); - memset(str, 0, len); - env->GetByteArrayRegion(out_expr_list, 0, len, str); - out_exprs = std::string(str, str + len); - delete[] str; + const auto out_expr_list_a = local_engine::getByteArrayElementsSafe(env, out_expr_list); + const std::string::size_type out_expr_list_size = out_expr_list_a.length(); + out_exprs = std::string{reinterpret_cast(out_expr_list_a.elems()), out_expr_list_size}; } Poco::StringTokenizer local_dirs_tokenizer(jstring2string(env, local_dirs), ","); @@ -660,20 +631,16 @@ JNIEXPORT jlong Java_org_apache_gluten_vectorized_CHShuffleSplitterJniWrapper_na std::string out_exprs; if (expr_list != nullptr) { - int len = env->GetArrayLength(expr_list); - auto * str = reinterpret_cast(new char[len]); - env->GetByteArrayRegion(expr_list, 0, len, str); - hash_exprs = std::string(str, str + len); - delete[] str; + const auto expr_list_a = local_engine::getByteArrayElementsSafe(env, expr_list); + const std::string::size_type expr_list_size = expr_list_a.length(); + hash_exprs = std::string{reinterpret_cast(expr_list_a.elems()), expr_list_size}; } if (out_expr_list != nullptr) { - int len = env->GetArrayLength(out_expr_list); - auto * str = reinterpret_cast(new char[len]); - env->GetByteArrayRegion(out_expr_list, 0, len, str); - out_exprs = std::string(str, str + len); - delete[] str; + const auto out_expr_list_a = local_engine::getByteArrayElementsSafe(env, out_expr_list); + const std::string::size_type out_expr_list_size = out_expr_list_a.length(); + out_exprs = std::string{reinterpret_cast(out_expr_list_a.elems()), out_expr_list_size}; } local_engine::SplitOptions options{ @@ -772,14 +739,12 @@ JNIEXPORT jobject Java_org_apache_gluten_vectorized_CHBlockConverterJniWrapper_c DB::Block * block = reinterpret_cast(block_address); if (masks != nullptr) { - jint size = env->GetArrayLength(masks); - jboolean is_cp = JNI_FALSE; - jint * values = env->GetIntArrayElements(masks, &is_cp); + auto safeArray = local_engine::getIntArrayElementsSafe(env, masks); mask = std::make_unique>(); - for (int j = 0; j < size; j++) - mask->push_back(values[j]); - env->ReleaseIntArrayElements(masks, values, JNI_ABORT); + for (int j = 0; j < safeArray.length(); j++) + mask->push_back(safeArray.elems()[j]); } + spark_row_info = converter.convertCHColumnToSparkRow(*block, mask); auto * offsets_arr = env->NewLongArray(spark_row_info->getNumRows()); @@ -925,47 +890,39 @@ JNIEXPORT jlong Java_org_apache_spark_sql_execution_datasources_CHDatasourceJniW LOCAL_ENGINE_JNI_METHOD_START auto query_context = local_engine::getAllocator(allocator_id)->query_context; // by task update new configs ( in case of dynamic config update ) - std::string::size_type conf_plan_buf_size = env->GetArrayLength(conf_plan); - jbyte * conf_plan_buf_addr = env->GetByteArrayElements(conf_plan, nullptr); + const auto conf_plan_a = local_engine::getByteArrayElementsSafe(env, conf_plan); + const std::string::size_type conf_plan_size = conf_plan_a.length(); local_engine::BackendInitializerUtil::updateConfig( - query_context, {reinterpret_cast(conf_plan_buf_addr), conf_plan_buf_size}); + query_context, {reinterpret_cast(conf_plan_a.elems()), conf_plan_size}); const auto uuid_str = jstring2string(env, uuid_); const auto task_id = jstring2string(env, task_id_); const auto partition_dir = jstring2string(env, partition_dir_); const auto bucket_dir = jstring2string(env, bucket_dir_); - jsize plan_buf_size = env->GetArrayLength(plan_); - jbyte * plan_buf_addr = env->GetByteArrayElements(plan_, nullptr); - std::string plan_str; - plan_str.assign(reinterpret_cast(plan_buf_addr), plan_buf_size); + const auto plan_a = local_engine::getByteArrayElementsSafe(env, plan_); - jsize split_info_size = env->GetArrayLength(split_info_); - jbyte * split_info_addr = env->GetByteArrayElements(split_info_, nullptr); - std::string split_info_str; - split_info_str.assign(reinterpret_cast(split_info_addr), split_info_size); - - auto plan_ptr = std::make_unique(); /// https://stackoverflow.com/questions/52028583/getting-error-parsing-protobuf-data /// Parsing may fail when the number of recursive layers is large. /// Here, set a limit large enough to avoid this problem. /// Once this problem occurs, it is difficult to troubleshoot, because the pb of c++ will not provide any valid information - google::protobuf::io::CodedInputStream coded_in(reinterpret_cast(plan_str.data()), static_cast(plan_str.size())); + google::protobuf::io::CodedInputStream coded_in(plan_a.elems(), plan_a.length()); coded_in.SetRecursionLimit(100000); - auto ok = plan_ptr->ParseFromCodedStream(&coded_in); - if (!ok) + substrait::Plan plan_ptr; + if (!plan_ptr.ParseFromCodedStream(&coded_in)) throw DB::Exception(DB::ErrorCodes::CANNOT_PARSE_PROTOBUF_SCHEMA, "Parse substrait::Plan from string failed"); + const auto split_info_a = local_engine::getByteArrayElementsSafe(env, split_info_); + const std::string::size_type split_info_size = split_info_a.length(); + std::string split_info_str{reinterpret_cast(split_info_a.elems()), split_info_size}; + substrait::ReadRel::ExtensionTable extension_table = local_engine::SerializedPlanParser::parseExtensionTable(split_info_str); auto merge_tree_table = local_engine::MergeTreeRelParser::parseMergeTreeTable(extension_table); auto uuid = uuid_str + "_" + task_id; auto * writer = new local_engine::SparkMergeTreeWriter(merge_tree_table, query_context, uuid, partition_dir, bucket_dir); - env->ReleaseByteArrayElements(plan_, plan_buf_addr, JNI_ABORT); - env->ReleaseByteArrayElements(split_info_, split_info_addr, JNI_ABORT); - env->ReleaseByteArrayElements(conf_plan, conf_plan_buf_addr, JNI_ABORT); return reinterpret_cast(writer); LOCAL_ENGINE_JNI_METHOD_END(env, 0) } @@ -975,41 +932,32 @@ JNIEXPORT jstring Java_org_apache_spark_sql_execution_datasources_CHDatasourceJn JNIEnv * env, jclass, jbyteArray plan_, jbyteArray read_) { LOCAL_ENGINE_JNI_METHOD_START - jsize plan_buf_size = env->GetArrayLength(plan_); - jbyte * plan_buf_addr = env->GetByteArrayElements(plan_, nullptr); - std::string plan_str; - plan_str.assign(reinterpret_cast(plan_buf_addr), plan_buf_size); + const auto plan_a = local_engine::getByteArrayElementsSafe(env, plan_); + const std::string::size_type plan_size = plan_a.length(); - auto plan_ptr = std::make_unique(); - if (!plan_ptr->ParseFromString(plan_str)) + substrait::Plan plan_ptr; + if (!plan_ptr.ParseFromString({reinterpret_cast(plan_a.elems()), plan_size})) throw Exception(DB::ErrorCodes::CANNOT_PARSE_PROTOBUF_SCHEMA, "Parse substrait::Plan from string failed"); - jsize read_buf_size = env->GetArrayLength(read_); - jbyte * read_buf_addr = env->GetByteArrayElements(read_, nullptr); - std::string filter_str; - filter_str.assign(reinterpret_cast(read_buf_addr), read_buf_size); - - auto read_ptr = std::make_unique(); + const auto read_a = local_engine::getByteArrayElementsSafe(env, read_); /// https://stackoverflow.com/questions/52028583/getting-error-parsing-protobuf-data /// Parsing may fail when the number of recursive layers is large. /// Here, set a limit large enough to avoid this problem. /// Once this problem occurs, it is difficult to troubleshoot, because the pb of c++ will not provide any valid information - google::protobuf::io::CodedInputStream coded_in( - reinterpret_cast(filter_str.data()), static_cast(filter_str.size())); + google::protobuf::io::CodedInputStream coded_in(read_a.elems(), read_a.length()); coded_in.SetRecursionLimit(100000); - if (!read_ptr->ParseFromCodedStream(&coded_in)) + substrait::Rel read_ptr; + if (!read_ptr.ParseFromCodedStream(&coded_in)) throw Exception(DB::ErrorCodes::CANNOT_PARSE_PROTOBUF_SCHEMA, "Parse substrait::Expression from string failed"); local_engine::SerializedPlanParser parser(local_engine::SerializedPlanParser::global_context); - parser.parseExtensions(plan_ptr->extensions()); + parser.parseExtensions(plan_ptr.extensions()); local_engine::MergeTreeRelParser mergeTreeParser(&parser, local_engine::SerializedPlanParser::global_context); - auto res = mergeTreeParser.filterRangesOnDriver(read_ptr->read()); + auto res = mergeTreeParser.filterRangesOnDriver(read_ptr.read()); - env->ReleaseByteArrayElements(plan_, plan_buf_addr, JNI_ABORT); - env->ReleaseByteArrayElements(read_, read_buf_addr, JNI_ABORT); - return stringTojstring(env, res.c_str()); + return local_engine::charTojstring(env, res.c_str()); LOCAL_ENGINE_JNI_METHOD_END(env, nullptr) } @@ -1052,7 +1000,7 @@ Java_org_apache_spark_sql_execution_datasources_CHDatasourceJniWrapper_closeMerg auto part_infos = writer->getAllPartInfo(); auto json_info = local_engine::SparkMergeTreeWriter::partInfosToJson(part_infos); delete writer; - return stringTojstring(env, json_info.c_str()); + return local_engine::charTojstring(env, json_info.c_str()); LOCAL_ENGINE_JNI_METHOD_END(env, nullptr) } @@ -1077,28 +1025,23 @@ JNIEXPORT jstring Java_org_apache_spark_sql_execution_datasources_CHDatasourceJn const auto partition_dir = jstring2string(env, partition_dir_); const auto bucket_dir = jstring2string(env, bucket_dir_); - jsize plan_buf_size = env->GetArrayLength(plan_); - jbyte * plan_buf_addr = env->GetByteArrayElements(plan_, nullptr); - std::string plan_str; - plan_str.assign(reinterpret_cast(plan_buf_addr), plan_buf_size); - - jsize split_info_size = env->GetArrayLength(split_info_); - jbyte * split_info_addr = env->GetByteArrayElements(split_info_, nullptr); - std::string split_info_str; - split_info_str.assign(reinterpret_cast(split_info_addr), split_info_size); + const auto plan_a = local_engine::getByteArrayElementsSafe(env, plan_); - auto plan_ptr = std::make_unique(); /// https://stackoverflow.com/questions/52028583/getting-error-parsing-protobuf-data /// Parsing may fail when the number of recursive layers is large. /// Here, set a limit large enough to avoid this problem. /// Once this problem occurs, it is difficult to troubleshoot, because the pb of c++ will not provide any valid information - google::protobuf::io::CodedInputStream coded_in(reinterpret_cast(plan_str.data()), static_cast(plan_str.size())); + google::protobuf::io::CodedInputStream coded_in(plan_a.elems(), plan_a.length()); coded_in.SetRecursionLimit(100000); - auto ok = plan_ptr->ParseFromCodedStream(&coded_in); - if (!ok) + substrait::Plan plan_ptr; + if (!plan_ptr.ParseFromCodedStream(&coded_in)) throw DB::Exception(DB::ErrorCodes::CANNOT_PARSE_PROTOBUF_SCHEMA, "Parse substrait::Plan from string failed"); + const auto split_info_a = local_engine::getByteArrayElementsSafe(env, split_info_); + const std::string::size_type split_info_size = split_info_a.length(); + std::string split_info_str{reinterpret_cast(split_info_a.elems()), split_info_size}; + substrait::ReadRel::ExtensionTable extension_table = local_engine::SerializedPlanParser::parseExtensionTable(split_info_str); google::protobuf::StringValue table; table.ParseFromString(extension_table.detail().value()); @@ -1130,10 +1073,7 @@ JNIEXPORT jstring Java_org_apache_spark_sql_execution_datasources_CHDatasourceJn auto json_info = local_engine::SparkMergeTreeWriter::partInfosToJson(res); - env->ReleaseByteArrayElements(plan_, plan_buf_addr, JNI_ABORT); - env->ReleaseByteArrayElements(split_info_, split_info_addr, JNI_ABORT); - - return stringTojstring(env, json_info.c_str()); + return local_engine::charTojstring(env, json_info.c_str()); LOCAL_ENGINE_JNI_METHOD_END(env, nullptr) } @@ -1143,18 +1083,15 @@ JNIEXPORT jobject Java_org_apache_spark_sql_execution_datasources_CHDatasourceJn { LOCAL_ENGINE_JNI_METHOD_START auto * block = reinterpret_cast(blockAddress); - int * pIndice = env->GetIntArrayElements(partitionColIndice, nullptr); - int size = env->GetArrayLength(partitionColIndice); + auto safeArray = local_engine::getIntArrayElementsSafe(env, partitionColIndice); std::vector partition_col_indice_vec; - for (int i = 0; i < size; ++i) - partition_col_indice_vec.push_back(pIndice[i]); + for (int i = 0; i < safeArray.length(); ++i) + partition_col_indice_vec.push_back(safeArray.elems()[i]); - env->ReleaseIntArrayElements(partitionColIndice, pIndice, JNI_ABORT); local_engine::BlockStripes bs = local_engine::BlockStripeSplitter::split(*block, partition_col_indice_vec, hasBucket, reserve_partition_columns); - auto * addresses = env->NewLongArray(bs.block_addresses.size()); env->SetLongArrayRegion(addresses, 0, bs.block_addresses.size(), bs.block_addresses.data()); auto * indices = env->NewIntArray(bs.heading_row_indice.size()); @@ -1181,18 +1118,15 @@ JNIEXPORT jlong Java_org_apache_gluten_vectorized_StorageJoinBuilder_nativeBuild LOCAL_ENGINE_JNI_METHOD_START const auto hash_table_id = jstring2string(env, key); const auto join_key = jstring2string(env, join_key_); - const jsize struct_size = env->GetArrayLength(named_struct); - jbyte * struct_address = env->GetByteArrayElements(named_struct, nullptr); - std::string struct_string; - struct_string.assign(reinterpret_cast(struct_address), struct_size); - const auto join_type = static_cast(join_type_); + const auto named_struct_a = local_engine::getByteArrayElementsSafe(env, named_struct); + const std::string::size_type struct_size = named_struct_a.length(); + std::string struct_string{reinterpret_cast(named_struct_a.elems()), struct_size}; const jsize length = env->GetArrayLength(in); local_engine::ReadBufferFromByteArray read_buffer_from_java_array(in, length); DB::CompressedReadBuffer input(read_buffer_from_java_array); local_engine::configureCompressedReadBuffer(input); const auto * obj = make_wrapper(local_engine::BroadCastJoinBuilder::buildJoin( - hash_table_id, input, row_count_, join_key, join_type, has_mixed_join_condition, struct_string)); - env->ReleaseByteArrayElements(named_struct, struct_address, JNI_ABORT); + hash_table_id, input, row_count_, join_key, join_type_, has_mixed_join_condition, struct_string)); return obj->instance(); LOCAL_ENGINE_JNI_METHOD_END(env, 0) } @@ -1321,12 +1255,10 @@ Java_org_apache_gluten_vectorized_SimpleExpressionEval_createNativeInstance(JNIE local_engine::SerializedPlanParser parser(context); jobject iter = env->NewGlobalRef(input); parser.addInputIter(iter, false); - std::string::size_type plan_size = env->GetArrayLength(plan); - jbyte * plan_address = env->GetByteArrayElements(plan, nullptr); + const auto plan_a = local_engine::getByteArrayElementsSafe(env, plan); + const std::string::size_type plan_size = plan_a.length(); local_engine::LocalExecutor * executor - = parser.createExecutor({reinterpret_cast(plan_address), plan_size}).release(); - local_engine::LocalExecutor::addExecutor(executor); - env->ReleaseByteArrayElements(plan, plan_address, JNI_ABORT); + = parser.createExecutor({reinterpret_cast(plan_a.elems()), plan_size}).release(); return reinterpret_cast(executor); LOCAL_ENGINE_JNI_METHOD_END(env, -1) } @@ -1334,7 +1266,6 @@ Java_org_apache_gluten_vectorized_SimpleExpressionEval_createNativeInstance(JNIE JNIEXPORT void Java_org_apache_gluten_vectorized_SimpleExpressionEval_nativeClose(JNIEnv * env, jclass, jlong instance) { LOCAL_ENGINE_JNI_METHOD_START - local_engine::LocalExecutor::removeExecutor(instance); local_engine::LocalExecutor * executor = reinterpret_cast(instance); delete executor; LOCAL_ENGINE_JNI_METHOD_END(env, ) diff --git a/cpp-ch/local-engine/tests/benchmark_local_engine.cpp b/cpp-ch/local-engine/tests/benchmark_local_engine.cpp index 208a3b518d450..43cdab8a41fa4 100644 --- a/cpp-ch/local-engine/tests/benchmark_local_engine.cpp +++ b/cpp-ch/local-engine/tests/benchmark_local_engine.cpp @@ -21,7 +21,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/cpp-ch/local-engine/tests/data/54881.snappy.parquet b/cpp-ch/local-engine/tests/data/54881.snappy.parquet new file mode 100644 index 0000000000000..0bc4860c90f8f Binary files /dev/null and b/cpp-ch/local-engine/tests/data/54881.snappy.parquet differ diff --git a/cpp-ch/local-engine/tests/gluten_test_util.h b/cpp-ch/local-engine/tests/gluten_test_util.h index dba4496d6221b..338d53be788a8 100644 --- a/cpp-ch/local-engine/tests/gluten_test_util.h +++ b/cpp-ch/local-engine/tests/gluten_test_util.h @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -32,6 +33,9 @@ using BlockFieldType = DB::ColumnWithTypeAndName; using AnotherRowType = DB::NamesAndTypesList; using AnotherFieldType = DB::NameAndTypePair; + +#define GLUTEN_DATA_DIR(file) "file://" SOURCE_DIR file + namespace parquet { class ColumnDescriptor; @@ -80,6 +84,12 @@ std::string JsonStringToBinary(const std::string_view & json) } } +inline std::string replaceLocalFilesWildcards(const String & haystack, const String & replaced) +{ + static constexpr auto _WILDCARD_ = "{replace_local_files}"; + return boost::replace_all_copy(haystack, _WILDCARD_, replaced); +} + inline DB::DataTypePtr BIGINT() { return std::make_shared(); diff --git a/cpp-ch/local-engine/tests/gtest_ch_join.cpp b/cpp-ch/local-engine/tests/gtest_ch_join.cpp index 739390302b46a..3202fb235a5f5 100644 --- a/cpp-ch/local-engine/tests/gtest_ch_join.cpp +++ b/cpp-ch/local-engine/tests/gtest_ch_join.cpp @@ -31,11 +31,11 @@ #include #include -#include +#include +#include #include #include - using namespace DB; using namespace local_engine; @@ -95,17 +95,13 @@ TEST(TestJoin, simple) ASTPtr rkey = std::make_shared("colD"); join->addOnKeys(lkey, rkey, false); for (const auto & column : join->columnsFromJoinedTable()) - { join->addJoinedColumn(column); - } auto left_keys = left.getNamesAndTypesList(); join->addJoinedColumnsAndCorrectTypes(left_keys, true); std::cerr << "after join:\n"; for (const auto & key : left_keys) - { std::cerr << key.dump() << std::endl; - } ActionsDAGPtr left_convert_actions = nullptr; ActionsDAGPtr right_convert_actions = nullptr; std::tie(left_convert_actions, right_convert_actions) diff --git a/cpp-ch/local-engine/tests/gtest_clickhouse_54881.cpp b/cpp-ch/local-engine/tests/gtest_clickhouse_54881.cpp new file mode 100644 index 0000000000000..69966ef93c0b1 --- /dev/null +++ b/cpp-ch/local-engine/tests/gtest_clickhouse_54881.cpp @@ -0,0 +1,83 @@ +/* + * 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. + */ +#include +#include +#include +#include +#include +#include + + +using namespace local_engine; + +using namespace DB; + +// Plan for https://github.com/ClickHouse/ClickHouse/pull/54881 +INCBIN(resource_embedded_pr_54881_json, SOURCE_DIR "/utils/extern-local-engine/tests/json/clickhouse_pr_54881.json"); + +TEST(Clickhouse, PR54881) +{ + const auto context1 = DB::Context::createCopy(SerializedPlanParser::global_context); + // context1->setSetting("enable_named_columns_in_function_tuple", DB::Field(true)); + auto settingxs = context1->getSettingsRef(); + EXPECT_FALSE(settingxs.enable_named_columns_in_function_tuple) << "GLUTEN NEED set enable_named_columns_in_function_tuple to false"; + + const std::string split_template + = R"({"items":[{"uriFile":"{replace_local_files}","partitionIndex":"0","length":"1529","parquet":{},"schema":{},"metadataColumns":[{}]}]})"; + const std::string split + = replaceLocalFilesWildcards(split_template, GLUTEN_DATA_DIR("/utils/extern-local-engine/tests/data/54881.snappy.parquet")); + + SerializedPlanParser parser(context1); + parser.addSplitInfo(test::pb_util::JsonStringToBinary(split)); + + const auto local_executor = parser.createExecutor( + {reinterpret_cast(gresource_embedded_pr_54881_jsonData), gresource_embedded_pr_54881_jsonSize}); + + EXPECT_TRUE(local_executor->hasNext()); + const Block & block = *local_executor->nextColumnar(); + + debug::headBlock(block); + + EXPECT_EQ(2, block.columns()); + const auto & col_0 = *(block.getColumns()[0]); + EXPECT_EQ(col_0.getInt(0), 9); + EXPECT_EQ(col_0.getInt(1), 10); + + Field field; + const auto & col_1 = *(block.getColumns()[1]); + col_1.get(0, field); + const Tuple & row_0 = field.get(); + EXPECT_EQ(2, row_0.size()); + + Int64 actual{-1}; + EXPECT_TRUE(row_0[0].tryGet(actual)); + EXPECT_EQ(9, actual); + + EXPECT_TRUE(row_0[1].tryGet(actual)); + EXPECT_EQ(10, actual); + + col_1.get(1, field); + const Tuple & row_1 = field.get(); + EXPECT_EQ(2, row_1.size()); + EXPECT_TRUE(row_1[0].tryGet(actual)); + EXPECT_EQ(10, actual); + + EXPECT_TRUE(row_1[1].tryGet(actual)); + EXPECT_EQ(11, actual); + + EXPECT_FALSE(local_executor->hasNext()); +} diff --git a/cpp-ch/local-engine/tests/gtest_parquet_columnindex.cpp b/cpp-ch/local-engine/tests/gtest_parquet_columnindex.cpp index bdaa51f974c52..76c0d028a58e2 100644 --- a/cpp-ch/local-engine/tests/gtest_parquet_columnindex.cpp +++ b/cpp-ch/local-engine/tests/gtest_parquet_columnindex.cpp @@ -28,6 +28,7 @@ #include #include +#include #include #include #include diff --git a/cpp-ch/local-engine/tests/gtest_parser.cpp b/cpp-ch/local-engine/tests/gtest_parser.cpp index 485740191ea31..aaaa3679ab94e 100644 --- a/cpp-ch/local-engine/tests/gtest_parser.cpp +++ b/cpp-ch/local-engine/tests/gtest_parser.cpp @@ -16,6 +16,7 @@ */ #include #include +#include #include #include @@ -138,6 +139,7 @@ TEST(LocalExecutor, StorageFileSink) metadata.setColumns(ColumnsDescription::fromNamesAndTypes({{"name", STRING()}, {"value", UINT()}})); StorageMetadataPtr metadata_ptr = std::make_shared(metadata); + /* auto sink = createFilelinkSink( metadata_ptr, "test_table", @@ -150,4 +152,5 @@ TEST(LocalExecutor, StorageFileSink) sink->consume(testChunk()); sink->onFinish(); + */ } \ No newline at end of file diff --git a/cpp-ch/local-engine/tests/json/clickhouse_pr_54881.json b/cpp-ch/local-engine/tests/json/clickhouse_pr_54881.json new file mode 100644 index 0000000000000..64a5b2aba9782 --- /dev/null +++ b/cpp-ch/local-engine/tests/json/clickhouse_pr_54881.json @@ -0,0 +1,379 @@ +{ + "extensions": [ + { + "extensionFunction": { + "functionAnchor": 2, + "name": "gt:i64_i64" + } + }, + { + "extensionFunction": { + "functionAnchor": 4, + "name": "alias:struct" + } + }, + { + "extensionFunction": { + "functionAnchor": 5, + "name": "named_struct:str_i64_str_i64" + } + }, + { + "extensionFunction": { + "functionAnchor": 1, + "name": "is_not_null:i64" + } + }, + { + "extensionFunction": { + "name": "and:bool_bool" + } + }, + { + "extensionFunction": { + "functionAnchor": 3, + "name": "alias:i64" + } + } + ], + "relations": [ + { + "root": { + "input": { + "project": { + "common": { + "emit": { + "outputMapping": [ + 2, + 3 + ] + } + }, + "input": { + "filter": { + "common": { + "direct": {} + }, + "input": { + "read": { + "common": { + "direct": {} + }, + "baseSchema": { + "names": [ + "i1", + "i2" + ], + "struct": { + "types": [ + { + "i64": { + "nullability": "NULLABILITY_NULLABLE" + } + }, + { + "i64": { + "nullability": "NULLABILITY_NULLABLE" + } + } + ] + }, + "columnTypes": [ + "NORMAL_COL", + "NORMAL_COL" + ] + }, + "filter": { + "scalarFunction": { + "outputType": { + "bool": { + "nullability": "NULLABILITY_NULLABLE" + } + }, + "arguments": [ + { + "value": { + "scalarFunction": { + "functionReference": 1, + "outputType": { + "bool": { + "nullability": "NULLABILITY_REQUIRED" + } + }, + "arguments": [ + { + "value": { + "selection": { + "directReference": { + "structField": {} + } + } + } + } + ] + } + } + }, + { + "value": { + "scalarFunction": { + "functionReference": 2, + "outputType": { + "bool": { + "nullability": "NULLABILITY_NULLABLE" + } + }, + "arguments": [ + { + "value": { + "selection": { + "directReference": { + "structField": {} + } + } + } + }, + { + "value": { + "literal": { + "i64": "8" + } + } + } + ] + } + } + } + ] + } + }, + "advancedExtension": { + "optimization": { + "@type": "type.googleapis.com/google.protobuf.StringValue", + "value": "isMergeTree=0\n" + } + } + } + }, + "condition": { + "scalarFunction": { + "outputType": { + "bool": { + "nullability": "NULLABILITY_NULLABLE" + } + }, + "arguments": [ + { + "value": { + "scalarFunction": { + "functionReference": 1, + "outputType": { + "bool": { + "nullability": "NULLABILITY_REQUIRED" + } + }, + "arguments": [ + { + "value": { + "selection": { + "directReference": { + "structField": {} + } + } + } + } + ] + } + } + }, + { + "value": { + "scalarFunction": { + "functionReference": 2, + "outputType": { + "bool": { + "nullability": "NULLABILITY_NULLABLE" + } + }, + "arguments": [ + { + "value": { + "selection": { + "directReference": { + "structField": {} + } + } + } + }, + { + "value": { + "literal": { + "i64": "8" + } + } + } + ] + } + } + } + ] + } + } + } + }, + "expressions": [ + { + "scalarFunction": { + "functionReference": 3, + "outputType": { + "i64": { + "nullability": "NULLABILITY_NULLABLE" + } + }, + "arguments": [ + { + "value": { + "selection": { + "directReference": { + "structField": {} + } + } + } + } + ] + } + }, + { + "scalarFunction": { + "functionReference": 4, + "outputType": { + "struct": { + "types": [ + { + "i64": { + "nullability": "NULLABILITY_NULLABLE" + } + }, + { + "i64": { + "nullability": "NULLABILITY_NULLABLE" + } + } + ], + "nullability": "NULLABILITY_REQUIRED", + "names": [ + "a", + "b" + ] + } + }, + "arguments": [ + { + "value": { + "scalarFunction": { + "functionReference": 5, + "outputType": { + "struct": { + "types": [ + { + "i64": { + "nullability": "NULLABILITY_NULLABLE" + } + }, + { + "i64": { + "nullability": "NULLABILITY_NULLABLE" + } + } + ], + "nullability": "NULLABILITY_REQUIRED", + "names": [ + "a", + "b" + ] + } + }, + "arguments": [ + { + "value": { + "literal": { + "string": "a" + } + } + }, + { + "value": { + "selection": { + "directReference": { + "structField": {} + } + } + } + }, + { + "value": { + "literal": { + "string": "b" + } + } + }, + { + "value": { + "selection": { + "directReference": { + "structField": { + "field": 1 + } + } + } + } + } + ] + } + } + } + ] + } + } + ] + } + }, + "names": [ + "a#73", + "col1#67" + ], + "outputSchema": { + "types": [ + { + "i64": { + "nullability": "NULLABILITY_NULLABLE" + } + }, + { + "struct": { + "types": [ + { + "i64": { + "nullability": "NULLABILITY_NULLABLE" + } + }, + { + "i64": { + "nullability": "NULLABILITY_NULLABLE" + } + } + ], + "nullability": "NULLABILITY_REQUIRED", + "names": [ + "a", + "b" + ] + } + } + ], + "nullability": "NULLABILITY_REQUIRED" + } + } + } + ] +} \ No newline at end of file diff --git a/cpp/CMake/ConfigArrow.cmake b/cpp/CMake/ConfigArrow.cmake index 110836347cacc..1de4ba40633f9 100644 --- a/cpp/CMake/ConfigArrow.cmake +++ b/cpp/CMake/ConfigArrow.cmake @@ -15,48 +15,36 @@ # specific language governing permissions and limitations # under the License. -if(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") - set(ARROW_SHARED_LIBRARY_SUFFIX ".1500.dylib") - set(ARROW_SHARED_LIBRARY_PARENT_SUFFIX ".1500.1.0.dylib") -else() - set(ARROW_SHARED_LIBRARY_SUFFIX ".so.1500") - set(ARROW_SHARED_LIBRARY_PARENT_SUFFIX ".so.1500.1.0") -endif() +set(ARROW_STATIC_LIBRARY_SUFFIX ".a") set(ARROW_LIB_NAME "arrow") set(PARQUET_LIB_NAME "parquet") -set(ARROW_DATASET_LIB_NAME "arrow_dataset") -set(ARROW_SUBSTRAIT_LIB_NAME "arrow_substrait") +set(ARROW_BUNDLED_DEPS "arrow_bundled_dependencies") + +set(ARROW_INSTALL_DIR "${ARROW_HOME}/install") +set(ARROW_LIB_DIR "${ARROW_INSTALL_DIR}/lib") +set(ARROW_LIB64_DIR "${ARROW_INSTALL_DIR}/lib64") function(FIND_ARROW_LIB LIB_NAME) if(NOT TARGET Arrow::${LIB_NAME}) set(ARROW_LIB_FULL_NAME - ${CMAKE_SHARED_LIBRARY_PREFIX}${LIB_NAME}${ARROW_SHARED_LIBRARY_SUFFIX}) - add_library(Arrow::${LIB_NAME} SHARED IMPORTED) - # Firstly find the lib from velox's arrow build path. If not found, try to - # find it from system. + ${CMAKE_SHARED_LIBRARY_PREFIX}${LIB_NAME}${ARROW_STATIC_LIBRARY_SUFFIX}) + add_library(Arrow::${LIB_NAME} STATIC IMPORTED) + # Firstly find the lib from bundled path in Velox. If not found, try to find + # it from system. find_library( ARROW_LIB_${LIB_NAME} NAMES ${ARROW_LIB_FULL_NAME} - PATHS ${ARROW_LIB_DIR} ${ARROW_LIB64_DIR}) + PATHS ${ARROW_LIB_DIR} ${ARROW_LIB64_DIR} + NO_DEFAULT_PATH) + if(NOT ARROW_LIB_${LIB_NAME}) + find_library(ARROW_LIB_${LIB_NAME} NAMES ${ARROW_LIB_FULL_NAME}) + endif() if(NOT ARROW_LIB_${LIB_NAME}) message(FATAL_ERROR "Arrow library Not Found: ${ARROW_LIB_FULL_NAME}") - else() - message(STATUS "Found Arrow library: ${ARROW_LIB_${LIB_NAME}}") - set_target_properties( - Arrow::${LIB_NAME} - PROPERTIES IMPORTED_LOCATION "${ARROW_LIB_${LIB_NAME}}" - INTERFACE_INCLUDE_DIRECTORIES - "${ARROW_HOME}/install/include") endif() - file( - COPY ${ARROW_LIB_${LIB_NAME}} - DESTINATION ${root_directory}/releases/ - FOLLOW_SYMLINK_CHAIN) + message(STATUS "Found Arrow library: ${ARROW_LIB_${LIB_NAME}}") + set_target_properties(Arrow::${LIB_NAME} + PROPERTIES IMPORTED_LOCATION ${ARROW_LIB_${LIB_NAME}}) endif() endfunction() - -set(ARROW_INSTALL_DIR "${ARROW_HOME}/install") -set(ARROW_LIB_DIR "${ARROW_INSTALL_DIR}/lib") -set(ARROW_LIB64_DIR "${ARROW_INSTALL_DIR}/lib64") -set(ARROW_INCLUDE_DIR "${ARROW_INSTALL_DIR}/include") diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 3ee336dd6a14b..c5cbab0697bf4 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -68,9 +68,13 @@ if(NOT DEFINED VELOX_HOME) endif() if(${CMAKE_BUILD_TYPE} STREQUAL "Debug") - set(ARROW_HOME ${VELOX_HOME}/_build/debug/third_party/arrow_ep) + set(ARROW_HOME + ${VELOX_HOME}/_build/debug/CMake/resolve_dependency_modules/arrow/arrow_ep/ + ) else() - set(ARROW_HOME ${VELOX_HOME}/_build/release/third_party/arrow_ep) + set(ARROW_HOME + ${VELOX_HOME}/_build/release/CMake/resolve_dependency_modules/arrow/arrow_ep + ) endif() include(ResolveDependency) diff --git a/cpp/core/CMakeLists.txt b/cpp/core/CMakeLists.txt index e17d135811059..cc5b6c7e926df 100644 --- a/cpp/core/CMakeLists.txt +++ b/cpp/core/CMakeLists.txt @@ -238,6 +238,7 @@ endif() find_arrow_lib(${ARROW_LIB_NAME}) find_arrow_lib(${PARQUET_LIB_NAME}) +find_arrow_lib(${ARROW_BUNDLED_DEPS}) if(ENABLE_HBM) include(BuildMemkind) @@ -314,7 +315,8 @@ else() set(LIBHDFS3_DESTINATION ${CMAKE_INSTALL_LIBDIR}) endif() -target_link_libraries(gluten PUBLIC Arrow::arrow Arrow::parquet) +target_link_libraries(gluten PUBLIC Arrow::parquet Arrow::arrow + Arrow::arrow_bundled_dependencies) target_link_libraries(gluten PRIVATE google::glog) install(TARGETS gluten DESTINATION ${CMAKE_INSTALL_LIBDIR}) diff --git a/cpp/core/config/GlutenConfig.h b/cpp/core/config/GlutenConfig.h index d8abe9f2bf671..c8eb595e4bb03 100644 --- a/cpp/core/config/GlutenConfig.h +++ b/cpp/core/config/GlutenConfig.h @@ -30,10 +30,10 @@ const std::string kGlutenSaveDir = "spark.gluten.saveDir"; const std::string kCaseSensitive = "spark.sql.caseSensitive"; -const std::string kLegacySize = "spark.sql.legacy.sizeOfNull"; - const std::string kSessionTimezone = "spark.sql.session.timeZone"; +const std::string kAllowPrecisionLoss = "spark.sql.decimalOperations.allowPrecisionLoss"; + const std::string kIgnoreMissingFiles = "spark.sql.files.ignoreMissingFiles"; const std::string kDefaultSessionTimezone = "spark.gluten.sql.session.timeZone.default"; diff --git a/cpp/core/jni/JniWrapper.cc b/cpp/core/jni/JniWrapper.cc index 3c082e07dbe56..90d669fa86d8c 100644 --- a/cpp/core/jni/JniWrapper.cc +++ b/cpp/core/jni/JniWrapper.cc @@ -404,8 +404,6 @@ JNIEXPORT jboolean JNICALL Java_org_apache_gluten_vectorized_ColumnarBatchOutIte jobject wrapper, jlong iterHandle) { JNI_METHOD_START - auto ctx = gluten::getRuntime(env, wrapper); - auto iter = ObjectStore::retrieve(iterHandle); if (iter == nullptr) { std::string errorMessage = @@ -441,8 +439,6 @@ JNIEXPORT jobject JNICALL Java_org_apache_gluten_vectorized_ColumnarBatchOutIter jobject wrapper, jlong iterHandle) { JNI_METHOD_START - auto ctx = gluten::getRuntime(env, wrapper); - auto iter = ObjectStore::retrieve(iterHandle); auto metrics = iter->getMetrics(); unsigned int numMetrics = 0; @@ -502,8 +498,6 @@ JNIEXPORT jlong JNICALL Java_org_apache_gluten_vectorized_ColumnarBatchOutIterat jlong iterHandle, jlong size) { JNI_METHOD_START - auto ctx = gluten::getRuntime(env, wrapper); - auto it = ObjectStore::retrieve(iterHandle); if (it == nullptr) { std::string errorMessage = "Invalid result iter handle " + std::to_string(iterHandle); @@ -518,8 +512,6 @@ JNIEXPORT void JNICALL Java_org_apache_gluten_vectorized_ColumnarBatchOutIterato jobject wrapper, jlong iterHandle) { JNI_METHOD_START - auto ctx = gluten::getRuntime(env, wrapper); - ObjectStore::release(iterHandle); JNI_METHOD_END() } @@ -544,7 +536,6 @@ Java_org_apache_gluten_vectorized_NativeColumnarToRowJniWrapper_nativeColumnarTo jlong batchHandle, jlong rowId) { JNI_METHOD_START - auto ctx = gluten::getRuntime(env, wrapper); auto columnarToRowConverter = ObjectStore::retrieve(c2rHandle); auto cb = ObjectStore::retrieve(batchHandle); columnarToRowConverter->convert(cb); @@ -591,8 +582,6 @@ JNIEXPORT void JNICALL Java_org_apache_gluten_vectorized_NativeColumnarToRowJniW jobject wrapper, jlong c2rHandle) { JNI_METHOD_START - auto ctx = gluten::getRuntime(env, wrapper); - ObjectStore::release(c2rHandle); JNI_METHOD_END() } @@ -636,8 +625,6 @@ JNIEXPORT void JNICALL Java_org_apache_gluten_vectorized_NativeRowToColumnarJniW jobject wrapper, jlong r2cHandle) { JNI_METHOD_START - auto ctx = gluten::getRuntime(env, wrapper); - ObjectStore::release(r2cHandle); JNI_METHOD_END() } @@ -647,7 +634,6 @@ JNIEXPORT jstring JNICALL Java_org_apache_gluten_columnarbatch_ColumnarBatchJniW jobject wrapper, jlong batchHandle) { JNI_METHOD_START - auto ctx = gluten::getRuntime(env, wrapper); auto batch = ObjectStore::retrieve(batchHandle); return env->NewStringUTF(batch->getType().c_str()); JNI_METHOD_END(nullptr) @@ -658,7 +644,6 @@ JNIEXPORT jlong JNICALL Java_org_apache_gluten_columnarbatch_ColumnarBatchJniWra jobject wrapper, jlong batchHandle) { JNI_METHOD_START - auto ctx = gluten::getRuntime(env, wrapper); auto batch = ObjectStore::retrieve(batchHandle); return batch->numBytes(); JNI_METHOD_END(kInvalidObjectHandle) @@ -669,7 +654,6 @@ JNIEXPORT jlong JNICALL Java_org_apache_gluten_columnarbatch_ColumnarBatchJniWra jobject wrapper, jlong batchHandle) { JNI_METHOD_START - auto ctx = gluten::getRuntime(env, wrapper); auto batch = ObjectStore::retrieve(batchHandle); return batch->numColumns(); JNI_METHOD_END(kInvalidObjectHandle) @@ -680,7 +664,6 @@ JNIEXPORT jlong JNICALL Java_org_apache_gluten_columnarbatch_ColumnarBatchJniWra jobject wrapper, jlong batchHandle) { JNI_METHOD_START - auto ctx = gluten::getRuntime(env, wrapper); auto batch = ObjectStore::retrieve(batchHandle); return batch->numRows(); JNI_METHOD_END(kInvalidObjectHandle) @@ -714,7 +697,6 @@ JNIEXPORT void JNICALL Java_org_apache_gluten_columnarbatch_ColumnarBatchJniWrap jlong cSchema, jlong cArray) { JNI_METHOD_START - auto ctx = gluten::getRuntime(env, wrapper); auto batch = ObjectStore::retrieve(batchHandle); std::shared_ptr exportedSchema = batch->exportArrowSchema(); std::shared_ptr exportedArray = batch->exportArrowArray(); @@ -772,24 +754,11 @@ JNIEXPORT jlong JNICALL Java_org_apache_gluten_columnarbatch_ColumnarBatchJniWra JNI_METHOD_END(kInvalidObjectHandle) } -JNIEXPORT jlong JNICALL Java_org_apache_gluten_columnarbatch_ColumnarBatchJniWrapper_obtainOwnership( // NOLINT - JNIEnv* env, - jobject wrapper, - jlong batchHandle) { - JNI_METHOD_START - auto ctx = gluten::getRuntime(env, wrapper); - auto batch = ObjectStore::retrieve(batchHandle); - auto newHandle = ctx->saveObject(batch); - return newHandle; - JNI_METHOD_END(-1L) -} - JNIEXPORT void JNICALL Java_org_apache_gluten_columnarbatch_ColumnarBatchJniWrapper_close( // NOLINT JNIEnv* env, jobject wrapper, jlong batchHandle) { JNI_METHOD_START - auto ctx = gluten::getRuntime(env, wrapper); ObjectStore::release(batchHandle); JNI_METHOD_END() } @@ -934,8 +903,6 @@ JNIEXPORT jlong JNICALL Java_org_apache_gluten_vectorized_ShuffleWriterJniWrappe jlong size, jboolean callBySelf) { JNI_METHOD_START - auto ctx = gluten::getRuntime(env, wrapper); - auto shuffleWriter = ObjectStore::retrieve(shuffleWriterHandle); if (!shuffleWriter) { std::string errorMessage = "Invalid shuffle writer handle " + std::to_string(shuffleWriterHandle); @@ -956,8 +923,6 @@ JNIEXPORT jlong JNICALL Java_org_apache_gluten_vectorized_ShuffleWriterJniWrappe jlong batchHandle, jlong memLimit) { JNI_METHOD_START - auto ctx = gluten::getRuntime(env, wrapper); - auto shuffleWriter = ObjectStore::retrieve(shuffleWriterHandle); if (!shuffleWriter) { std::string errorMessage = "Invalid shuffle writer handle " + std::to_string(shuffleWriterHandle); @@ -977,8 +942,6 @@ JNIEXPORT jobject JNICALL Java_org_apache_gluten_vectorized_ShuffleWriterJniWrap jobject wrapper, jlong shuffleWriterHandle) { JNI_METHOD_START - auto ctx = gluten::getRuntime(env, wrapper); - auto shuffleWriter = ObjectStore::retrieve(shuffleWriterHandle); if (!shuffleWriter) { std::string errorMessage = "Invalid shuffle writer handle " + std::to_string(shuffleWriterHandle); @@ -1019,8 +982,6 @@ JNIEXPORT void JNICALL Java_org_apache_gluten_vectorized_ShuffleWriterJniWrapper jobject wrapper, jlong shuffleWriterHandle) { JNI_METHOD_START - auto ctx = gluten::getRuntime(env, wrapper); - ObjectStore::release(shuffleWriterHandle); JNI_METHOD_END() } @@ -1087,8 +1048,6 @@ JNIEXPORT void JNICALL Java_org_apache_gluten_vectorized_ShuffleReaderJniWrapper jlong shuffleReaderHandle, jobject metrics) { JNI_METHOD_START - auto ctx = gluten::getRuntime(env, wrapper); - auto reader = ObjectStore::retrieve(shuffleReaderHandle); env->CallVoidMethod(metrics, shuffleReaderMetricsSetDecompressTime, reader->getDecompressTime()); env->CallVoidMethod(metrics, shuffleReaderMetricsSetDeserializeTime, reader->getDeserializeTime()); @@ -1102,8 +1061,6 @@ JNIEXPORT void JNICALL Java_org_apache_gluten_vectorized_ShuffleReaderJniWrapper jobject wrapper, jlong shuffleReaderHandle) { JNI_METHOD_START - auto ctx = gluten::getRuntime(env, wrapper); - auto reader = ObjectStore::retrieve(shuffleReaderHandle); GLUTEN_THROW_NOT_OK(reader->close()); ObjectStore::release(shuffleReaderHandle); @@ -1145,8 +1102,6 @@ JNIEXPORT void JNICALL Java_org_apache_gluten_datasource_DatasourceJniWrapper_in jlong dsHandle, jlong cSchema) { JNI_METHOD_START - auto ctx = gluten::getRuntime(env, wrapper); - auto datasource = ObjectStore::retrieve(dsHandle); datasource->inspectSchema(reinterpret_cast(cSchema)); JNI_METHOD_END() @@ -1157,8 +1112,6 @@ JNIEXPORT void JNICALL Java_org_apache_gluten_datasource_DatasourceJniWrapper_cl jobject wrapper, jlong dsHandle) { JNI_METHOD_START - auto ctx = gluten::getRuntime(env, wrapper); - auto datasource = ObjectStore::retrieve(dsHandle); datasource->close(); ObjectStore::release(dsHandle); @@ -1286,8 +1239,6 @@ JNIEXPORT void JNICALL Java_org_apache_gluten_vectorized_ColumnarBatchSerializer jobject wrapper, jlong serializerHandle) { JNI_METHOD_START - auto ctx = gluten::getRuntime(env, wrapper); - ObjectStore::release(serializerHandle); JNI_METHOD_END() } diff --git a/cpp/velox/CMakeLists.txt b/cpp/velox/CMakeLists.txt index 716a5f68a91c3..a121b003d7c88 100644 --- a/cpp/velox/CMakeLists.txt +++ b/cpp/velox/CMakeLists.txt @@ -590,11 +590,6 @@ endif() target_link_libraries(velox PUBLIC gluten) add_velox_dependencies() -# Arrow libraries appear after Velox dependencies to avoid linker error -find_arrow_lib(${ARROW_LIB_NAME}) -find_arrow_lib(${PARQUET_LIB_NAME}) -target_link_libraries(velox PUBLIC Arrow::arrow Arrow::parquet) - target_link_libraries(velox PUBLIC Folly::folly) find_re2() target_link_libraries(velox PUBLIC ${RE2_LIBRARY}) @@ -619,21 +614,6 @@ else() endif() set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES_BCK}) -if(ENABLE_GLUTEN_VCPKG) - find_package(Thrift CONFIG) -else() - # Prefer the shared library on system. - set(ARROW_THRIFT_USE_SHARED ON) - find_package(Thrift) -endif() - -if(Thrift_FOUND) - target_link_libraries(velox PUBLIC thrift::thrift) -else() - add_velox_dependency( - thrift "${ARROW_HOME}/src/arrow_ep-build/thrift_ep-install/lib/libthrift.a") -endif() - if(BUILD_TESTS) add_subdirectory(tests) endif() diff --git a/cpp/velox/compute/VeloxPlanConverter.cc b/cpp/velox/compute/VeloxPlanConverter.cc index bcd03b110afd9..ed2545c78114d 100644 --- a/cpp/velox/compute/VeloxPlanConverter.cc +++ b/cpp/velox/compute/VeloxPlanConverter.cc @@ -36,18 +36,7 @@ VeloxPlanConverter::VeloxPlanConverter( bool validationMode) : validationMode_(validationMode), substraitVeloxPlanConverter_(veloxPool, confMap, writeFilesTempPath, validationMode) { - // avoid include RowVectorStream.h in SubstraitToVeloxPlan.cpp, it may cause redefinition of array abi.h. - auto factory = [inputIters = std::move(inputIters), validationMode = validationMode]( - std::string nodeId, memory::MemoryPool* pool, int32_t streamIdx, RowTypePtr outputType) { - std::shared_ptr iterator; - if (!validationMode) { - VELOX_CHECK_LT(streamIdx, inputIters.size(), "Could not find stream index {} in input iterator list.", streamIdx); - iterator = inputIters[streamIdx]; - } - auto valueStream = std::make_shared(pool, iterator, outputType); - return std::make_shared(nodeId, outputType, std::move(valueStream)); - }; - substraitVeloxPlanConverter_.setValueStreamNodeFactory(std::move(factory)); + substraitVeloxPlanConverter_.setInputIters(std::move(inputIters)); } namespace { @@ -81,7 +70,12 @@ std::shared_ptr parseScanSplitInfo( splitInfo->paths.emplace_back(file.uri_file()); splitInfo->starts.emplace_back(file.start()); splitInfo->lengths.emplace_back(file.length()); - facebook::velox::FileProperties fileProps = {file.properties().filesize(), file.properties().modificationtime()}; + + facebook::velox::FileProperties fileProps; + if (file.has_properties()) { + fileProps.fileSize = file.properties().filesize(); + fileProps.modificationTime = file.properties().modificationtime(); + } splitInfo->properties.emplace_back(fileProps); switch (file.file_format_case()) { case SubstraitFileFormatCase::kOrc: diff --git a/cpp/velox/compute/WholeStageResultIterator.cc b/cpp/velox/compute/WholeStageResultIterator.cc index cbc6c838b1b73..8439545ca3828 100644 --- a/cpp/velox/compute/WholeStageResultIterator.cc +++ b/cpp/velox/compute/WholeStageResultIterator.cc @@ -454,8 +454,10 @@ std::unordered_map WholeStageResultIterator::getQueryC } // Adjust timestamp according to the above configured session timezone. configs[velox::core::QueryConfig::kAdjustTimestampToTimezone] = "true"; - // Align Velox size function with Spark. - configs[velox::core::QueryConfig::kSparkLegacySizeOfNull] = std::to_string(veloxCfg_->get(kLegacySize, true)); + + // To align with Spark's behavior, allow decimal precision loss or not. + configs[velox::core::QueryConfig::kSparkDecimalOperationsAllowPrecisionLoss] = + veloxCfg_->get(kAllowPrecisionLoss, "true"); { // partial aggregation memory config diff --git a/cpp/velox/jni/VeloxJniWrapper.cc b/cpp/velox/jni/VeloxJniWrapper.cc index f11edf1a435d7..f9387188bc69d 100644 --- a/cpp/velox/jni/VeloxJniWrapper.cc +++ b/cpp/velox/jni/VeloxJniWrapper.cc @@ -184,7 +184,6 @@ JNIEXPORT void JNICALL Java_org_apache_gluten_utils_VeloxBloomFilterJniWrapper_i jlong handle, jlong item) { JNI_METHOD_START - auto ctx = gluten::getRuntime(env, wrapper); auto filter = gluten::ObjectStore::retrieve>>(handle); GLUTEN_CHECK(filter->isSet(), "Bloom-filter is not initialized"); filter->insert(folly::hasher()(item)); @@ -197,7 +196,6 @@ JNIEXPORT jboolean JNICALL Java_org_apache_gluten_utils_VeloxBloomFilterJniWrapp jlong handle, jlong item) { JNI_METHOD_START - auto ctx = gluten::getRuntime(env, wrapper); auto filter = gluten::ObjectStore::retrieve>>(handle); GLUTEN_CHECK(filter->isSet(), "Bloom-filter is not initialized"); bool out = filter->mayContain(folly::hasher()(item)); @@ -222,7 +220,6 @@ JNIEXPORT void JNICALL Java_org_apache_gluten_utils_VeloxBloomFilterJniWrapper_m jlong handle, jlong other) { JNI_METHOD_START - auto ctx = gluten::getRuntime(env, wrapper); auto to = gluten::ObjectStore::retrieve>>(handle); auto from = gluten::ObjectStore::retrieve>>(other); GLUTEN_CHECK(to->isSet(), "Bloom-filter is not initialized"); @@ -237,7 +234,6 @@ JNIEXPORT jbyteArray JNICALL Java_org_apache_gluten_utils_VeloxBloomFilterJniWra jobject wrapper, jlong handle) { JNI_METHOD_START - auto ctx = gluten::getRuntime(env, wrapper); auto filter = gluten::ObjectStore::retrieve>>(handle); GLUTEN_CHECK(filter->isSet(), "Bloom-filter is not initialized"); std::vector buffer = serialize(filter.get()); diff --git a/cpp/velox/operators/plannodes/RowVectorStream.h b/cpp/velox/operators/plannodes/RowVectorStream.h index e02b288c46e24..c72e9137f4a4c 100644 --- a/cpp/velox/operators/plannodes/RowVectorStream.h +++ b/cpp/velox/operators/plannodes/RowVectorStream.h @@ -32,11 +32,17 @@ class RowVectorStream { : iterator_(std::move(iterator)), outputType_(outputType), pool_(pool) {} bool hasNext() { - return iterator_->hasNext(); + if (!finished_) { + finished_ = !iterator_->hasNext(); + } + return !finished_; } // Convert arrow batch to rowvector and use new output columns facebook::velox::RowVectorPtr next() { + if (finished_) { + return nullptr; + } const std::shared_ptr& vb = VeloxColumnarBatch::from(pool_, iterator_->next()); auto vp = vb->getRowVector(); VELOX_DCHECK(vp != nullptr); @@ -45,17 +51,18 @@ class RowVectorStream { } private: + bool finished_{false}; std::shared_ptr iterator_; const facebook::velox::RowTypePtr outputType_; facebook::velox::memory::MemoryPool* pool_; }; -class ValueStreamNode : public facebook::velox::core::PlanNode { +class ValueStreamNode final : public facebook::velox::core::PlanNode { public: ValueStreamNode( const facebook::velox::core::PlanNodeId& id, const facebook::velox::RowTypePtr& outputType, - std::shared_ptr valueStream) + std::unique_ptr valueStream) : facebook::velox::core::PlanNode(id), outputType_(outputType), valueStream_(std::move(valueStream)) { VELOX_CHECK_NOT_NULL(valueStream_); } @@ -68,8 +75,8 @@ class ValueStreamNode : public facebook::velox::core::PlanNode { return kEmptySources; }; - const std::shared_ptr& rowVectorStream() const { - return valueStream_; + RowVectorStream* rowVectorStream() const { + return valueStream_.get(); } std::string_view name() const override { @@ -84,7 +91,7 @@ class ValueStreamNode : public facebook::velox::core::PlanNode { void addDetails(std::stringstream& stream) const override{}; const facebook::velox::RowTypePtr outputType_; - std::shared_ptr valueStream_; + std::unique_ptr valueStream_; const std::vector kEmptySources; }; @@ -99,11 +106,14 @@ class ValueStream : public facebook::velox::exec::SourceOperator { valueStreamNode->outputType(), operatorId, valueStreamNode->id(), - "ValueStream") { + valueStreamNode->name().data()) { valueStream_ = valueStreamNode->rowVectorStream(); } facebook::velox::RowVectorPtr getOutput() override { + if (finished_) { + return nullptr; + } if (valueStream_->hasNext()) { return valueStream_->next(); } else { @@ -122,12 +132,14 @@ class ValueStream : public facebook::velox::exec::SourceOperator { private: bool finished_ = false; - std::shared_ptr valueStream_; + RowVectorStream* valueStream_; }; class RowVectorStreamOperatorTranslator : public facebook::velox::exec::Operator::PlanNodeTranslator { - std::unique_ptr - toOperator(facebook::velox::exec::DriverCtx* ctx, int32_t id, const facebook::velox::core::PlanNodePtr& node) { + std::unique_ptr toOperator( + facebook::velox::exec::DriverCtx* ctx, + int32_t id, + const facebook::velox::core::PlanNodePtr& node) override { if (auto valueStreamNode = std::dynamic_pointer_cast(node)) { return std::make_unique(id, ctx, valueStreamNode); } diff --git a/cpp/velox/operators/writer/VeloxParquetDatasource.cc b/cpp/velox/operators/writer/VeloxParquetDatasource.cc index 58aa9f33af04f..530f250b8e6e8 100644 --- a/cpp/velox/operators/writer/VeloxParquetDatasource.cc +++ b/cpp/velox/operators/writer/VeloxParquetDatasource.cc @@ -53,13 +53,6 @@ void VeloxParquetDatasource::initSink(const std::unordered_map& sparkConfs) { initSink(sparkConfs); - ArrowSchema cSchema{}; - arrow::Status status = arrow::ExportSchema(*(schema_.get()), &cSchema); - if (!status.ok()) { - throw std::runtime_error("Failed to export arrow cSchema."); - } - - type_ = velox::importFromArrow(cSchema); if (sparkConfs.find(kParquetBlockSize) != sparkConfs.end()) { maxRowGroupBytes_ = static_cast(stoi(sparkConfs.find(kParquetBlockSize)->second)); diff --git a/cpp/velox/operators/writer/VeloxParquetDatasource.h b/cpp/velox/operators/writer/VeloxParquetDatasource.h index 12cf2c301a391..6b68396ec41ad 100644 --- a/cpp/velox/operators/writer/VeloxParquetDatasource.h +++ b/cpp/velox/operators/writer/VeloxParquetDatasource.h @@ -107,7 +107,6 @@ class VeloxParquetDatasource : public Datasource { int64_t maxRowGroupRows_ = 100000000; // 100M std::shared_ptr schema_; - std::shared_ptr type_; std::shared_ptr parquetWriter_; std::shared_ptr pool_; }; diff --git a/cpp/velox/shuffle/VeloxHashBasedShuffleWriter.cc b/cpp/velox/shuffle/VeloxHashBasedShuffleWriter.cc index 3bd1a2fbc6cce..f9cd2780c3269 100644 --- a/cpp/velox/shuffle/VeloxHashBasedShuffleWriter.cc +++ b/cpp/velox/shuffle/VeloxHashBasedShuffleWriter.cc @@ -329,8 +329,10 @@ arrow::Status VeloxHashBasedShuffleWriter::partitioningAndDoSplit(facebook::velo } arrow::Status VeloxHashBasedShuffleWriter::stop() { + setSplitState(SplitState::kStopEvict); if (options_.partitioning != Partitioning::kSingle) { for (auto pid = 0; pid < numPartitions_; ++pid) { + PartitionBufferGuard guard(partitionBufferInUse_, pid); RETURN_NOT_OK(evictPartitionBuffers(pid, false)); } } @@ -970,10 +972,6 @@ arrow::Result>> VeloxHashBasedShuffle bool reuseBuffers) { SCOPED_TIMER(cpuWallTimingList_[CpuWallTimingCreateRbFromBuffer]); - if (partitionBufferBase_[partitionId] == 0) { - return std::vector>{}; - } - auto numRows = partitionBufferBase_[partitionId]; auto fixedWidthIdx = 0; auto binaryIdx = 0; @@ -1321,6 +1319,9 @@ arrow::Result VeloxHashBasedShuffleWriter::shrinkPartitionBuffersMinSiz // Sort partition buffers by (partitionBufferSize_ - partitionBufferBase_) std::vector> pidToSize; for (auto pid = 0; pid < numPartitions_; ++pid) { + if (partitionBufferInUse_.has_value() && *partitionBufferInUse_ == pid) { + continue; + } if (partitionBufferSize_[pid] > 0 && partitionBufferSize_[pid] > partitionBufferBase_[pid]) { pidToSize.emplace_back(pid, partitionBufferSize_[pid] - partitionBufferBase_[pid]); } @@ -1348,6 +1349,7 @@ arrow::Result VeloxHashBasedShuffleWriter::shrinkPartitionBuffersMinSiz arrow::Result VeloxHashBasedShuffleWriter::evictPartitionBuffersMinSize(int64_t size) { // Evict partition buffers, only when splitState_ == SplitState::kInit, and space freed from // shrinking is not enough. In this case partitionBufferSize_ == partitionBufferBase_ + VELOX_CHECK(!partitionBufferInUse_); int64_t beforeEvict = partitionBufferPool_->bytes_allocated(); int64_t evicted = 0; std::vector> pidToSize; @@ -1375,10 +1377,12 @@ arrow::Result VeloxHashBasedShuffleWriter::evictPartitionBuffersMinSize bool VeloxHashBasedShuffleWriter::shrinkPartitionBuffersAfterSpill() const { // If OOM happens during SplitState::kSplit, it is triggered by binary buffers resize. // Or during SplitState::kInit, it is triggered by other operators. + // Or during SplitState::kStopEvict, it is triggered by assembleBuffers allocating extra memory. In this case we use + // PartitionBufferGuard to prevent the target partition from being shrunk. // The reclaim order is spill->shrink, because the partition buffers can be reused. // SinglePartitioning doesn't maintain partition buffers. return options_.partitioning != Partitioning::kSingle && - (splitState_ == SplitState::kSplit || splitState_ == SplitState::kInit); + (splitState_ == SplitState::kSplit || splitState_ == SplitState::kInit || splitState_ == SplitState::kStopEvict); } bool VeloxHashBasedShuffleWriter::evictPartitionBuffersAfterSpill() const { @@ -1391,7 +1395,7 @@ arrow::Result VeloxHashBasedShuffleWriter::partitionBufferSizeAfterShr if (splitState_ == SplitState::kSplit) { return partitionBufferBase_[partitionId] + partition2RowCount_[partitionId]; } - if (splitState_ == kInit || splitState_ == SplitState::kStop) { + if (splitState_ == kInit || splitState_ == SplitState::kStopEvict) { return partitionBufferBase_[partitionId]; } return arrow::Status::Invalid("Cannot shrink partition buffers in SplitState: " + std::to_string(splitState_)); diff --git a/cpp/velox/shuffle/VeloxHashBasedShuffleWriter.h b/cpp/velox/shuffle/VeloxHashBasedShuffleWriter.h index a11f84e952a61..f78211980a865 100644 --- a/cpp/velox/shuffle/VeloxHashBasedShuffleWriter.h +++ b/cpp/velox/shuffle/VeloxHashBasedShuffleWriter.h @@ -87,7 +87,7 @@ namespace gluten { #endif // end of VELOX_SHUFFLE_WRITER_PRINT -enum SplitState { kInit, kPreAlloc, kSplit, kStop }; +enum SplitState { kInit, kPreAlloc, kSplit, kStopEvict, kStop }; struct BinaryArrayResizeState { bool inResize; @@ -303,6 +303,21 @@ class VeloxHashBasedShuffleWriter : public VeloxShuffleWriter { arrow::Status partitioningAndDoSplit(facebook::velox::RowVectorPtr rv, int64_t memLimit); + class PartitionBufferGuard { + public: + PartitionBufferGuard(std::optional& partitionInUse, uint32_t partitionId) + : partitionBufferInUse_(partitionInUse) { + partitionBufferInUse_ = partitionId; + } + + ~PartitionBufferGuard() { + partitionBufferInUse_ = std::nullopt; + } + + private: + std::optional& partitionBufferInUse_; + }; + BinaryArrayResizeState binaryArrayResizeState_{}; bool hasComplexType_ = false; @@ -401,6 +416,8 @@ class VeloxHashBasedShuffleWriter : public VeloxShuffleWriter { facebook::velox::serializer::presto::PrestoVectorSerde serde_; SplitState splitState_{kInit}; + + std::optional partitionBufferInUse_{std::nullopt}; }; // class VeloxHashBasedShuffleWriter } // namespace gluten diff --git a/cpp/velox/substrait/SubstraitToVeloxPlan.cc b/cpp/velox/substrait/SubstraitToVeloxPlan.cc index 73047b2f49073..7b41f7071e842 100644 --- a/cpp/velox/substrait/SubstraitToVeloxPlan.cc +++ b/cpp/velox/substrait/SubstraitToVeloxPlan.cc @@ -18,6 +18,7 @@ #include "SubstraitToVeloxPlan.h" #include "TypeUtils.h" #include "VariantToVectorConverter.h" +#include "operators/plannodes/RowVectorStream.h" #include "velox/connectors/hive/HiveDataSink.h" #include "velox/exec/TableWriter.h" #include "velox/type/Filter.h" @@ -1046,17 +1047,15 @@ SubstraitToVeloxPlanConverter::processSortField( const RowTypePtr& inputType) { std::vector sortingKeys; std::vector sortingOrders; - sortingKeys.reserve(sortFields.size()); - sortingOrders.reserve(sortFields.size()); - + std::unordered_set uniqueKeys; for (const auto& sort : sortFields) { - sortingOrders.emplace_back(toSortOrder(sort)); - - if (sort.has_expr()) { - auto expression = exprConverter_->toVeloxExpr(sort.expr(), inputType); - auto fieldExpr = std::dynamic_pointer_cast(expression); - VELOX_USER_CHECK_NOT_NULL(fieldExpr, "Sort Operator only supports field sorting key"); + GLUTEN_CHECK(sort.has_expr(), "Sort field must have expr"); + auto expression = exprConverter_->toVeloxExpr(sort.expr(), inputType); + auto fieldExpr = std::dynamic_pointer_cast(expression); + VELOX_USER_CHECK_NOT_NULL(fieldExpr, "Sort Operator only supports field sorting key"); + if (uniqueKeys.insert(fieldExpr->name()).second) { sortingKeys.emplace_back(fieldExpr); + sortingOrders.emplace_back(toSortOrder(sort)); } } return {sortingKeys, sortingOrders}; @@ -1109,7 +1108,13 @@ core::PlanNodePtr SubstraitToVeloxPlanConverter::constructValueStreamNode( } auto outputType = ROW(std::move(outNames), std::move(veloxTypeList)); - auto node = valueStreamNodeFactory_(nextPlanNodeId(), pool_, streamIdx, outputType); + std::shared_ptr iterator; + if (!validationMode_) { + VELOX_CHECK_LT(streamIdx, inputIters_.size(), "Could not find stream index {} in input iterator list.", streamIdx); + iterator = inputIters_[streamIdx]; + } + auto valueStream = std::make_unique(pool_, iterator, outputType); + auto node = std::make_shared(nextPlanNodeId(), outputType, std::move(valueStream)); auto splitInfo = std::make_shared(); splitInfo->isStream = true; diff --git a/cpp/velox/substrait/SubstraitToVeloxPlan.h b/cpp/velox/substrait/SubstraitToVeloxPlan.h index 1535b1f85f51b..0e892469d098f 100644 --- a/cpp/velox/substrait/SubstraitToVeloxPlan.h +++ b/cpp/velox/substrait/SubstraitToVeloxPlan.h @@ -165,6 +165,10 @@ class SubstraitToVeloxPlanConverter { valueStreamNodeFactory_ = std::move(factory); } + void setInputIters(std::vector> inputIters) { + inputIters_ = std::move(inputIters); + } + /// Used to check if ReadRel specifies an input of stream. /// If yes, the index of input stream will be returned. /// If not, -1 will be returned. @@ -198,6 +202,7 @@ class SubstraitToVeloxPlanConverter { /// Helper Function to convert Substrait sortField to Velox sortingKeys and /// sortingOrders. + /// Note that, this method would deduplicate the sorting keys which have the same field name. std::pair, std::vector> processSortField( const ::google::protobuf::RepeatedPtrField<::substrait::SortField>& sortField, const RowTypePtr& inputType); @@ -590,6 +595,8 @@ class SubstraitToVeloxPlanConverter { std::function valueStreamNodeFactory_; + std::vector> inputIters_; + /// The map storing the pre-built plan nodes which can be accessed through /// index. This map is only used when the computation of a Substrait plan /// depends on other input nodes. diff --git a/cpp/velox/substrait/SubstraitToVeloxPlanValidator.cc b/cpp/velox/substrait/SubstraitToVeloxPlanValidator.cc index 8e6dd7c1c31f3..c229ca84fe190 100644 --- a/cpp/velox/substrait/SubstraitToVeloxPlanValidator.cc +++ b/cpp/velox/substrait/SubstraitToVeloxPlanValidator.cc @@ -65,7 +65,6 @@ static const std::unordered_set kBlackList = { "concat_ws", "from_json", "json_array_length", - "repeat", "trunc", "sequence", "approx_percentile", @@ -907,11 +906,13 @@ bool SubstraitToVeloxPlanValidator::validate(const ::substrait::JoinRel& joinRel switch (joinRel.type()) { case ::substrait::JoinRel_JoinType_JOIN_TYPE_INNER: case ::substrait::JoinRel_JoinType_JOIN_TYPE_LEFT: + case ::substrait::JoinRel_JoinType_JOIN_TYPE_RIGHT: case ::substrait::JoinRel_JoinType_JOIN_TYPE_LEFT_SEMI: case ::substrait::JoinRel_JoinType_JOIN_TYPE_RIGHT_SEMI: + case ::substrait::JoinRel_JoinType_JOIN_TYPE_ANTI: break; default: - LOG_VALIDATION_MSG("Sort merge join only support inner, left, left semi and right semi join."); + LOG_VALIDATION_MSG("Sort merge join type is not supported: " + std::to_string(joinRel.type())); return false; } } diff --git a/cpp/velox/tests/BufferOutputStreamTest.cc b/cpp/velox/tests/BufferOutputStreamTest.cc index 324d8c5e63944..0e16f8c877694 100644 --- a/cpp/velox/tests/BufferOutputStreamTest.cc +++ b/cpp/velox/tests/BufferOutputStreamTest.cc @@ -16,6 +16,7 @@ */ #include "memory/BufferOutputStream.h" +#include "compute/VeloxBackend.h" #include "memory/VeloxColumnarBatch.h" #include "velox/common/memory/ByteStream.h" #include "velox/vector/tests/utils/VectorTestBase.h" @@ -27,6 +28,7 @@ class BufferOutputStreamTest : public ::testing::Test, public test::VectorTestBa protected: // Velox requires the mem manager to be instanced. static void SetUpTestCase() { + VeloxBackend::create({}); memory::MemoryManager::testingSetInstance({}); } diff --git a/cpp/velox/tests/VeloxShuffleWriterTest.cc b/cpp/velox/tests/VeloxShuffleWriterTest.cc index 1c1be6fc1b6f3..957657eeb5c19 100644 --- a/cpp/velox/tests/VeloxShuffleWriterTest.cc +++ b/cpp/velox/tests/VeloxShuffleWriterTest.cc @@ -207,50 +207,13 @@ TEST_P(HashPartitioningShuffleWriter, hashPart1Vector) { TEST_P(HashPartitioningShuffleWriter, hashPart1VectorComplexType) { ASSERT_NOT_OK(initShuffleWriterOptions()); auto shuffleWriter = createShuffleWriter(defaultArrowMemoryPool().get()); - std::vector children = { - makeNullableFlatVector({std::nullopt, 1}), - makeRowVector({ - makeFlatVector({1, 3}), - makeNullableFlatVector({std::nullopt, "de"}), - }), - makeNullableFlatVector({std::nullopt, "10 I'm not inline string"}), - makeArrayVector({ - {1, 2, 3, 4, 5}, - {1, 2, 3}, - }), - makeMapVector({{{1, "str1000"}, {2, "str2000"}}, {{3, "str3000"}, {4, "str4000"}}}), - }; - auto dataVector = makeRowVector(children); + auto children = childrenComplex_; children.insert((children.begin()), makeFlatVector({1, 2})); auto vector = makeRowVector(children); + auto firstBlock = takeRows({inputVectorComplex_}, {{1}}); + auto secondBlock = takeRows({inputVectorComplex_}, {{0}}); - auto firstBlock = makeRowVector({ - makeConstant(1, 1), - makeRowVector({ - makeConstant(3, 1), - makeFlatVector({"de"}), - }), - makeFlatVector({"10 I'm not inline string"}), - makeArrayVector({ - {1, 2, 3}, - }), - makeMapVector({{{3, "str3000"}, {4, "str4000"}}}), - }); - - auto secondBlock = makeRowVector({ - makeNullConstant(TypeKind::INTEGER, 1), - makeRowVector({ - makeConstant(1, 1), - makeNullableFlatVector({std::nullopt}), - }), - makeNullableFlatVector({std::nullopt}), - makeArrayVector({ - {1, 2, 3, 4, 5}, - }), - makeMapVector({{{1, "str1000"}, {2, "str2000"}}}), - }); - - testShuffleWriteMultiBlocks(*shuffleWriter, {vector}, 2, dataVector->type(), {{firstBlock}, {secondBlock}}); + testShuffleWriteMultiBlocks(*shuffleWriter, {vector}, 2, inputVectorComplex_->type(), {{firstBlock}, {secondBlock}}); } TEST_P(HashPartitioningShuffleWriter, hashPart3Vectors) { @@ -631,6 +594,27 @@ TEST_F(VeloxShuffleWriterMemoryTest, kStop) { } } +TEST_F(VeloxShuffleWriterMemoryTest, kStopComplex) { + ASSERT_NOT_OK(initShuffleWriterOptions()); + shuffleWriterOptions_.bufferSize = 4; + auto pool = SelfEvictedMemoryPool(defaultArrowMemoryPool().get(), false); + auto shuffleWriter = createShuffleWriter(&pool); + + pool.setEvictable(shuffleWriter.get()); + for (int i = 0; i < 3; ++i) { + ASSERT_NOT_OK(splitRowVector(*shuffleWriter, inputVectorComplex_)); + } + + // Reclaim from PartitionWriter to free cached bytes. + auto payloadSize = shuffleWriter->cachedPayloadSize(); + int64_t evicted; + ASSERT_NOT_OK(shuffleWriter->reclaimFixedSize(payloadSize, &evicted)); + ASSERT_EQ(evicted, payloadSize); + + // When evicting partitioning buffers in stop, spill will be triggered by complex types allocating extra memory. + ASSERT_TRUE(pool.checkEvict(pool.bytes_allocated(), [&] { ASSERT_NOT_OK(shuffleWriter->stop()); })); +} + TEST_F(VeloxShuffleWriterMemoryTest, evictPartitionBuffers) { ASSERT_NOT_OK(initShuffleWriterOptions()); shuffleWriterOptions_.bufferSize = 4; diff --git a/cpp/velox/utils/tests/VeloxShuffleWriterTestBase.h b/cpp/velox/utils/tests/VeloxShuffleWriterTestBase.h index fd3ae3d547fee..41b7f31e02d7e 100644 --- a/cpp/velox/utils/tests/VeloxShuffleWriterTestBase.h +++ b/cpp/velox/utils/tests/VeloxShuffleWriterTestBase.h @@ -172,12 +172,27 @@ class VeloxShuffleWriterTestBase : public facebook::velox::test::VectorTestBase makeNullableFlatVector( std::vector>(2048, std::nullopt)), }; + childrenComplex_ = { + makeNullableFlatVector({std::nullopt, 1}), + makeRowVector({ + makeFlatVector({1, 3}), + makeNullableFlatVector({std::nullopt, "de"}), + }), + makeNullableFlatVector({std::nullopt, "10 I'm not inline string"}), + makeArrayVector({ + {1, 2, 3, 4, 5}, + {1, 2, 3}, + }), + makeMapVector( + {{{1, "str1000"}, {2, "str2000"}}, {{3, "str3000"}, {4, "str4000"}}}), + }; inputVector1_ = makeRowVector(children1_); inputVector2_ = makeRowVector(children2_); inputVectorNoNull_ = makeRowVector(childrenNoNull_); inputVectorLargeBinary1_ = makeRowVector(childrenLargeBinary1_); inputVectorLargeBinary2_ = makeRowVector(childrenLargeBinary2_); + inputVectorComplex_ = makeRowVector(childrenComplex_); } arrow::Status splitRowVector(VeloxShuffleWriter& shuffleWriter, facebook::velox::RowVectorPtr vector) { @@ -217,6 +232,7 @@ class VeloxShuffleWriterTestBase : public facebook::velox::test::VectorTestBase std::vector childrenNoNull_; std::vector childrenLargeBinary1_; std::vector childrenLargeBinary2_; + std::vector childrenComplex_; facebook::velox::RowVectorPtr inputVector1_; facebook::velox::RowVectorPtr inputVector2_; @@ -225,6 +241,7 @@ class VeloxShuffleWriterTestBase : public facebook::velox::test::VectorTestBase std::string largeString2_; facebook::velox::RowVectorPtr inputVectorLargeBinary1_; facebook::velox::RowVectorPtr inputVectorLargeBinary2_; + facebook::velox::RowVectorPtr inputVectorComplex_; }; class VeloxShuffleWriterTest : public ::testing::TestWithParam, public VeloxShuffleWriterTestBase { diff --git a/dev/build_arrow.sh b/dev/build_arrow.sh index a822c4119ea02..19d5627146b1f 100755 --- a/dev/build_arrow.sh +++ b/dev/build_arrow.sh @@ -17,15 +17,13 @@ CURRENT_DIR=$(cd "$(dirname "$BASH_SOURCE")"; pwd) source ${CURRENT_DIR}/build_helper_functions.sh VELOX_ARROW_BUILD_VERSION=15.0.0 -ARROW_PREFIX=$CURRENT_DIR/arrow_ep -# Always uses BUNDLED in case of that thrift is not installed. -THRIFT_SOURCE="BUNDLED" +ARROW_PREFIX=$CURRENT_DIR/../ep/_ep/arrow_ep BUILD_TYPE=Release function prepare_arrow_build() { - sudo rm -rf arrow_ep/ + mkdir -p ${ARROW_PREFIX}/../ && cd ${ARROW_PREFIX}/../ && sudo rm -rf arrow_ep/ wget_and_untar https://archive.apache.org/dist/arrow/arrow-${VELOX_ARROW_BUILD_VERSION}/apache-arrow-${VELOX_ARROW_BUILD_VERSION}.tar.gz arrow_ep - cd arrow_ep/ + cd arrow_ep patch -p1 < $CURRENT_DIR/../ep/build-velox/src/modify_arrow.patch patch -p1 < $CURRENT_DIR/../ep/build-velox/src/modify_arrow_dataset_scan_option.patch } @@ -38,15 +36,14 @@ function install_arrow_deps { } function build_arrow_cpp() { - if [ -n "$1" ]; then - BUILD_TYPE=$1 - fi pushd $ARROW_PREFIX/cpp cmake_install \ -DARROW_PARQUET=ON \ -DARROW_FILESYSTEM=ON \ -DARROW_PROTOBUF_USE_SHARED=OFF \ + -DARROW_DEPENDENCY_USE_SHARED=OFF \ + -DARROW_DEPENDENCY_SOURCE=BUNDLED \ -DARROW_WITH_THRIFT=ON \ -DARROW_WITH_LZ4=ON \ -DARROW_WITH_SNAPPY=ON \ @@ -59,14 +56,33 @@ function build_arrow_cpp() { -DARROW_TESTING=ON \ -DCMAKE_INSTALL_PREFIX=/usr/local \ -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \ - -DARROW_BUILD_STATIC=ON \ - -DThrift_SOURCE=${THRIFT_SOURCE} + -DARROW_BUILD_SHARED=OFF \ + -DARROW_BUILD_STATIC=ON + + # Install thrift. + cd _build/thrift_ep-prefix/src/thrift_ep-build + sudo cmake --install ./ --prefix /usr/local/ popd } function build_arrow_java() { ARROW_INSTALL_DIR="${ARROW_PREFIX}/install" + # set default number of threads as cpu cores minus 2 + if [[ "$(uname)" == "Darwin" ]]; then + physical_cpu_cores=$(sysctl -n hw.physicalcpu) + ignore_cores=2 + if [ "$physical_cpu_cores" -gt "$ignore_cores" ]; then + NPROC=${NPROC:-$(($physical_cpu_cores - $ignore_cores))} + else + NPROC=${NPROC:-$physical_cpu_cores} + fi + else + NPROC=${NPROC:-$(nproc --ignore=2)} + fi + echo "set cmake build level to ${NPROC}" + export CMAKE_BUILD_PARALLEL_LEVEL=$NPROC + pushd $ARROW_PREFIX/java # Because arrow-bom module need the -DprocessAllModules mvn versions:set -DnewVersion=15.0.0-gluten -DprocessAllModules diff --git a/dev/build_helper_functions.sh b/dev/build_helper_functions.sh index 221f01bf6fb5b..8559911c1cd4f 100644 --- a/dev/build_helper_functions.sh +++ b/dev/build_helper_functions.sh @@ -116,3 +116,70 @@ function cmake_install { cmake --build "${BINARY_DIR}" ${SUDO} cmake --install "${BINARY_DIR}" } + +function setup_macos { + if [ $ARCH == 'x86_64' ]; then + ./scripts/setup-macos.sh + elif [ $ARCH == 'arm64' ]; then + CPU_TARGET="arm64" ./scripts/setup-macos.sh + else + echo "Unknown arch: $ARCH" + fi +} + +function setup_linux { + local LINUX_DISTRIBUTION=$(. /etc/os-release && echo ${ID}) + local LINUX_VERSION_ID=$(. /etc/os-release && echo ${VERSION_ID}) + + if [[ "$LINUX_DISTRIBUTION" == "ubuntu" || "$LINUX_DISTRIBUTION" == "debian" || "$LINUX_DISTRIBUTION" == "pop" ]]; then + scripts/setup-ubuntu.sh + elif [[ "$LINUX_DISTRIBUTION" == "centos" ]]; then + case "$LINUX_VERSION_ID" in + 8) scripts/setup-centos8.sh ;; + 7) + scripts/setup-centos7.sh + set +u + export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:/usr/local/lib/pkgconfig:/usr/lib64/pkgconfig:/usr/lib/pkgconfig:$PKG_CONFIG_PATH + source /opt/rh/devtoolset-9/enable + set -u + ;; + *) + echo "Unsupported centos version: $LINUX_VERSION_ID" + exit 1 + ;; + esac + elif [[ "$LINUX_DISTRIBUTION" == "alinux" ]]; then + case "${LINUX_VERSION_ID:0:1}" in + 2) + scripts/setup-centos7.sh + set +u + export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:/usr/local/lib/pkgconfig:/usr/lib64/pkgconfig:/usr/lib/pkgconfig:$PKG_CONFIG_PATH + source /opt/rh/devtoolset-9/enable + set -u + ;; + 3) scripts/setup-centos8.sh ;; + *) + echo "Unsupported alinux version: $LINUX_VERSION_ID" + exit 1 + ;; + esac + elif [[ "$LINUX_DISTRIBUTION" == "tencentos" ]]; then + case "$LINUX_VERSION_ID" in + 2.4) + scripts/setup-centos7.sh + set +u + export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:/usr/local/lib/pkgconfig:/usr/lib64/pkgconfig:/usr/lib/pkgconfig:$PKG_CONFIG_PATH + source /opt/rh/devtoolset-9/enable + set -u + ;; + 3.2) scripts/setup-centos8.sh ;; + *) + echo "Unsupported tencentos version: $LINUX_VERSION_ID" + exit 1 + ;; + esac + else + echo "Unsupported linux distribution: $LINUX_DISTRIBUTION" + exit 1 + fi +} diff --git a/dev/builddeps-veloxbe.sh b/dev/builddeps-veloxbe.sh index d5e33e926d824..1676577ae89a3 100755 --- a/dev/builddeps-veloxbe.sh +++ b/dev/builddeps-veloxbe.sh @@ -13,7 +13,7 @@ BUILD_TESTS=OFF BUILD_EXAMPLES=OFF BUILD_BENCHMARKS=OFF BUILD_JEMALLOC=OFF -BUILD_PROTOBUF=ON +BUILD_PROTOBUF=OFF BUILD_VELOX_TESTS=OFF BUILD_VELOX_BENCHMARKS=OFF ENABLE_QAT=OFF @@ -192,7 +192,7 @@ function build_arrow { cd $GLUTEN_DIR/dev source build_arrow.sh prepare_arrow_build - build_arrow_cpp $BUILD_TYPE + build_arrow_cpp echo "Finished building arrow CPP" build_arrow_java echo "Finished building arrow Java" @@ -201,16 +201,14 @@ function build_arrow { function build_velox { echo "Start to build Velox" cd $GLUTEN_DIR/ep/build-velox/src - ./get_velox.sh --enable_hdfs=$ENABLE_HDFS --build_protobuf=$BUILD_PROTOBUF --enable_s3=$ENABLE_S3 --enable_gcs=$ENABLE_GCS --enable_abfs=$ENABLE_ABFS $VELOX_PARAMETER # When BUILD_TESTS is on for gluten cpp, we need turn on VELOX_BUILD_TEST_UTILS via build_test_utils. - ./build_velox.sh --run_setup_script=$RUN_SETUP_SCRIPT --enable_s3=$ENABLE_S3 --enable_gcs=$ENABLE_GCS --build_type=$BUILD_TYPE --enable_hdfs=$ENABLE_HDFS \ + ./build_velox.sh --enable_s3=$ENABLE_S3 --enable_gcs=$ENABLE_GCS --build_type=$BUILD_TYPE --enable_hdfs=$ENABLE_HDFS \ --enable_abfs=$ENABLE_ABFS --enable_ep_cache=$ENABLE_EP_CACHE --build_test_utils=$BUILD_TESTS --build_tests=$BUILD_VELOX_TESTS --build_benchmarks=$BUILD_VELOX_BENCHMARKS \ --num_threads=$NUM_THREADS } -## compile gluten cpp function build_gluten_cpp { - echo "Start to Gluten CPP" + echo "Start to build Gluten CPP" cd $GLUTEN_DIR/cpp rm -rf build mkdir build @@ -230,6 +228,32 @@ function build_velox_backend { build_gluten_cpp } +( + cd $GLUTEN_DIR/ep/build-velox/src + ./get_velox.sh --enable_hdfs=$ENABLE_HDFS --enable_s3=$ENABLE_S3 --enable_gcs=$ENABLE_GCS --enable_abfs=$ENABLE_ABFS $VELOX_PARAMETER +) + +if [ "$VELOX_HOME" == "" ]; then + VELOX_HOME="$GLUTEN_DIR/ep/build-velox/build/velox_ep" +fi + +OS=`uname -s` +ARCH=`uname -m` +source $GLUTEN_DIR/dev/build_helper_functions.sh +if [ -z "${GLUTEN_VCPKG_ENABLED:-}" ] && [ $RUN_SETUP_SCRIPT == "ON" ]; then + echo "Start to install dependencies" + pushd $VELOX_HOME + if [ $OS == 'Linux' ]; then + setup_linux + elif [ $OS == 'Darwin' ]; then + setup_macos + else + echo "Unsupported kernel: $OS" + exit 1 + fi + popd +fi + commands_to_run=${OTHER_ARGUMENTS:-} ( if [[ "x$commands_to_run" == "x" ]]; then diff --git a/dev/ci-velox-buildstatic.sh b/dev/ci-velox-buildstatic.sh index 74688ff307cb7..227bad36053b4 100755 --- a/dev/ci-velox-buildstatic.sh +++ b/dev/ci-velox-buildstatic.sh @@ -6,4 +6,4 @@ cd $GITHUB_WORKSPACE/ source ./dev/vcpkg/env.sh sed -i '/^headers/d' ep/build-velox/build/velox_ep/CMakeLists.txt export NUM_THREADS=4 -./dev/builddeps-veloxbe.sh --build_tests=OFF --build_benchmarks=OFF --enable_s3=ON --enable_gcs=OFF --enable_hdfs=ON --enable_abfs=ON +./dev/builddeps-veloxbe.sh --build_tests=OFF --build_benchmarks=OFF --enable_s3=ON --enable_gcs=ON --enable_hdfs=ON --enable_abfs=ON diff --git a/dev/package-vcpkg.sh b/dev/package-vcpkg.sh index 4a248b556726b..c76b8be8d7d1f 100755 --- a/dev/package-vcpkg.sh +++ b/dev/package-vcpkg.sh @@ -6,8 +6,14 @@ CURRENT_DIR=$(cd "$(dirname "$BASH_SOURCE")"; pwd) GLUTEN_DIR="$CURRENT_DIR/.." cd "$GLUTEN_DIR" -source /opt/rh/devtoolset-9/enable -source /opt/gluten/dev/vcpkg/env.sh +if [ "$LINUX_OS" == "centos" ]; then + if [ "$VERSION" == "8" ]; then + source /opt/rh/gcc-toolset-9/enable + elif [ "$VERSION" == "7" ]; then + source /opt/rh/devtoolset-9/enable + fi +fi +source ./dev/vcpkg/env.sh ./dev/buildbundle-veloxbe.sh --build_tests=ON --build_benchmarks=ON --enable_s3=ON --enable_hdfs=ON mvn clean package -Pbackends-velox -Pceleborn -Puniffle -Pspark-3.2 -DskipTests mvn clean package -Pbackends-velox -Pceleborn -Puniffle -Pspark-3.3 -DskipTests diff --git a/dev/package.sh b/dev/package.sh index 1b9ca85e9590c..7e7e793bdabdd 100755 --- a/dev/package.sh +++ b/dev/package.sh @@ -68,7 +68,9 @@ elif [ "$LINUX_OS" == "alinux" ]; then process_setup_centos_7 fi elif [ "$LINUX_OS" == "tencentos" ]; then - if [ "$VERSION" == "3.2" ]; then + if [ "$VERSION" == "2.4" ]; then + process_setup_centos_7 + elif [ "$VERSION" == "3.2" ]; then process_setup_centos_8 fi elif [ "$LINUX_OS" == "debian" ]; then diff --git a/dev/vcpkg/ports/folly/fix-unistd-include.patch b/dev/vcpkg/ports/folly/fix-unistd-include.patch index 9e3fe5d7a7208..78a4e092335fd 100644 --- a/dev/vcpkg/ports/folly/fix-unistd-include.patch +++ b/dev/vcpkg/ports/folly/fix-unistd-include.patch @@ -1,5 +1,5 @@ diff --git a/folly/experimental/symbolizer/Elf.cpp b/folly/experimental/symbolizer/Elf.cpp -index 6a7f74f..6546fe0 100644 +index 6a7f74fa4..6546fe074 100644 --- a/folly/experimental/symbolizer/Elf.cpp +++ b/folly/experimental/symbolizer/Elf.cpp @@ -49,6 +49,8 @@ diff --git a/dev/vcpkg/ports/folly/fix-windows-minmax.patch b/dev/vcpkg/ports/folly/fix-windows-minmax.patch index 1fc69a43a83e5..24e4b9eac11bd 100644 --- a/dev/vcpkg/ports/folly/fix-windows-minmax.patch +++ b/dev/vcpkg/ports/folly/fix-windows-minmax.patch @@ -1,5 +1,5 @@ diff --git a/CMake/FollyCompilerMSVC.cmake b/CMake/FollyCompilerMSVC.cmake -index ec2ce1a1d..16deda71c 100644 +index ad03039aa..1c76e0f00 100644 --- a/CMake/FollyCompilerMSVC.cmake +++ b/CMake/FollyCompilerMSVC.cmake @@ -289,6 +289,7 @@ function(apply_folly_compile_options_to_target THETARGET) diff --git a/dev/vcpkg/ports/folly/portfile.cmake b/dev/vcpkg/ports/folly/portfile.cmake index 40a0231ea31f6..44a9ce4976c22 100644 --- a/dev/vcpkg/ports/folly/portfile.cmake +++ b/dev/vcpkg/ports/folly/portfile.cmake @@ -9,7 +9,7 @@ vcpkg_from_github( OUT_SOURCE_PATH SOURCE_PATH REPO facebook/folly REF "v${VERSION}" - SHA512 6f4fa9b30ff0aba4c1c89619ada2cafd8943ba9a06b6ac4086fba212f26f0df606c8735485110eec6977900d45fc33ddcfdb8095dc6728b8c12b5cac65672e12 + SHA512 a305ac3d76a248b47428907a2e1115ca08bfd17f1e109ef187b1a52a1c121031495af61ffac1ffb9760e584f86df5b255f0eb9c0c19f75b1a1be01c9aec85a66 HEAD_REF main PATCHES boost-1.70.patch diff --git a/dev/vcpkg/ports/folly/vcpkg.json b/dev/vcpkg/ports/folly/vcpkg.json index b908f40dd9eac..c3f14ffb35ac9 100644 --- a/dev/vcpkg/ports/folly/vcpkg.json +++ b/dev/vcpkg/ports/folly/vcpkg.json @@ -1,6 +1,6 @@ { "name": "folly", - "version-string": "2024.04.01.00", + "version-string": "2024.05.20.00", "description": "An open-source C++ library developed and used at Facebook. The library is UNSTABLE on Windows", "homepage": "https://github.com/facebook/folly", "license": "Apache-2.0", diff --git a/dev/vcpkg/setup-build-depends.sh b/dev/vcpkg/setup-build-depends.sh index 75675c26dfa0e..da104b6df8e49 100755 --- a/dev/vcpkg/setup-build-depends.sh +++ b/dev/vcpkg/setup-build-depends.sh @@ -20,23 +20,63 @@ install_maven_from_source() { cd /tmp wget https://archive.apache.org/dist/maven/maven-3/$maven_version/binaries/apache-maven-$maven_version-bin.tar.gz tar -xvf apache-maven-$maven_version-bin.tar.gz - rm apache-maven-$maven_version-bin.tar.gz + rm -f apache-maven-$maven_version-bin.tar.gz mv apache-maven-$maven_version "${maven_install_dir}" ln -s "${maven_install_dir}/bin/mvn" /usr/local/bin/mvn fi } +install_gcc9_from_source() { + cur_gcc_version=$(gcc -dumpversion) + if [ "$(semver "$cur_gcc_version")" -lt "$(semver 9.0.0)" ]; then + gcc_version=gcc-9.4.0 + gcc_install_dir=/usr/local/${gcc_version} + cd /tmp + if [ ! -d $gcc_version ]; then + wget https://ftp.gnu.org/gnu/gcc/${gcc_version}/${gcc_version}.tar.gz + tar -xvf ${gcc_version}.tar.gz + fi + cd ${gcc_version} + sed -i 's/ftp/https/g' contrib/download_prerequisites + ./contrib/download_prerequisites + + mkdir gcc-build && cd gcc-build + ../configure --prefix=${gcc_install_dir} --disable-multilib --enable-languages=c,c++ + make -j$(nproc) + make install + + update-alternatives --install /usr/bin/gcc gcc /usr/local/${gcc_version}/bin/gcc 900 --slave /usr/bin/g++ g++ /usr/local/${gcc_version}/bin/g++ + fi +} + install_centos_7() { export PATH=/usr/local/bin:$PATH + sed -i \ + -e 's/^mirrorlist/#mirrorlist/' \ + -e 's/^# *baseurl *=/baseurl=/' \ + -e 's/mirror\.centos\.org/vault.centos.org/' \ + /etc/yum.repos.d/*.repo + yum -y install epel-release centos-release-scl + sed -i \ + -e 's/^mirrorlist/#mirrorlist/' \ + -e 's/^# *baseurl *=/baseurl=/' \ + -e 's/mirror\.centos\.org/vault.centos.org/' \ + /etc/yum.repos.d/*.repo + yum -y install \ - wget curl tar zip unzip which \ - cmake3 ninja-build perl-IPC-Cmd autoconf autoconf-archive automake libtool \ - devtoolset-9 \ + wget curl tar zip unzip which patch sudo \ + ninja-build perl-IPC-Cmd autoconf autoconf-archive automake libtool \ + devtoolset-9 python3 pip dnf \ bison \ java-1.8.0-openjdk java-1.8.0-openjdk-devel + pip3 install --upgrade pip + + # Requires cmake >= 3.28.3 + pip3 install cmake==3.28.3 + # Requires git >= 2.7.4 if [[ "$(git --version)" != "git version 2."* ]]; then [ -f /etc/yum.repos.d/ius.repo ] || yum -y install https://repo.ius.io/ius-release-el7.rpm @@ -77,13 +117,21 @@ install_centos_7() { } install_centos_8() { + sed -i \ + -e 's/^mirrorlist/#mirrorlist/' \ + -e 's/^# *baseurl *=/baseurl=/' \ + -e 's/mirror\.centos\.org/vault.centos.org/' \ + /etc/yum.repos.d/*.repo + yum -y install \ - wget curl tar zip unzip git which \ - cmake ninja-build perl-IPC-Cmd autoconf autoconf-archive automake libtool \ + wget curl tar zip unzip git which sudo patch \ + cmake perl-IPC-Cmd autoconf automake libtool \ gcc-toolset-9-gcc gcc-toolset-9-gcc-c++ \ flex bison python3 \ java-1.8.0-openjdk java-1.8.0-openjdk-devel + dnf -y --enablerepo=powertools install autoconf-archive ninja-build + install_maven_from_source } @@ -165,6 +213,25 @@ install_tencentos_3.2() { install_maven_from_source } +install_debian_10() { + apt-get -y install \ + wget curl tar zip unzip git apt-transport-https \ + build-essential ccache cmake ninja-build pkg-config autoconf autoconf-archive libtool \ + flex bison python3 + + # Download the Eclipse Adoptium GPG key + wget -qO - https://packages.adoptium.net/artifactory/api/gpg/key/public | gpg --dearmor | tee /etc/apt/trusted.gpg.d/adoptium.gpg > /dev/null + + # Configure the Eclipse Adoptium repository + echo "deb https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print$2}' /etc/os-release) main" | tee /etc/apt/sources.list.d/adoptium.list + + # Install JDK + apt update && apt-get -y install temurin-8-jdk + + install_maven_from_source + install_gcc9_from_source +} + install_debian_11() { apt-get -y install \ wget curl tar zip unzip git apt-transport-https \ diff --git a/dev/vcpkg/vcpkg-configuration.json b/dev/vcpkg/vcpkg-configuration.json index ab90384674011..dcbbb75b757b1 100644 --- a/dev/vcpkg/vcpkg-configuration.json +++ b/dev/vcpkg/vcpkg-configuration.json @@ -8,6 +8,13 @@ "repository": "https://github.com/Microsoft/vcpkg", "baseline": "8ccb84df727bdf83045e53c319af05c554838b80", "packages": [ "boost*", "boost-*"] + }, + { + "kind": "git", + "repository": "https://github.com/Microsoft/vcpkg", + "baseline": "f82160a747b1b529daad7ce2f75a0d6c6a0d285d", + "packages": [ "google-cloud-cpp"] } + ] -} \ No newline at end of file +} diff --git a/dev/vcpkg/vcpkg.json b/dev/vcpkg/vcpkg.json index b7dcb059c0822..6eec2190d043d 100644 --- a/dev/vcpkg/vcpkg.json +++ b/dev/vcpkg/vcpkg.json @@ -76,7 +76,8 @@ "name": "google-cloud-cpp", "features": [ "storage" - ] + ], + "version>=": "2.22.0" } ] }, diff --git a/docs/developers/docker_ubuntu22.04.md b/docs/developers/docker_ubuntu22.04.md index 7d73d0ac322d8..b139fecdcf6ed 100644 --- a/docs/developers/docker_ubuntu22.04.md +++ b/docs/developers/docker_ubuntu22.04.md @@ -21,7 +21,8 @@ apt-get update #install gcc and libraries to build arrow apt install software-properties-common -apt install maven build-essential cmake libssl-dev libre2-dev libcurl4-openssl-dev clang lldb lld libz-dev git ninja-build uuid-dev autoconf-archive curl zip unzip tar pkg-config bison libtool flex vim +apt install maven build-essential libssl-dev libre2-dev libcurl4-openssl-dev clang lldb lld libz-dev git ninja-build uuid-dev autoconf-archive curl zip unzip tar pkg-config bison libtool flex vim python3-pip +pip3 install cmake==3.28.3 #velox script needs sudo to install dependency libraries apt install sudo @@ -57,4 +58,8 @@ cd incubator-gluten/ # It's suggested to build using static link, enabled by `--enable_vcpkg=ON` # For developer, it's suggested to enable Debug info, by --build_type=RelWithDebInfo. Note RelWithDebInfo uses -o2, release uses -o3 ./dev/buildbundle-veloxbe.sh --enable_vcpkg=ON --build_type=RelWithDebInfo + +# If you meet the error like `epoll_wait: Function not implemented` when running tests, +# Please enable epoll_pwait by, +export EVENT_NOEPOLL=1 ``` diff --git a/docs/get-started/ClickHouse.md b/docs/get-started/ClickHouse.md index ab24de7a4fd68..f0b7fc13b2975 100644 --- a/docs/get-started/ClickHouse.md +++ b/docs/get-started/ClickHouse.md @@ -629,19 +629,26 @@ public read-only account:gluten/hN2xX3uQ4m ### Celeborn support -Gluten with clickhouse backend has not yet supportted [Celeborn](https://github.com/apache/celeborn) natively as remote shuffle service using columar shuffle. However, you can still use Celeborn with row shuffle, which means a ColumarBatch will be converted to a row during shuffle. -Below introduction is used to enable this feature: +Gluten with clickhouse backend supports [Celeborn](https://github.com/apache/celeborn) as remote shuffle service. Currently, the supported Celeborn versions are `0.3.x`, `0.4.x` and `0.5.0`. + +Below introduction is used to enable this feature. First refer to this URL(https://github.com/apache/celeborn) to setup a celeborn cluster. +When compiling the Gluten Java module, it's required to enable `celeborn` profile, as follows: + +``` +mvn clean package -Pbackends-clickhouse -Pspark-3.3 -Pceleborn -DskipTests +``` + Then add the Spark Celeborn Client packages to your Spark application's classpath(usually add them into `$SPARK_HOME/jars`). - Celeborn: celeborn-client-spark-3-shaded_2.12-[celebornVersion].jar -Currently to use Celeborn following configurations are required in `spark-defaults.conf` +Currently to use Gluten following configurations are required in `spark-defaults.conf` ``` -spark.shuffle.manager org.apache.spark.shuffle.celeborn.SparkShuffleManager +spark.shuffle.manager org.apache.spark.shuffle.gluten.celeborn.CelebornShuffleManager # celeborn master spark.celeborn.master.endpoints clb-master:9097 @@ -670,24 +677,6 @@ spark.celeborn.storage.hdfs.dir hdfs:///celeborn spark.dynamicAllocation.enabled false ``` -#### Celeborn Columnar Shuffle Support -Currently, the supported Celeborn versions are `0.3.x` and `0.4.0`. -The native Celeborn support can be enabled by the following configuration -``` -spark.shuffle.manager=org.apache.spark.shuffle.gluten.celeborn.CelebornShuffleManager -``` - -quickly start a celeborn cluster -```shell -wget https://archive.apache.org/dist/celeborn/celeborn-0.3.2-incubating/apache-celeborn-0.3.2-incubating-bin.tgz && \ -tar -zxvf apache-celeborn-0.3.2-incubating-bin.tgz && \ -mv apache-celeborn-0.3.2-incubating-bin/conf/celeborn-defaults.conf.template apache-celeborn-0.3.2-incubating-bin/conf/celeborn-defaults.conf && \ -mv apache-celeborn-0.3.2-incubating-bin/conf/log4j2.xml.template apache-celeborn-0.3.2-incubating-bin/conf/log4j2.xml && \ -mkdir /opt/hadoop && chmod 777 /opt/hadoop && \ -echo -e "celeborn.worker.flusher.threads 4\nceleborn.worker.storage.dirs /tmp\nceleborn.worker.monitor.disk.enabled false" > apache-celeborn-0.3.2-incubating-bin/conf/celeborn-defaults.conf && \ -bash apache-celeborn-0.3.2-incubating-bin/sbin/start-master.sh && bash apache-celeborn-0.3.2-incubating-bin/sbin/start-worker.sh -``` - ### Columnar shuffle mode We have two modes of columnar shuffle 1. prefer cache diff --git a/docs/get-started/Velox.md b/docs/get-started/Velox.md index d65b94fc1c263..ff3b8f4b90f43 100644 --- a/docs/get-started/Velox.md +++ b/docs/get-started/Velox.md @@ -222,13 +222,13 @@ Currently there are several ways to asscess S3 in Spark. Please refer [Velox S3] ## Celeborn support -Gluten with velox backend supports [Celeborn](https://github.com/apache/celeborn) as remote shuffle service. Currently, the supported Celeborn versions are `0.3.x` and `0.4.0`. +Gluten with velox backend supports [Celeborn](https://github.com/apache/celeborn) as remote shuffle service. Currently, the supported Celeborn versions are `0.3.x`, `0.4.x` and `0.5.0`. -Below introduction is used to enable this feature +Below introduction is used to enable this feature. First refer to this URL(https://github.com/apache/celeborn) to setup a celeborn cluster. -When compiling the Gluten Java module, it's required to enable `rss` profile, as follows: +When compiling the Gluten Java module, it's required to enable `celeborn` profile, as follows: ``` mvn clean package -Pbackends-velox -Pspark-3.3 -Pceleborn -DskipTests diff --git a/docs/get-started/build-guide.md b/docs/get-started/build-guide.md index b2e4b95603011..a9e9bd1266df6 100644 --- a/docs/get-started/build-guide.md +++ b/docs/get-started/build-guide.md @@ -14,8 +14,8 @@ Please set them via `--`, e.g. `--build_type=Release`. | build_tests | Build gluten cpp tests. | OFF | | build_examples | Build udf example. | OFF | | build_benchmarks | Build gluten cpp benchmarks. | OFF | -| build_jemalloc | Build with jemalloc. | OFF | -| build_protobuf | Build protobuf lib. | ON | +| build_jemalloc | Build with jemalloc. | OFF | +| build_protobuf | Build protobuf lib. | OFF | | enable_qat | Enable QAT for shuffle data de/compression. | OFF | | enable_iaa | Enable IAA for shuffle data de/compression. | OFF | | enable_hbm | Enable HBM allocator. | OFF | @@ -55,17 +55,18 @@ Please set them via `--`, e.g., `--velox_home=/YOUR/PATH`. ### Maven build parameters The below parameters can be set via `-P` for mvn. -| Parameters | Description | Default state | -|---------------------|------------------------------------------------------------------------------|---------------| -| backends-velox | Build Gluten Velox backend. | disabled | -| backends-clickhouse | Build Gluten ClickHouse backend. | disabled | -| rss | Build Gluten with Remote Shuffle Service, only applicable for Velox backend. | disabled | -| delta | Build Gluten with Delta Lake support. | disabled | -| iceberg | Build Gluten with Iceberg support. | disabled | -| spark-3.2 | Build Gluten for Spark 3.2. | enabled | -| spark-3.3 | Build Gluten for Spark 3.3. | disabled | -| spark-3.4 | Build Gluten for Spark 3.4. | disabled | -| spark-3.5 | Build Gluten for Spark 3.5. | disabled | +| Parameters | Description | Default state | +|---------------------|---------------------------------------|---------------| +| backends-velox | Build Gluten Velox backend. | disabled | +| backends-clickhouse | Build Gluten ClickHouse backend. | disabled | +| celeborn | Build Gluten with Celeborn. | disabled | +| uniffle | Build Gluten with Uniffle. | disabled | +| delta | Build Gluten with Delta Lake support. | disabled | +| iceberg | Build Gluten with Iceberg support. | disabled | +| spark-3.2 | Build Gluten for Spark 3.2. | enabled | +| spark-3.3 | Build Gluten for Spark 3.3. | disabled | +| spark-3.4 | Build Gluten for Spark 3.4. | disabled | +| spark-3.5 | Build Gluten for Spark 3.5. | disabled | ## Gluten Jar for Deployment The gluten jar built out is under `GLUTEN_SRC/package/target/`. diff --git a/docs/velox-backend-support-progress.md b/docs/velox-backend-support-progress.md index f39bd7016707b..01c730a891f9f 100644 --- a/docs/velox-backend-support-progress.md +++ b/docs/velox-backend-support-progress.md @@ -161,7 +161,7 @@ Gluten supports 199 functions. (Drag to right to see all data types) | lcase, lower | lower | lower | S | | | | | | | | | | | S | | | | | | | | | | left | | | S | | | | | | | | | | | S | | | | | | | | | | length | length | length | S | | | | | | | | | | | S | | | | | | | | | -| levenshtein | | | | | | | | | | | | | | | | | | | | | | | +| levenshtein | | levenshtein | S | | | | | | | | | | | | | | | | | | | | | locate | strpos | | S | Mismatched | | | | | | | | | | S | | | | | | | | | | lower | lower | lower | S | | | | | | | | | | | S | | | | | | | | | | lpad | lpad | | S | | | | | | | | | | | S | | | | | | | | | @@ -171,7 +171,7 @@ Gluten supports 199 functions. (Drag to right to see all data types) | parse_url | | | | | | | | | | | | | | | | | | | | | | | | position | strpos | | | | | | | | | | | | | | | | | | | | | | | printf | | | | | | | | | | | | | | | | | | | | | | | -| repeat | | | | | | | | | | | | | | | | | | | | | | | +| repeat | | repeat | S | | | | | | | | | | | | | | | | | | | | | replace | replace | replace | S | | | | | | | | | | | S | | | | | | | | | | reverse | reverse | | S | | | | | | | | | | | S | | | | | | | | | | right | | | | | | | | | | | | | | | | | | | | | | | @@ -185,7 +185,7 @@ Gluten supports 199 functions. (Drag to right to see all data types) | startswith | | startsWith | | | | | | | | | | | | | | | | | | | | | | substr, substring | substr | substring | S | | | | | | | | | | | S | | | | | | | | | | substring, substr | substr | substring | S | | | | | | | | | | | S | | | | | | | | | -| substring_index | | | | | | | | | | | | | | | | | | | | | | | +| substring_index | | substring_index | S | | | | | | | | | | | | | | | | | | | | | translate | | | | | | | | | | | | | | | | | | | | | | | | trim | trim | trim | S | | | | | | | | | | | S | | | | | | | | | | ucase, upper | upper | upper | S | | | | | | | | | | | S | | | | | | | | | @@ -233,7 +233,7 @@ Gluten supports 199 functions. (Drag to right to see all data types) | hex | | | S | | | | | | S | | | | | S | | | S | | | | | | | hypot | | | | | | | | | | | | | | | | | | | | | | | | ln | ln | | S | | | S | S | S | S | S | S | | | | | | | | | | | | -| log | ln | | S | | | S | S | S | S | S | S | | | | | | | | | | | | +| log | ln | log | S | | | S | S | S | S | S | S | | | | | | | | | | | | | log10 | log10 | | S | | | S | S | S | S | S | S | | | | | | | | | | | | | log1p | | | | | | | | | | | | | | | | | | | | | | | | log2 | log2 | | S | | | S | S | S | S | S | S | | | | | | | | | | | | @@ -257,7 +257,7 @@ Gluten supports 199 functions. (Drag to right to see all data types) | sqrt | sqrt | | S | | | S | S | S | S | S | S | | | | | | | | | | | | | tan | tan | | S | | | S | S | S | S | S | S | | | | | | | | | | | | | tanh | tanh | | S | | | S | S | S | S | S | S | | | | | | | | | | | | -| width_bucket | width_bucket | | | | | | | | | | | | | | | | | | | | | | +| width_bucket | width_bucket | width_bucket | S | | | | | | | | | | | | | | | | | | | | | array | | array | S | | | | | | | | | | | | | | | | S | | | | | aggregate | aggregate | reduce | S | | | | | | | | | | | | | | | | S | | | | | array_contains | | array_contains | S | | | | | | | | | | | | | | | | | | | | @@ -301,8 +301,8 @@ Gluten supports 199 functions. (Drag to right to see all data types) | sort_array | | sort_array | S | | | | | | | | | | | | | | | | | | | | | str_to_map | | | S | | | | | | | | | | | | | | | | | | | | | transform | transform | transofrm | | | | | | | | | | | | | | | | | | | | | -| transform_keys | transform_keys | | | | | | | | | | | | | | | | | | | | | | -| transform_values | transform_values | | | | | | | | | | | | | | | | | | | | | | +| transform_keys | transform_keys | | PS | | | | | | | | | | | | | | | | | | | | +| transform_values | transform_values | | PS | | | | | | | | | | | | | | | | | | | | | zip_with | zip_with | S | | | | | | | | | | | | | | | | | | | | | | add_months | | | S | | | | | | | | | | | | | | | | | | | | | current_date | | | S* | | | | | | | | | | | | | | | | | | | | @@ -430,9 +430,9 @@ Gluten supports 199 functions. (Drag to right to see all data types) | hash | hash | hash | S | | S | S | S | S | S | S | S | | | | | | | | | | | | | inline | | | | | | | | | | | | | | | | | | | | | | | | inline_outer | | | | | | | | | | | | | | | | | | | | | | | -| input_file_name | | | | | | | | | | | | | | | | | | | | | | | -| input_file_block_length | | | | | | | | | | | | | | | | | | | | | | | -| input_file_block_start | | | | | | | | | | | | | | | | | | | | | | | +| input_file_name | | | S | | | | | | | | | | | | | | | | | | | | +| input_file_block_length | | | S | | | | | | | | | | | | | | | | | | | | +| input_file_block_start | | | S | | | | | | | | | | | | | | | | | | | | | java_method | | | | | | | | | | | | | | | | | | | | | | | | least | least | least | S | | | | | | S | S | S | S | S | | | | | | | | | | | md5 | md5 | | S | | | S | | | | | | | | | | | | | | | | | @@ -440,7 +440,7 @@ Gluten supports 199 functions. (Drag to right to see all data types) | nanvl | | | S | | | | | | | | | | | | | | | | | | | | | nvl | | | | | | | | | | | | | | | | | | | | | | | | nvl2 | | | | | | | | | | | | | | | | | | | | | | | -| raise_error | | | | | | | | | | | | | | | | | | | | | | | +| raise_error | | raise_error | S | | | | | | | | | | | | | | | | | | | | | reflect | | | | | | | | | | | | | | | | | | | | | | | | sha | | | S | | | | | | | | | | | S | | | | | | | | | | sha1 | sha1 | sha1 | S | | | | | | | | | | | S | | | | | | | | | diff --git a/ep/build-velox/src/build_velox.sh b/ep/build-velox/src/build_velox.sh index b812b6b52bd65..873d3638cf14b 100755 --- a/ep/build-velox/src/build_velox.sh +++ b/ep/build-velox/src/build_velox.sh @@ -33,7 +33,6 @@ ENABLE_BENCHMARK=OFF ENABLE_TESTS=OFF # Set to ON for gluten cpp test build. BUILD_TEST_UTILS=OFF -RUN_SETUP_SCRIPT=ON NUM_THREADS="" OTHER_ARGUMENTS="" @@ -82,10 +81,6 @@ for arg in "$@"; do ENABLE_BENCHMARK=("${arg#*=}") shift # Remove argument name from processing ;; - --run_setup_script=*) - RUN_SETUP_SCRIPT=("${arg#*=}") - shift # Remove argument name from processing - ;; --num_threads=*) NUM_THREADS=("${arg#*=}") shift # Remove argument name from processing @@ -98,16 +93,8 @@ for arg in "$@"; do done function compile { - if [ -z "${GLUTEN_VCPKG_ENABLED:-}" ] && [ $RUN_SETUP_SCRIPT == "ON" ]; then - if [ $OS == 'Linux' ]; then - setup_linux - elif [ $OS == 'Darwin' ]; then - setup_macos - else - echo "Unsupported kernel: $OS" - exit 1 - fi - fi + # Maybe there is some set option in velox setup script. Run set command again. + set -exu CXX_FLAGS='-Wno-missing-field-initializers' COMPILE_OPTION="-DCMAKE_CXX_FLAGS=\"$CXX_FLAGS\" -DVELOX_ENABLE_PARQUET=ON -DVELOX_BUILD_TESTING=OFF" @@ -147,6 +134,7 @@ function compile { echo "NUM_THREADS_OPTS: $NUM_THREADS_OPTS" export simdjson_SOURCE=AUTO + export Arrow_SOURCE=AUTO if [ $ARCH == 'x86_64' ]; then make $COMPILE_TYPE $NUM_THREADS_OPTS EXTRA_CMAKE_FLAGS="${COMPILE_OPTION}" elif [[ "$ARCH" == 'arm64' || "$ARCH" == 'aarch64' ]]; then @@ -212,66 +200,6 @@ function check_commit { fi } -function setup_macos { - if [ $ARCH == 'x86_64' ]; then - ./scripts/setup-macos.sh - elif [ $ARCH == 'arm64' ]; then - CPU_TARGET="arm64" ./scripts/setup-macos.sh - else - echo "Unknown arch: $ARCH" - fi -} - -function setup_linux { - local LINUX_DISTRIBUTION=$(. /etc/os-release && echo ${ID}) - local LINUX_VERSION_ID=$(. /etc/os-release && echo ${VERSION_ID}) - - if [[ "$LINUX_DISTRIBUTION" == "ubuntu" || "$LINUX_DISTRIBUTION" == "debian" || "$LINUX_DISTRIBUTION" == "pop" ]]; then - scripts/setup-ubuntu.sh - elif [[ "$LINUX_DISTRIBUTION" == "centos" ]]; then - case "$LINUX_VERSION_ID" in - 8) scripts/setup-centos8.sh ;; - 7) - scripts/setup-centos7.sh - set +u - export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:/usr/local/lib/pkgconfig:/usr/lib64/pkgconfig:/usr/lib/pkgconfig:$PKG_CONFIG_PATH - source /opt/rh/devtoolset-9/enable - set -u - ;; - *) - echo "Unsupported centos version: $LINUX_VERSION_ID" - exit 1 - ;; - esac - elif [[ "$LINUX_DISTRIBUTION" == "alinux" ]]; then - case "${LINUX_VERSION_ID:0:1}" in - 2) - scripts/setup-centos7.sh - set +u - export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig:/usr/local/lib/pkgconfig:/usr/lib64/pkgconfig:/usr/lib/pkgconfig:$PKG_CONFIG_PATH - source /opt/rh/devtoolset-9/enable - set -u - ;; - 3) scripts/setup-centos8.sh ;; - *) - echo "Unsupported alinux version: $LINUX_VERSION_ID" - exit 1 - ;; - esac - elif [[ "$LINUX_DISTRIBUTION" == "tencentos" ]]; then - case "$LINUX_VERSION_ID" in - 3.2) scripts/setup-centos8.sh ;; - *) - echo "Unsupported tencentos version: $LINUX_VERSION_ID" - exit 1 - ;; - esac - else - echo "Unsupported linux distribution: $LINUX_DISTRIBUTION" - exit 1 - fi -} - CURRENT_DIR=$( cd "$(dirname "$BASH_SOURCE")" pwd diff --git a/ep/build-velox/src/get_velox.sh b/ep/build-velox/src/get_velox.sh index 0adc1ce8ff613..51ea70849a8f8 100755 --- a/ep/build-velox/src/get_velox.sh +++ b/ep/build-velox/src/get_velox.sh @@ -16,14 +16,13 @@ set -exu + VELOX_REPO=https://github.com/oap-project/velox.git -VELOX_BRANCH=2024_06_28 +VELOX_BRANCH=2024_07_17 VELOX_HOME="" #Set on run gluten on HDFS ENABLE_HDFS=OFF -#It can be set to OFF when compiling velox again -BUILD_PROTOBUF=ON #Set on run gluten on S3 ENABLE_S3=OFF #Set on run gluten on GCS @@ -47,10 +46,6 @@ for arg in "$@"; do VELOX_HOME=("${arg#*=}") shift # Remove argument name from processing ;; - --build_protobuf=*) - BUILD_PROTOBUF=("${arg#*=}") - shift # Remove argument name from processing - ;; --enable_hdfs=*) ENABLE_HDFS=("${arg#*=}") shift # Remove argument name from processing @@ -95,15 +90,13 @@ function process_setup_ubuntu { sed -i '/ccache/a\ curl \\' scripts/setup-ubuntu.sh sed -i '/libgmock-dev/d' scripts/setup-ubuntu.sh # resolved by ep/build-velox/build/velox_ep/CMake/resolve_dependency_modules/gtest.cmake sed -i 's/github_checkout boostorg\/boost \"\${BOOST_VERSION}\" --recursive/wget_and_untar https:\/\/github.com\/boostorg\/boost\/releases\/download\/boost-1.84.0\/boost-1.84.0.tar.gz boost \&\& cd boost/g' scripts/setup-ubuntu.sh + sed -i '/^function install_folly.*/i function install_protobuf {\n wget https://github.com/protocolbuffers/protobuf/releases/download/v21.4/protobuf-all-21.4.tar.gz\n tar -xzf protobuf-all-21.4.tar.gz\n cd protobuf-21.4\n ./configure CXXFLAGS="-fPIC" --prefix=/usr/local\n make "-j$(nproc)"\n sudo make install\n sudo ldconfig\n}\n' scripts/setup-ubuntu.sh + sed -i '/^ run_and_time install_folly/a \ \ run_and_time install_protobuf' scripts/setup-ubuntu.sh if [ $ENABLE_HDFS == "ON" ]; then sed -i '/^function install_folly.*/i function install_libhdfs3 {\n github_checkout oap-project/libhdfs3 master \n cmake_install\n}\n' scripts/setup-ubuntu.sh - sed -i '/^ run_and_time install_folly/a \ \ run_and_time install_libhdfs3' scripts/setup-ubuntu.sh + sed -i '/^ run_and_time install_protobuf/a \ \ run_and_time install_libhdfs3' scripts/setup-ubuntu.sh sed -i '/ccache /a\ yasm \\' scripts/setup-ubuntu.sh fi - if [ $BUILD_PROTOBUF == "ON" ]; then - sed -i '/^function install_folly.*/i function install_protobuf {\n wget https://github.com/protocolbuffers/protobuf/releases/download/v21.4/protobuf-all-21.4.tar.gz\n tar -xzf protobuf-all-21.4.tar.gz\n cd protobuf-21.4\n ./configure CXXFLAGS="-fPIC" --prefix=/usr/local\n make "-j$(nproc)"\n sudo make install\n sudo ldconfig\n}\n' scripts/setup-ubuntu.sh - sed -i '/^ run_and_time install_folly/a \ \ run_and_time install_protobuf' scripts/setup-ubuntu.sh - fi sed -i "s/apt install -y/sudo apt install -y/" ${VELOX_HOME}/scripts/setup-adapters.sh if [ $ENABLE_S3 == "ON" ]; then sed -i '/^ run_and_time install_folly/a \ \ '${VELOX_HOME}/scripts'/setup-adapters.sh aws' scripts/setup-ubuntu.sh @@ -118,7 +111,8 @@ function process_setup_ubuntu { sed -i '/^ run_and_time install_folly/a \ \ export AZURE_SDK_DISABLE_AUTO_VCPKG=ON \n '${VELOX_HOME}/scripts'/setup-adapters.sh abfs' scripts/setup-ubuntu.sh fi sed -i '/run_and_time install_conda/d' scripts/setup-ubuntu.sh - + # Just depends on Gluten to install arrow libs since Gluten will apply some patches to Arrow source and uses different build options. + sed -i '/run_and_time install_arrow/d' scripts/setup-ubuntu.sh } function process_setup_centos8 { @@ -136,15 +130,14 @@ function process_setup_centos8 { sed -i '/^dnf_install autoconf/a\dnf_install libxml2-devel libgsasl-devel libuuid-devel' scripts/setup-centos8.sh sed -i '/^function install_gflags.*/i function install_openssl {\n wget_and_untar https://github.com/openssl/openssl/archive/refs/tags/OpenSSL_1_1_1s.tar.gz openssl \n cd openssl \n ./config no-shared && make depend && make && sudo make install \n cd ..\n}\n' scripts/setup-centos8.sh sed -i '/^ run_and_time install_fbthrift/a \ run_and_time install_openssl' scripts/setup-centos8.sh + sed -i '/cd protobuf/{n;s/\.\/configure --prefix=\/usr/\.\/configure CXXFLAGS="-fPIC" --prefix=\/usr\/local/;}' scripts/setup-centos8.sh if [ $ENABLE_HDFS == "ON" ]; then sed -i '/^function install_gflags.*/i function install_libhdfs3 {\n cd "\${DEPENDENCY_DIR}"\n github_checkout oap-project/libhdfs3 master\n cmake_install\n}\n' scripts/setup-centos8.sh sed -i '/^ run_and_time install_fbthrift/a \ run_and_time install_libhdfs3' scripts/setup-centos8.sh sed -i '/^ dnf_install ninja-build/a\ dnf_install yasm\' scripts/setup-centos8.sh fi - if [[ $BUILD_PROTOBUF == "ON" ]] || [[ $ENABLE_HDFS == "ON" ]]; then - sed -i '/cd protobuf/{n;s/\.\/configure --prefix=\/usr/\.\/configure CXXFLAGS="-fPIC" --prefix=\/usr\/local/;}' scripts/setup-centos8.sh - fi + sed -i "s/yum -y install/sudo yum -y install/" ${VELOX_HOME}/scripts/setup-adapters.sh if [ $ENABLE_S3 == "ON" ]; then sed -i '/^ run_and_time install_fbthrift/a \ \ '${VELOX_HOME}/scripts'/setup-adapters.sh aws' scripts/setup-centos8.sh @@ -172,15 +165,13 @@ function process_setup_centos7 { # install gtest sed -i '/^ run_and_time install_folly/a \ \ run_and_time install_gtest' scripts/setup-centos7.sh - + sed -i '/^ run_and_time install_folly/a \ \ run_and_time install_protobuf' scripts/setup-centos7.sh + sed -i 's/https:\/\/cmake.org\/files\/v3.25\/cmake-3.25.1.tar.gz/https:\/\/cmake.org\/files\/v3.28\/cmake-3.28.3.tar.gz/' scripts/setup-centos7.sh if [ $ENABLE_HDFS = "ON" ]; then sed -i '/^function install_protobuf.*/i function install_libhdfs3 {\n cd "\${DEPENDENCY_DIR}"\n github_checkout oap-project/libhdfs3 master \n cmake_install\n}\n' scripts/setup-centos7.sh - sed -i '/^ run_and_time install_folly/a \ \ run_and_time install_libhdfs3' scripts/setup-centos7.sh + sed -i '/^ run_and_time install_protobuf/a \ \ run_and_time install_libhdfs3' scripts/setup-centos7.sh sed -i '/^dnf_install ccache/a\ \ yasm \\' scripts/setup-centos7.sh fi - if [[ $BUILD_PROTOBUF == "ON" ]] || [[ $ENABLE_HDFS == "ON" ]]; then - sed -i '/^ run_and_time install_folly/a \ \ run_and_time install_protobuf' scripts/setup-centos7.sh - fi sed -i "s/yum -y install/sudo yum -y install/" ${VELOX_HOME}/scripts/setup-adapters.sh if [ $ENABLE_S3 == "ON" ]; then sed -i '/^ run_and_time install_folly/a \ \ '${VELOX_HOME}/scripts'/setup-adapters.sh aws' scripts/setup-centos7.sh @@ -209,7 +200,6 @@ function process_setup_alinux3 { sed -i 's/python39 python39-devel python39-pip //g' scripts/setup-centos8.sh sed -i "s/.*pip.* install/#&/" scripts/setup-centos8.sh sed -i 's/ADDITIONAL_FLAGS=""/ADDITIONAL_FLAGS="-Wno-stringop-overflow"/g' scripts/setup-helper-functions.sh - sed -i "s/\${CMAKE_INSTALL_LIBDIR}/lib64/" third_party/CMakeLists.txt } function process_setup_tencentos32 { @@ -219,7 +209,6 @@ function process_setup_tencentos32 { echo "Preparing Velox source code..." echo "ENABLE_HDFS=${ENABLE_HDFS}" -echo "BUILD_PROTOBUF=${BUILD_PROTOBUF}" CURRENT_DIR=$( cd "$(dirname "$BASH_SOURCE")" @@ -256,11 +245,11 @@ function apply_compilation_fixes { current_dir=$1 velox_home=$2 sudo cp ${current_dir}/modify_velox.patch ${velox_home}/ - sudo cp ${current_dir}/modify_arrow.patch ${velox_home}/third_party/ - sudo cp ${current_dir}/modify_arrow_dataset_scan_option.patch ${velox_home}/third_party/ + sudo cp ${current_dir}/modify_arrow.patch ${velox_home}/CMake/resolve_dependency_modules/arrow/ + sudo cp ${current_dir}/modify_arrow_dataset_scan_option.patch ${velox_home}/CMake/resolve_dependency_modules/arrow/ git add ${velox_home}/modify_velox.patch # to avoid the file from being deleted by git clean -dffx :/ - git add ${velox_home}/third_party/modify_arrow.patch # to avoid the file from being deleted by git clean -dffx :/ - git add ${velox_home}/third_party/modify_arrow_dataset_scan_option.patch # to avoid the file from being deleted by git clean -dffx :/ + git add ${velox_home}/CMake/resolve_dependency_modules/arrow/modify_arrow.patch # to avoid the file from being deleted by git clean -dffx :/ + git add ${velox_home}/CMake/resolve_dependency_modules/arrow/modify_arrow_dataset_scan_option.patch # to avoid the file from being deleted by git clean -dffx :/ cd ${velox_home} echo "Applying patch to Velox source code..." git apply modify_velox.patch @@ -299,6 +288,7 @@ function setup_linux { esac elif [[ "$LINUX_DISTRIBUTION" == "tencentos" ]]; then case "$LINUX_VERSION_ID" in + 2.4) process_setup_centos7 ;; 3.2) process_setup_tencentos32 ;; *) echo "Unsupport tencentos version: $LINUX_VERSION_ID" diff --git a/ep/build-velox/src/modify_velox.patch b/ep/build-velox/src/modify_velox.patch index aee406c3eae08..5fd8b8b1eda8e 100644 --- a/ep/build-velox/src/modify_velox.patch +++ b/ep/build-velox/src/modify_velox.patch @@ -35,13 +35,73 @@ index d49115f12..1aaa8e532 100644 + IMPORTED_LOCATION_DEBUG "${LZ4_LIBRARY_DEBUG}") + endif() endif() +diff --git a/CMake/resolve_dependency_modules/arrow/CMakeLists.txt b/CMake/resolve_dependency_modules/arrow/CMakeLists.txt +index 56b673e87..ef48ae9d9 100644 +--- a/CMake/resolve_dependency_modules/arrow/CMakeLists.txt ++++ b/CMake/resolve_dependency_modules/arrow/CMakeLists.txt +@@ -14,16 +14,13 @@ + project(Arrow) + + if(VELOX_ENABLE_ARROW) +- find_package(Thrift) +- if(Thrift_FOUND) +- set(THRIFT_SOURCE "SYSTEM") +- else() +- set(THRIFT_SOURCE "BUNDLED") +- endif() +- + set(ARROW_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/arrow_ep") + set(ARROW_CMAKE_ARGS +- -DARROW_PARQUET=OFF ++ -DARROW_PARQUET=ON ++ -DARROW_FILESYSTEM=ON ++ -DARROW_PROTOBUF_USE_SHARED=OFF ++ -DARROW_DEPENDENCY_USE_SHARED=OFF ++ -DARROW_DEPENDENCY_SOURCE=BUNDLED + -DARROW_WITH_THRIFT=ON + -DARROW_WITH_LZ4=ON + -DARROW_WITH_SNAPPY=ON +@@ -37,18 +34,16 @@ if(VELOX_ENABLE_ARROW) + -DCMAKE_INSTALL_PREFIX=${ARROW_PREFIX}/install + -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DARROW_BUILD_STATIC=ON +- -DThrift_SOURCE=${THRIFT_SOURCE} ++ -DARROW_BUILD_SHARED=OFF + -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}) + set(ARROW_LIBDIR ${ARROW_PREFIX}/install/${CMAKE_INSTALL_LIBDIR}) + + add_library(thrift STATIC IMPORTED GLOBAL) +- if(NOT Thrift_FOUND) +- set(THRIFT_ROOT ${ARROW_PREFIX}/src/arrow_ep-build/thrift_ep-install) +- set(THRIFT_LIB ${THRIFT_ROOT}/lib/libthrift.a) ++ set(THRIFT_ROOT ${ARROW_PREFIX}/src/arrow_ep-build/thrift_ep-install) ++ set(THRIFT_LIB ${THRIFT_ROOT}/lib/libthrift.a) + +- file(MAKE_DIRECTORY ${THRIFT_ROOT}/include) +- set(THRIFT_INCLUDE_DIR ${THRIFT_ROOT}/include) +- endif() ++ file(MAKE_DIRECTORY ${THRIFT_ROOT}/include) ++ set(THRIFT_INCLUDE_DIR ${THRIFT_ROOT}/include) + + set_property(TARGET thrift PROPERTY INTERFACE_INCLUDE_DIRECTORIES + ${THRIFT_INCLUDE_DIR}) +@@ -67,6 +62,9 @@ if(VELOX_ENABLE_ARROW) + arrow_ep + PREFIX ${ARROW_PREFIX} + URL ${VELOX_ARROW_SOURCE_URL} ++ PATCH_COMMAND patch -p1 < ${CMAKE_CURRENT_SOURCE_DIR}/modify_arrow.patch ++ COMMAND patch -p1 < ++ ${CMAKE_CURRENT_SOURCE_DIR}/modify_arrow_dataset_scan_option.patch + URL_HASH ${VELOX_ARROW_BUILD_SHA256_CHECKSUM} + SOURCE_SUBDIR cpp + CMAKE_ARGS ${ARROW_CMAKE_ARGS} diff --git a/CMakeLists.txt b/CMakeLists.txt -index 5c7bf770a..9f897f577 100644 +index bb7c49907..3372d48b4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -234,10 +234,15 @@ if(VELOX_ENABLE_ABFS) endif() - + if(VELOX_ENABLE_HDFS) - find_library( - LIBHDFS3 @@ -58,48 +118,23 @@ index 5c7bf770a..9f897f577 100644 + endif() add_definitions(-DVELOX_ENABLE_HDFS3) endif() - -@@ -377,7 +382,7 @@ resolve_dependency(Boost 1.77.0 COMPONENTS ${BOOST_INCLUDE_LIBRARIES}) + +@@ -378,7 +383,7 @@ resolve_dependency(Boost 1.77.0 COMPONENTS ${BOOST_INCLUDE_LIBRARIES}) # for reference. find_package(range-v3) - + set_source(gflags) -resolve_dependency(gflags COMPONENTS ${VELOX_GFLAGS_TYPE}) +resolve_dependency(gflags) if(NOT TARGET gflags::gflags) # This is a bit convoluted, but we want to be able to use gflags::gflags as a # target even when velox is built as a subproject which uses - -diff --git a/third_party/CMakeLists.txt b/third_party/CMakeLists.txt -index ce4c24dbe..785a2acc6 100644 ---- a/third_party/CMakeLists.txt -+++ b/third_party/CMakeLists.txt -@@ -26,7 +26,9 @@ if(VELOX_ENABLE_ARROW) - endif() - set(ARROW_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/arrow_ep") - set(ARROW_CMAKE_ARGS -- -DARROW_PARQUET=OFF -+ -DARROW_PARQUET=ON -+ -DARROW_FILESYSTEM=ON -+ -DARROW_PROTOBUF_USE_SHARED=OFF - -DARROW_WITH_THRIFT=ON - -DARROW_WITH_LZ4=ON - -DARROW_WITH_SNAPPY=ON -@@ -69,6 +71,8 @@ if(VELOX_ENABLE_ARROW) - arrow_ep - PREFIX ${ARROW_PREFIX} - URL ${VELOX_ARROW_SOURCE_URL} -+ PATCH_COMMAND patch -p1 < ${CMAKE_CURRENT_SOURCE_DIR}/modify_arrow.patch -+ COMMAND patch -p1 < ${CMAKE_CURRENT_SOURCE_DIR}/modify_arrow_dataset_scan_option.patch - URL_HASH ${VELOX_ARROW_BUILD_SHA256_CHECKSUM} - SOURCE_SUBDIR cpp - CMAKE_ARGS ${ARROW_CMAKE_ARGS} diff --git a/velox/common/process/tests/CMakeLists.txt b/velox/common/process/tests/CMakeLists.txt index 6797697a1..3e241f8f7 100644 --- a/velox/common/process/tests/CMakeLists.txt +++ b/velox/common/process/tests/CMakeLists.txt @@ -18,4 +18,4 @@ add_executable(velox_process_test ProfilerTest.cpp ThreadLocalRegistryTest.cpp add_test(velox_process_test velox_process_test) - + target_link_libraries(velox_process_test PRIVATE velox_process fmt::fmt gtest - velox_time gtest_main) + velox_time gtest_main glog::glog gflags::gflags) @@ -108,7 +143,7 @@ index e2a638df6..e383cf205 100644 --- a/velox/connectors/hive/storage_adapters/abfs/RegisterAbfsFileSystem.cpp +++ b/velox/connectors/hive/storage_adapters/abfs/RegisterAbfsFileSystem.cpp @@ -38,7 +38,6 @@ std::shared_ptr abfsFileSystemGenerator( - + void registerAbfsFileSystem() { #ifdef VELOX_ENABLE_ABFS - LOG(INFO) << "Register ABFS"; @@ -127,7 +162,7 @@ index 10ee508ba..027a58ecc 100644 + hadoopHomeDirectory.remove_filename().remove_filename(); setupEnvironment(hadoopHomeDirectory.string()); } - + diff --git a/velox/dwio/parquet/writer/arrow/tests/CMakeLists.txt b/velox/dwio/parquet/writer/arrow/tests/CMakeLists.txt index 2cabfc29a..54329ce23 100644 --- a/velox/dwio/parquet/writer/arrow/tests/CMakeLists.txt diff --git a/gluten-celeborn/clickhouse/pom.xml b/gluten-celeborn/clickhouse/pom.xml index 74b81031fb38a..f17f5968d3511 100755 --- a/gluten-celeborn/clickhouse/pom.xml +++ b/gluten-celeborn/clickhouse/pom.xml @@ -127,7 +127,7 @@ org.scalatestplus - scalatestplus-mockito_2.12 + scalatestplus-mockito_${scala.binary.version} 1.0.0-M2 test @@ -138,7 +138,7 @@ org.scalatestplus - scalatestplus-scalacheck_2.12 + scalatestplus-scalacheck_${scala.binary.version} 3.1.0.0-RC2 test diff --git a/gluten-celeborn/clickhouse/src/main/resources/META-INF/services/org.apache.spark.shuffle.gluten.celeborn.CelebornShuffleWriterFactory b/gluten-celeborn/clickhouse/src/main/resources/META-INF/services/org.apache.spark.shuffle.gluten.celeborn.CelebornShuffleWriterFactory index 1ed69d8149098..a6101db1159bd 100644 --- a/gluten-celeborn/clickhouse/src/main/resources/META-INF/services/org.apache.spark.shuffle.gluten.celeborn.CelebornShuffleWriterFactory +++ b/gluten-celeborn/clickhouse/src/main/resources/META-INF/services/org.apache.spark.shuffle.gluten.celeborn.CelebornShuffleWriterFactory @@ -1 +1 @@ -org.apache.spark.shuffle.CHCelebornHashBasedColumnarShuffleWriterFactory +org.apache.spark.shuffle.CHCelebornColumnarShuffleWriterFactory diff --git a/gluten-celeborn/clickhouse/src/main/scala/org/apache/spark/shuffle/CHCelebornColumnarBatchSerializer.scala b/gluten-celeborn/clickhouse/src/main/scala/org/apache/spark/shuffle/CHCelebornColumnarBatchSerializer.scala index 39aefb01c2aeb..3619855f74ed5 100644 --- a/gluten-celeborn/clickhouse/src/main/scala/org/apache/spark/shuffle/CHCelebornColumnarBatchSerializer.scala +++ b/gluten-celeborn/clickhouse/src/main/scala/org/apache/spark/shuffle/CHCelebornColumnarBatchSerializer.scala @@ -32,6 +32,7 @@ import org.apache.celeborn.client.read.CelebornInputStream import java.io._ import java.nio.ByteBuffer import java.util.Locale +import java.util.concurrent.atomic.AtomicBoolean import scala.reflect.ClassTag @@ -74,7 +75,8 @@ private class CHCelebornColumnarBatchSerializerInstance( private var numBatchesTotal: Long = _ private var numRowsTotal: Long = _ - private var isClosed: Boolean = false + // Otherwise calling close() twice would cause replication of metrics. + private val closeCalled: AtomicBoolean = new AtomicBoolean(false) override def asIterator: Iterator[Any] = { // This method is never called by shuffle code. @@ -153,18 +155,18 @@ private class CHCelebornColumnarBatchSerializerInstance( } override def close(): Unit = { - if (!isClosed) { - if (numBatchesTotal > 0) { - readBatchNumRows.set(numRowsTotal.toDouble / numBatchesTotal) - } - numOutputRows += numRowsTotal - if (cb != null) { - cb.close() - cb = null - } - closeReader() - isClosed = true + if (!closeCalled.compareAndSet(false, true)) { + return + } + if (numBatchesTotal > 0) { + readBatchNumRows.set(numRowsTotal.toDouble / numBatchesTotal) + } + numOutputRows += numRowsTotal + if (cb != null) { + cb.close() + cb = null } + closeReader() } def getReader: CHStreamReader = { diff --git a/gluten-celeborn/clickhouse/src/main/scala/org/apache/spark/shuffle/CHCelebornHashBasedColumnarShuffleWriter.scala b/gluten-celeborn/clickhouse/src/main/scala/org/apache/spark/shuffle/CHCelebornColumnarShuffleWriter.scala similarity index 65% rename from gluten-celeborn/clickhouse/src/main/scala/org/apache/spark/shuffle/CHCelebornHashBasedColumnarShuffleWriter.scala rename to gluten-celeborn/clickhouse/src/main/scala/org/apache/spark/shuffle/CHCelebornColumnarShuffleWriter.scala index a7836e4a13d1e..40390a7151608 100644 --- a/gluten-celeborn/clickhouse/src/main/scala/org/apache/spark/shuffle/CHCelebornHashBasedColumnarShuffleWriter.scala +++ b/gluten-celeborn/clickhouse/src/main/scala/org/apache/spark/shuffle/CHCelebornColumnarShuffleWriter.scala @@ -29,18 +29,19 @@ import org.apache.spark.sql.vectorized.ColumnarBatch import org.apache.celeborn.client.ShuffleClient import org.apache.celeborn.common.CelebornConf +import org.apache.celeborn.common.protocol.ShuffleMode import java.io.IOException import java.util.Locale -class CHCelebornHashBasedColumnarShuffleWriter[K, V]( +class CHCelebornColumnarShuffleWriter[K, V]( shuffleId: Int, handle: CelebornShuffleHandle[K, V, V], context: TaskContext, celebornConf: CelebornConf, client: ShuffleClient, writeMetrics: ShuffleWriteMetricsReporter) - extends CelebornHashBasedColumnarShuffleWriter[K, V]( + extends CelebornColumnarShuffleWriter[K, V]( shuffleId: Int, handle, context, @@ -55,61 +56,16 @@ class CHCelebornHashBasedColumnarShuffleWriter[K, V]( private var splitResult: CHSplitResult = _ - private val nativeBufferSize: Int = GlutenConfig.getConf.shuffleWriterBufferSize - @throws[IOException] override def internalWrite(records: Iterator[Product2[K, V]]): Unit = { - if (!records.hasNext) { - handleEmptyIterator() - return - } - - if (nativeShuffleWriter == -1L) { - nativeShuffleWriter = jniWrapper.makeForRSS( - dep.nativePartitioning, - shuffleId, - mapId, - nativeBufferSize, - customizedCompressCodec, - GlutenConfig.getConf.chColumnarShuffleSpillThreshold, - CHBackendSettings.shuffleHashAlgorithm, - celebornPartitionPusher, - GlutenConfig.getConf.chColumnarThrowIfMemoryExceed, - GlutenConfig.getConf.chColumnarFlushBlockBufferBeforeEvict, - GlutenConfig.getConf.chColumnarForceExternalSortShuffle, - GlutenConfig.getConf.chColumnarForceMemorySortShuffle - ) - CHNativeMemoryAllocators.createSpillable( - "CelebornShuffleWriter", - new Spiller() { - override def spill(self: MemoryTarget, phase: Spiller.Phase, size: Long): Long = { - if (!Spillers.PHASE_SET_SPILL_ONLY.contains(phase)) { - return 0L - } - if (nativeShuffleWriter == -1L) { - throw new IllegalStateException( - "Fatal: spill() called before a celeborn shuffle writer " + - "is created. This behavior should be" + - "optimized by moving memory " + - "allocations from make() to split()") - } - logInfo(s"Gluten shuffle writer: Trying to push $size bytes of data") - val spilled = jniWrapper.evict(nativeShuffleWriter) - logInfo(s"Gluten shuffle writer: Spilled $spilled / $size bytes of data") - spilled - } - } - ) - } while (records.hasNext) { val cb = records.next()._2.asInstanceOf[ColumnarBatch] if (cb.numRows == 0 || cb.numCols == 0) { logInfo(s"Skip ColumnarBatch of ${cb.numRows} rows, ${cb.numCols} cols") } else { + initShuffleWriter(cb) val col = cb.column(0).asInstanceOf[CHColumnVector] - val block = col.getBlockAddress - jniWrapper - .split(nativeShuffleWriter, block) + jniWrapper.split(nativeShuffleWriter, col.getBlockAddress) dep.metrics("numInputRows").add(cb.numRows) dep.metrics("inputBatches").add(1) // This metric is important, AQE use it to decide if EliminateLimit @@ -117,6 +73,7 @@ class CHCelebornHashBasedColumnarShuffleWriter[K, V]( } } + assert(nativeShuffleWriter != -1L) splitResult = jniWrapper.stop(nativeShuffleWriter) dep.metrics("splitTime").add(splitResult.getSplitTime) @@ -135,6 +92,44 @@ class CHCelebornHashBasedColumnarShuffleWriter[K, V]( mapStatus = MapStatus(blockManager.shuffleServerId, splitResult.getRawPartitionLengths, mapId) } + override def createShuffleWriter(columnarBatch: ColumnarBatch): Unit = { + nativeShuffleWriter = jniWrapper.makeForRSS( + dep.nativePartitioning, + shuffleId, + mapId, + nativeBufferSize, + customizedCompressCodec, + GlutenConfig.getConf.chColumnarShuffleSpillThreshold, + CHBackendSettings.shuffleHashAlgorithm, + celebornPartitionPusher, + GlutenConfig.getConf.chColumnarThrowIfMemoryExceed, + GlutenConfig.getConf.chColumnarFlushBlockBufferBeforeEvict, + GlutenConfig.getConf.chColumnarForceExternalSortShuffle, + GlutenConfig.getConf.chColumnarForceMemorySortShuffle + || ShuffleMode.SORT.name.equalsIgnoreCase(shuffleWriterType) + ) + CHNativeMemoryAllocators.createSpillable( + "CelebornShuffleWriter", + new Spiller() { + override def spill(self: MemoryTarget, phase: Spiller.Phase, size: Long): Long = { + if (!Spillers.PHASE_SET_SPILL_ONLY.contains(phase)) { + return 0L + } + if (nativeShuffleWriter == -1L) { + throw new IllegalStateException( + "Fatal: spill() called before a celeborn shuffle writer is created. " + + "This behavior should be optimized by moving memory allocations " + + "from make() to split()") + } + logInfo(s"Gluten shuffle writer: Trying to push $size bytes of data") + val spilled = jniWrapper.evict(nativeShuffleWriter) + logInfo(s"Gluten shuffle writer: Spilled $spilled / $size bytes of data") + spilled + } + } + ) + } + override def closeShuffleWriter(): Unit = { jniWrapper.close(nativeShuffleWriter) } diff --git a/gluten-celeborn/clickhouse/src/main/scala/org/apache/spark/shuffle/CHCelebornHashBasedColumnarShuffleWriterFactory.scala b/gluten-celeborn/clickhouse/src/main/scala/org/apache/spark/shuffle/CHCelebornColumnarShuffleWriterFactory.scala similarity index 91% rename from gluten-celeborn/clickhouse/src/main/scala/org/apache/spark/shuffle/CHCelebornHashBasedColumnarShuffleWriterFactory.scala rename to gluten-celeborn/clickhouse/src/main/scala/org/apache/spark/shuffle/CHCelebornColumnarShuffleWriterFactory.scala index a64b394ee57f3..7c105933e2f9c 100644 --- a/gluten-celeborn/clickhouse/src/main/scala/org/apache/spark/shuffle/CHCelebornHashBasedColumnarShuffleWriterFactory.scala +++ b/gluten-celeborn/clickhouse/src/main/scala/org/apache/spark/shuffle/CHCelebornColumnarShuffleWriterFactory.scala @@ -25,7 +25,7 @@ import org.apache.spark.shuffle.gluten.celeborn.CelebornShuffleWriterFactory import org.apache.celeborn.client.ShuffleClient import org.apache.celeborn.common.CelebornConf -class CHCelebornHashBasedColumnarShuffleWriterFactory extends CelebornShuffleWriterFactory { +class CHCelebornColumnarShuffleWriterFactory extends CelebornShuffleWriterFactory { override def backendName(): String = CHBackend.BACKEND_NAME override def createShuffleWriterInstance[K, V]( @@ -35,7 +35,7 @@ class CHCelebornHashBasedColumnarShuffleWriterFactory extends CelebornShuffleWri celebornConf: CelebornConf, client: ShuffleClient, writeMetrics: ShuffleWriteMetricsReporter): ShuffleWriter[K, V] = { - new CHCelebornHashBasedColumnarShuffleWriter[K, V]( + new CHCelebornColumnarShuffleWriter[K, V]( shuffleId, handle, context, diff --git a/gluten-celeborn/common/src/main/java/org/apache/spark/shuffle/gluten/celeborn/CelebornShuffleManager.java b/gluten-celeborn/common/src/main/java/org/apache/spark/shuffle/gluten/celeborn/CelebornShuffleManager.java index e61aeb3d70883..a0516d1774150 100644 --- a/gluten-celeborn/common/src/main/java/org/apache/spark/shuffle/gluten/celeborn/CelebornShuffleManager.java +++ b/gluten-celeborn/common/src/main/java/org/apache/spark/shuffle/gluten/celeborn/CelebornShuffleManager.java @@ -54,6 +54,12 @@ public class CelebornShuffleManager implements ShuffleManager { private static final String LOCAL_SHUFFLE_READER_KEY = "spark.sql.adaptive.localShuffleReader.enabled"; + private static final String CELEBORN_COMPRESSION_CODEC_KEY = + CelebornConf.SHUFFLE_COMPRESSION_CODEC().key(); + + private static final String SPARK_CELEBORN_COMPRESSION_CODEC_KEY = + "spark." + CELEBORN_COMPRESSION_CODEC_KEY; + private static final CelebornShuffleWriterFactory writerFactory; static { @@ -78,6 +84,8 @@ public class CelebornShuffleManager implements ShuffleManager { private final SparkConf conf; private final CelebornConf celebornConf; + private final SparkConf rowBasedConf; + private final CelebornConf rowBasedCelebornConf; // either be "{appId}_{appAttemptId}" or "{appId}" private String appUniqueId; @@ -89,11 +97,13 @@ public class CelebornShuffleManager implements ShuffleManager { ConcurrentHashMap.newKeySet(); private final CelebornShuffleFallbackPolicyRunner fallbackPolicyRunner; + private final String celebornDefaultCodec; + // for Celeborn 0.4.0 private final Object shuffleIdTracker; // for Celeborn 0.4.0 - private boolean throwsFetchFailure; + private final boolean throwsFetchFailure; public CelebornShuffleManager(SparkConf conf) { if (conf.getBoolean(LOCAL_SHUFFLE_READER_KEY, true)) { @@ -110,6 +120,16 @@ public CelebornShuffleManager(SparkConf conf) { CelebornUtils.createInstance(CelebornUtils.EXECUTOR_SHUFFLE_ID_TRACKER_NAME); this.throwsFetchFailure = CelebornUtils.getThrowsFetchFailure(celebornConf); + + this.celebornDefaultCodec = CelebornConf.SHUFFLE_COMPRESSION_CODEC().defaultValueString(); + + this.rowBasedConf = conf.clone(); + this.rowBasedCelebornConf = celebornConf.clone(); + if ("none" + .equalsIgnoreCase(conf.get(SPARK_CELEBORN_COMPRESSION_CODEC_KEY, celebornDefaultCodec))) { + rowBasedConf.set(SPARK_CELEBORN_COMPRESSION_CODEC_KEY, celebornDefaultCodec); + rowBasedCelebornConf.set(CELEBORN_COMPRESSION_CODEC_KEY, celebornDefaultCodec); + } } private boolean isDriver() { @@ -133,7 +153,8 @@ private SparkShuffleManager vanillaCelebornShuffleManager() { synchronized (this) { if (_vanillaCelebornShuffleManager == null) { _vanillaCelebornShuffleManager = - SparkUtils.instantiateClass(VANILLA_CELEBORN_SHUFFLE_MANAGER_NAME, conf, isDriver()); + SparkUtils.instantiateClass( + VANILLA_CELEBORN_SHUFFLE_MANAGER_NAME, rowBasedConf, isDriver()); } } } @@ -244,10 +265,14 @@ public void stop() { lifecycleManager.stop(); lifecycleManager = null; } - if (columnarShuffleManager() != null) { - columnarShuffleManager().stop(); + if (_columnarShuffleManager != null) { + _columnarShuffleManager.stop(); _columnarShuffleManager = null; } + if (_vanillaCelebornShuffleManager != null) { + _vanillaCelebornShuffleManager.stop(); + _vanillaCelebornShuffleManager = null; + } } @Override @@ -326,6 +351,10 @@ public ShuffleReader getReader( if (handle instanceof CelebornShuffleHandle) { @SuppressWarnings("unchecked") CelebornShuffleHandle h = (CelebornShuffleHandle) handle; + CelebornConf readerConf = celebornConf; + if (!(h.dependency() instanceof ColumnarShuffleDependency)) { + readerConf = rowBasedCelebornConf; + } return CelebornUtils.getCelebornShuffleReader( h, startPartition, @@ -333,7 +362,7 @@ public ShuffleReader getReader( startMapIndex, endMapIndex, context, - celebornConf, + readerConf, metrics, shuffleIdTracker); } diff --git a/gluten-celeborn/common/src/main/scala/org/apache/spark/shuffle/CelebornHashBasedColumnarShuffleWriter.scala b/gluten-celeborn/common/src/main/scala/org/apache/spark/shuffle/CelebornColumnarShuffleWriter.scala similarity index 80% rename from gluten-celeborn/common/src/main/scala/org/apache/spark/shuffle/CelebornHashBasedColumnarShuffleWriter.scala rename to gluten-celeborn/common/src/main/scala/org/apache/spark/shuffle/CelebornColumnarShuffleWriter.scala index efd8914981311..f5ed8c3d805ec 100644 --- a/gluten-celeborn/common/src/main/scala/org/apache/spark/shuffle/CelebornHashBasedColumnarShuffleWriter.scala +++ b/gluten-celeborn/common/src/main/scala/org/apache/spark/shuffle/CelebornColumnarShuffleWriter.scala @@ -23,6 +23,7 @@ import org.apache.spark.internal.Logging import org.apache.spark.internal.config.SHUFFLE_COMPRESS import org.apache.spark.scheduler.MapStatus import org.apache.spark.shuffle.celeborn.CelebornShuffleHandle +import org.apache.spark.sql.vectorized.ColumnarBatch import org.apache.spark.storage.BlockManager import org.apache.celeborn.client.ShuffleClient @@ -31,7 +32,7 @@ import org.apache.celeborn.common.CelebornConf import java.io.IOException import java.util.Locale -abstract class CelebornHashBasedColumnarShuffleWriter[K, V]( +abstract class CelebornColumnarShuffleWriter[K, V]( shuffleId: Int, handle: CelebornShuffleHandle[K, V, V], context: TaskContext, @@ -52,12 +53,23 @@ abstract class CelebornHashBasedColumnarShuffleWriter[K, V]( protected val mapId: Int = context.partitionId() + protected lazy val nativeBufferSize: Int = { + val bufferSize = GlutenConfig.getConf.shuffleWriterBufferSize + val maxBatchSize = GlutenConfig.getConf.maxBatchSize + if (bufferSize > maxBatchSize) { + logInfo( + s"${GlutenConfig.SHUFFLE_WRITER_BUFFER_SIZE.key} ($bufferSize) exceeds max " + + s" batch size. Limited to ${GlutenConfig.COLUMNAR_MAX_BATCH_SIZE.key} ($maxBatchSize).") + maxBatchSize + } else { + bufferSize + } + } + protected val clientPushBufferMaxSize: Int = celebornConf.clientPushBufferMaxSize protected val clientPushSortMemoryThreshold: Long = celebornConf.clientPushSortMemoryThreshold - protected val clientSortMemoryMaxSize: Long = celebornConf.clientPushSortMemoryThreshold - protected val shuffleWriterType: String = celebornConf.shuffleWriterMode.name.toLowerCase(Locale.ROOT) @@ -96,6 +108,12 @@ abstract class CelebornHashBasedColumnarShuffleWriter[K, V]( @throws[IOException] final override def write(records: Iterator[Product2[K, V]]): Unit = { + if (!records.hasNext) { + partitionLengths = new Array[Long](dep.partitioner.numPartitions) + client.mapperEnd(shuffleId, mapId, context.attemptNumber, numMappers) + mapStatus = MapStatus(blockManager.shuffleServerId, partitionLengths, mapId) + return + } internalWrite(records) } @@ -122,10 +140,18 @@ abstract class CelebornHashBasedColumnarShuffleWriter[K, V]( } } + def createShuffleWriter(columnarBatch: ColumnarBatch): Unit = {} + def closeShuffleWriter(): Unit = {} def getPartitionLengths: Array[Long] = partitionLengths + def initShuffleWriter(columnarBatch: ColumnarBatch): Unit = { + if (nativeShuffleWriter == -1L) { + createShuffleWriter(columnarBatch) + } + } + def pushMergedDataToCeleborn(): Unit = { val pushMergedDataTime = System.nanoTime client.prepareForMergeData(shuffleId, mapId, context.attemptNumber()) @@ -133,10 +159,4 @@ abstract class CelebornHashBasedColumnarShuffleWriter[K, V]( client.mapperEnd(shuffleId, mapId, context.attemptNumber, numMappers) writeMetrics.incWriteTime(System.nanoTime - pushMergedDataTime) } - - def handleEmptyIterator(): Unit = { - partitionLengths = new Array[Long](dep.partitioner.numPartitions) - client.mapperEnd(shuffleId, mapId, context.attemptNumber, numMappers) - mapStatus = MapStatus(blockManager.shuffleServerId, partitionLengths, mapId) - } } diff --git a/gluten-celeborn/velox/src/main/resources/META-INF/services/org.apache.spark.shuffle.gluten.celeborn.CelebornShuffleWriterFactory b/gluten-celeborn/velox/src/main/resources/META-INF/services/org.apache.spark.shuffle.gluten.celeborn.CelebornShuffleWriterFactory index 9c3532ee2c848..3f75f112831e1 100644 --- a/gluten-celeborn/velox/src/main/resources/META-INF/services/org.apache.spark.shuffle.gluten.celeborn.CelebornShuffleWriterFactory +++ b/gluten-celeborn/velox/src/main/resources/META-INF/services/org.apache.spark.shuffle.gluten.celeborn.CelebornShuffleWriterFactory @@ -1 +1 @@ -org.apache.spark.shuffle.VeloxCelebornHashBasedColumnarShuffleWriterFactory +org.apache.spark.shuffle.VeloxCelebornColumnarShuffleWriterFactory diff --git a/gluten-celeborn/velox/src/main/scala/org/apache/spark/shuffle/VeloxCelebornColumnarBatchSerializer.scala b/gluten-celeborn/velox/src/main/scala/org/apache/spark/shuffle/VeloxCelebornColumnarBatchSerializer.scala index 1f125a164c8b6..19305e95dbec4 100644 --- a/gluten-celeborn/velox/src/main/scala/org/apache/spark/shuffle/VeloxCelebornColumnarBatchSerializer.scala +++ b/gluten-celeborn/velox/src/main/scala/org/apache/spark/shuffle/VeloxCelebornColumnarBatchSerializer.scala @@ -24,6 +24,7 @@ import org.apache.gluten.vectorized._ import org.apache.spark.SparkEnv import org.apache.spark.internal.Logging +import org.apache.spark.internal.config.SHUFFLE_COMPRESS import org.apache.spark.serializer.{DeserializationStream, SerializationStream, Serializer, SerializerInstance} import org.apache.spark.sql.execution.metric.SQLMetric import org.apache.spark.sql.internal.SQLConf @@ -76,7 +77,7 @@ private class CelebornColumnarBatchSerializerInstance( ArrowAbiUtil.exportSchema(allocator, arrowSchema, cSchema) val conf = SparkEnv.get.conf val compressionCodec = - if (conf.getBoolean("spark.shuffle.compress", true)) { + if (conf.getBoolean(SHUFFLE_COMPRESS.key, SHUFFLE_COMPRESS.defaultValue.get)) { GlutenShuffleUtils.getCompressionCodec(conf) } else { null // uncompressed diff --git a/gluten-celeborn/velox/src/main/scala/org/apache/spark/shuffle/VeloxCelebornHashBasedColumnarShuffleWriter.scala b/gluten-celeborn/velox/src/main/scala/org/apache/spark/shuffle/VeloxCelebornColumnarShuffleWriter.scala similarity index 59% rename from gluten-celeborn/velox/src/main/scala/org/apache/spark/shuffle/VeloxCelebornHashBasedColumnarShuffleWriter.scala rename to gluten-celeborn/velox/src/main/scala/org/apache/spark/shuffle/VeloxCelebornColumnarShuffleWriter.scala index b8e6513cf009d..baf61b8a14f20 100644 --- a/gluten-celeborn/velox/src/main/scala/org/apache/spark/shuffle/VeloxCelebornHashBasedColumnarShuffleWriter.scala +++ b/gluten-celeborn/velox/src/main/scala/org/apache/spark/shuffle/VeloxCelebornColumnarShuffleWriter.scala @@ -34,14 +34,14 @@ import org.apache.celeborn.common.CelebornConf import java.io.IOException -class VeloxCelebornHashBasedColumnarShuffleWriter[K, V]( +class VeloxCelebornColumnarShuffleWriter[K, V]( shuffleId: Int, handle: CelebornShuffleHandle[K, V, V], context: TaskContext, celebornConf: CelebornConf, client: ShuffleClient, writeMetrics: ShuffleWriteMetricsReporter) - extends CelebornHashBasedColumnarShuffleWriter[K, V]( + extends CelebornColumnarShuffleWriter[K, V]( shuffleId, handle, context, @@ -55,25 +55,6 @@ class VeloxCelebornHashBasedColumnarShuffleWriter[K, V]( private var splitResult: SplitResult = _ - private lazy val nativeBufferSize = { - val bufferSize = GlutenConfig.getConf.shuffleWriterBufferSize - val maxBatchSize = GlutenConfig.getConf.maxBatchSize - if (bufferSize > maxBatchSize) { - logInfo( - s"${GlutenConfig.SHUFFLE_WRITER_BUFFER_SIZE.key} ($bufferSize) exceeds max " + - s" batch size. Limited to ${GlutenConfig.COLUMNAR_MAX_BATCH_SIZE.key} ($maxBatchSize).") - maxBatchSize - } else { - bufferSize - } - } - - private val memoryLimit: Long = if ("sort".equals(shuffleWriterType)) { - Math.min(clientSortMemoryMaxSize, clientPushBufferMaxSize * numPartitions) - } else { - availableOffHeapPerTask() - } - private def availableOffHeapPerTask(): Long = { val perTask = SparkMemoryUtil.getCurrentAvailableOffHeapMemory / SparkResourceUtil.getTaskSlots(conf) @@ -82,56 +63,13 @@ class VeloxCelebornHashBasedColumnarShuffleWriter[K, V]( @throws[IOException] override def internalWrite(records: Iterator[Product2[K, V]]): Unit = { - if (!records.hasNext) { - handleEmptyIterator() - return - } - while (records.hasNext) { val cb = records.next()._2.asInstanceOf[ColumnarBatch] if (cb.numRows == 0 || cb.numCols == 0) { logInfo(s"Skip ColumnarBatch of ${cb.numRows} rows, ${cb.numCols} cols") } else { + initShuffleWriter(cb) val handle = ColumnarBatches.getNativeHandle(cb) - if (nativeShuffleWriter == -1L) { - nativeShuffleWriter = jniWrapper.makeForRSS( - dep.nativePartitioning, - nativeBufferSize, - customizedCompressionCodec, - compressionLevel, - bufferCompressThreshold, - GlutenConfig.getConf.columnarShuffleCompressionMode, - clientPushBufferMaxSize, - clientPushSortMemoryThreshold, - celebornPartitionPusher, - handle, - context.taskAttemptId(), - GlutenShuffleUtils.getStartPartitionId(dep.nativePartitioning, context.partitionId), - "celeborn", - shuffleWriterType, - GlutenConfig.getConf.columnarShuffleReallocThreshold - ) - runtime.addSpiller(new Spiller() { - override def spill(self: MemoryTarget, phase: Spiller.Phase, size: Long): Long = { - if (!Spillers.PHASE_SET_SPILL_ONLY.contains(phase)) { - return 0L - } - if (nativeShuffleWriter == -1L) { - throw new IllegalStateException( - "Fatal: spill() called before a celeborn shuffle writer " + - "is created. This behavior should be" + - "optimized by moving memory " + - "allocations from make() to split()") - } - logInfo(s"Gluten shuffle writer: Trying to push $size bytes of data") - // fixme pass true when being called by self - val pushed = - jniWrapper.nativeEvict(nativeShuffleWriter, size, false) - logInfo(s"Gluten shuffle writer: Pushed $pushed / $size bytes of data") - pushed - } - }) - } val startTime = System.nanoTime() jniWrapper.write(nativeShuffleWriter, cb.numRows, handle, availableOffHeapPerTask()) dep.metrics("splitTime").add(System.nanoTime() - startTime) @@ -142,8 +80,8 @@ class VeloxCelebornHashBasedColumnarShuffleWriter[K, V]( } } - val startTime = System.nanoTime() assert(nativeShuffleWriter != -1L) + val startTime = System.nanoTime() splitResult = jniWrapper.stop(nativeShuffleWriter) dep @@ -162,6 +100,38 @@ class VeloxCelebornHashBasedColumnarShuffleWriter[K, V]( mapStatus = MapStatus(blockManager.shuffleServerId, partitionLengths, mapId) } + override def createShuffleWriter(columnarBatch: ColumnarBatch): Unit = { + nativeShuffleWriter = jniWrapper.makeForRSS( + dep.nativePartitioning, + nativeBufferSize, + customizedCompressionCodec, + compressionLevel, + bufferCompressThreshold, + GlutenConfig.getConf.columnarShuffleCompressionMode, + clientPushBufferMaxSize, + clientPushSortMemoryThreshold, + celebornPartitionPusher, + ColumnarBatches.getNativeHandle(columnarBatch), + context.taskAttemptId(), + GlutenShuffleUtils.getStartPartitionId(dep.nativePartitioning, context.partitionId), + "celeborn", + shuffleWriterType, + GlutenConfig.getConf.columnarShuffleReallocThreshold + ) + runtime.addSpiller(new Spiller() { + override def spill(self: MemoryTarget, phase: Spiller.Phase, size: Long): Long = { + if (!Spillers.PHASE_SET_SPILL_ONLY.contains(phase)) { + return 0L + } + logInfo(s"Gluten shuffle writer: Trying to push $size bytes of data") + // fixme pass true when being called by self + val pushed = jniWrapper.nativeEvict(nativeShuffleWriter, size, false) + logInfo(s"Gluten shuffle writer: Pushed $pushed / $size bytes of data") + pushed + } + }) + } + override def closeShuffleWriter(): Unit = { jniWrapper.close(nativeShuffleWriter) } diff --git a/gluten-celeborn/velox/src/main/scala/org/apache/spark/shuffle/VeloxCelebornHashBasedColumnarShuffleWriterFactory.scala b/gluten-celeborn/velox/src/main/scala/org/apache/spark/shuffle/VeloxCelebornColumnarShuffleWriterFactory.scala similarity index 91% rename from gluten-celeborn/velox/src/main/scala/org/apache/spark/shuffle/VeloxCelebornHashBasedColumnarShuffleWriterFactory.scala rename to gluten-celeborn/velox/src/main/scala/org/apache/spark/shuffle/VeloxCelebornColumnarShuffleWriterFactory.scala index c318f57a2309a..c3164338a4856 100644 --- a/gluten-celeborn/velox/src/main/scala/org/apache/spark/shuffle/VeloxCelebornHashBasedColumnarShuffleWriterFactory.scala +++ b/gluten-celeborn/velox/src/main/scala/org/apache/spark/shuffle/VeloxCelebornColumnarShuffleWriterFactory.scala @@ -25,7 +25,7 @@ import org.apache.spark.shuffle.gluten.celeborn.CelebornShuffleWriterFactory import org.apache.celeborn.client.ShuffleClient import org.apache.celeborn.common.CelebornConf -class VeloxCelebornHashBasedColumnarShuffleWriterFactory extends CelebornShuffleWriterFactory { +class VeloxCelebornColumnarShuffleWriterFactory extends CelebornShuffleWriterFactory { override def backendName(): String = VeloxBackend.BACKEND_NAME override def createShuffleWriterInstance[K, V]( @@ -35,7 +35,7 @@ class VeloxCelebornHashBasedColumnarShuffleWriterFactory extends CelebornShuffle celebornConf: CelebornConf, client: ShuffleClient, writeMetrics: ShuffleWriteMetricsReporter): ShuffleWriter[K, V] = { - new VeloxCelebornHashBasedColumnarShuffleWriter[K, V]( + new VeloxCelebornColumnarShuffleWriter[K, V]( shuffleId, handle, context, diff --git a/gluten-core/pom.xml b/gluten-core/pom.xml index 740de5928f260..880eddb4ee953 100644 --- a/gluten-core/pom.xml +++ b/gluten-core/pom.xml @@ -84,7 +84,7 @@ org.scalacheck scalacheck_${scala.binary.version} - 1.13.5 + 1.17.0 test @@ -111,13 +111,13 @@ org.scalatestplus - scalatestplus-mockito_2.12 + scalatestplus-mockito_${scala.binary.version} 1.0.0-M2 test org.scalatestplus - scalatestplus-scalacheck_2.12 + scalatestplus-scalacheck_${scala.binary.version} 3.1.0.0-RC2 test diff --git a/gluten-core/src/main/java/org/apache/gluten/memory/memtarget/Spillers.java b/gluten-core/src/main/java/org/apache/gluten/memory/memtarget/Spillers.java index 4477e2956db7d..38ed88f577781 100644 --- a/gluten-core/src/main/java/org/apache/gluten/memory/memtarget/Spillers.java +++ b/gluten-core/src/main/java/org/apache/gluten/memory/memtarget/Spillers.java @@ -80,6 +80,9 @@ public void append(Spiller spiller) { public long spill(MemoryTarget self, Phase phase, final long size) { long remainingBytes = size; for (Spiller spiller : spillers) { + if (remainingBytes <= 0) { + break; + } remainingBytes -= spiller.spill(self, phase, remainingBytes); } return size - remainingBytes; diff --git a/gluten-core/src/main/java/org/apache/gluten/substrait/expression/ExpressionBuilder.java b/gluten-core/src/main/java/org/apache/gluten/substrait/expression/ExpressionBuilder.java index e322e1528cac9..16ae5412ea769 100644 --- a/gluten-core/src/main/java/org/apache/gluten/substrait/expression/ExpressionBuilder.java +++ b/gluten-core/src/main/java/org/apache/gluten/substrait/expression/ExpressionBuilder.java @@ -23,7 +23,9 @@ import org.apache.spark.sql.catalyst.InternalRow; import org.apache.spark.sql.catalyst.expressions.Attribute; import org.apache.spark.sql.catalyst.expressions.Expression; +import org.apache.spark.sql.catalyst.expressions.UnsafeArrayData; import org.apache.spark.sql.catalyst.util.ArrayData; +import org.apache.spark.sql.catalyst.util.GenericArrayData; import org.apache.spark.sql.catalyst.util.MapData; import org.apache.spark.sql.types.*; @@ -215,6 +217,19 @@ public static LiteralNode makeLiteral(Object obj, TypeNode typeNode) { public static LiteralNode makeLiteral(Object obj, DataType dataType, Boolean nullable) { TypeNode typeNode = ConverterUtils.getTypeNode(dataType, nullable); + if (obj instanceof UnsafeArrayData) { + UnsafeArrayData oldObj = (UnsafeArrayData) obj; + int numElements = oldObj.numElements(); + Object[] elements = new Object[numElements]; + DataType elementType = ((ArrayType) dataType).elementType(); + + for (int i = 0; i < numElements; i++) { + elements[i] = oldObj.get(i, elementType); + } + + GenericArrayData newObj = new GenericArrayData(elements); + return makeListLiteral(newObj, typeNode); + } return makeLiteral(obj, typeNode); } diff --git a/gluten-core/src/main/java/org/apache/gluten/validate/NativePlanValidationInfo.java b/gluten-core/src/main/java/org/apache/gluten/validate/NativePlanValidationInfo.java index 12f050c660f43..9cfad44d60f52 100644 --- a/gluten-core/src/main/java/org/apache/gluten/validate/NativePlanValidationInfo.java +++ b/gluten-core/src/main/java/org/apache/gluten/validate/NativePlanValidationInfo.java @@ -16,6 +16,8 @@ */ package org.apache.gluten.validate; +import org.apache.gluten.extension.ValidationResult; + import java.util.Vector; public class NativePlanValidationInfo { @@ -30,11 +32,13 @@ public NativePlanValidationInfo(int isSupported, String fallbackInfo) { } } - public boolean isSupported() { - return isSupported == 1; - } - - public Vector getFallbackInfo() { - return fallbackInfo; + public ValidationResult asResult() { + if (isSupported == 1) { + return ValidationResult.succeeded(); + } + return ValidationResult.failed( + String.format( + "Native validation failed: %n%s", + fallbackInfo.stream().reduce((l, r) -> l + "\n" + r))); } } diff --git a/gluten-core/src/main/resources/substrait/proto/substrait/algebra.proto b/gluten-core/src/main/resources/substrait/proto/substrait/algebra.proto index 0e51baf5ad4c2..3813de8684453 100644 --- a/gluten-core/src/main/resources/substrait/proto/substrait/algebra.proto +++ b/gluten-core/src/main/resources/substrait/proto/substrait/algebra.proto @@ -259,6 +259,7 @@ message CrossRel { JOIN_TYPE_OUTER = 2; JOIN_TYPE_LEFT = 3; JOIN_TYPE_RIGHT = 4; + JOIN_TYPE_LEFT_SEMI = 5; } substrait.extensions.AdvancedExtension advanced_extension = 10; diff --git a/gluten-core/src/main/scala/org/apache/gluten/GlutenPlugin.scala b/gluten-core/src/main/scala/org/apache/gluten/GlutenPlugin.scala index 0f397c69263c2..16929ca4bd4a7 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/GlutenPlugin.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/GlutenPlugin.scala @@ -300,7 +300,7 @@ private[gluten] class GlutenSessionExtensions extends (SparkSessionExtensions => } private[gluten] trait GlutenSparkExtensionsInjector { - def inject(extensions: SparkSessionExtensions) + def inject(extensions: SparkSessionExtensions): Unit } private[gluten] object GlutenPlugin { diff --git a/gluten-core/src/main/scala/org/apache/gluten/backendsapi/BackendSettingsApi.scala b/gluten-core/src/main/scala/org/apache/gluten/backendsapi/BackendSettingsApi.scala index d159486373ace..8b4c18b01970d 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/backendsapi/BackendSettingsApi.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/backendsapi/BackendSettingsApi.scala @@ -35,12 +35,12 @@ trait BackendSettingsApi { format: ReadFileFormat, fields: Array[StructField], partTable: Boolean, - paths: Seq[String]): ValidationResult = ValidationResult.ok + paths: Seq[String]): ValidationResult = ValidationResult.succeeded def supportWriteFilesExec( format: FileFormat, fields: Array[StructField], bucketSpec: Option[BucketSpec], - options: Map[String, String]): ValidationResult = ValidationResult.ok + options: Map[String, String]): ValidationResult = ValidationResult.succeeded def supportNativeWrite(fields: Array[StructField]): Boolean = true def supportNativeMetadataColumns(): Boolean = false def supportNativeRowIndexColumn(): Boolean = false @@ -123,9 +123,9 @@ trait BackendSettingsApi { def alwaysFailOnMapExpression(): Boolean = false - def requiredChildOrderingForWindow(): Boolean = false + def requiredChildOrderingForWindow(): Boolean = true - def requiredChildOrderingForWindowGroupLimit(): Boolean = false + def requiredChildOrderingForWindowGroupLimit(): Boolean = true def staticPartitionWriteOnly(): Boolean = false @@ -144,7 +144,7 @@ trait BackendSettingsApi { def supportCartesianProductExec(): Boolean = false - def supportBroadcastNestedLoopJoinExec(): Boolean = false + def supportBroadcastNestedLoopJoinExec(): Boolean = true def supportSampleExec(): Boolean = false diff --git a/gluten-core/src/main/scala/org/apache/gluten/backendsapi/SparkPlanExecApi.scala b/gluten-core/src/main/scala/org/apache/gluten/backendsapi/SparkPlanExecApi.scala index 3ca5e03139249..58a08192dec91 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/backendsapi/SparkPlanExecApi.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/backendsapi/SparkPlanExecApi.scala @@ -47,7 +47,7 @@ import org.apache.spark.sql.execution.joins.BuildSideRelation import org.apache.spark.sql.execution.metric.SQLMetric import org.apache.spark.sql.execution.python.ArrowEvalPythonExec import org.apache.spark.sql.hive.HiveTableScanExecTransformer -import org.apache.spark.sql.types.{LongType, NullType, StructType} +import org.apache.spark.sql.types.{DecimalType, LongType, NullType, StructType} import org.apache.spark.sql.vectorized.ColumnarBatch import java.lang.{Long => JLong} @@ -258,6 +258,15 @@ trait SparkPlanExecApi { throw new GlutenNotSupportException("all_match is not supported") } + /** Transform array array_sort to Substrait. */ + def genArraySortTransformer( + substraitExprName: String, + argument: ExpressionTransformer, + function: ExpressionTransformer, + expr: ArraySort): ExpressionTransformer = { + throw new GlutenNotSupportException("array_sort(on array) is not supported") + } + /** Transform array exists to Substrait */ def genArrayExistsTransformer( substraitExprName: String, @@ -313,6 +322,18 @@ trait SparkPlanExecApi { throw new GlutenNotSupportException("PreciseTimestampConversion is not supported") } + // For date_add(cast('2001-01-01' as Date), interval 1 day), backends may handle it in different + // ways + def genDateAddTransformer( + attributeSeq: Seq[Attribute], + substraitExprName: String, + children: Seq[Expression], + expr: Expression): ExpressionTransformer = { + val childrenTransformers = + children.map(ExpressionConverter.replaceWithExpressionTransformer(_, attributeSeq)) + GenericExpressionTransformer(substraitExprName, childrenTransformers, expr) + } + /** * Generate ShuffleDependency for ColumnarShuffleExchangeExec. * @@ -464,13 +485,6 @@ trait SparkPlanExecApi { original) } - def genSizeExpressionTransformer( - substraitExprName: String, - child: ExpressionTransformer, - original: Size): ExpressionTransformer = { - GenericExpressionTransformer(substraitExprName, Seq(child), original) - } - def genLikeTransformer( substraitExprName: String, left: ExpressionTransformer, @@ -710,4 +724,23 @@ trait SparkPlanExecApi { arrowEvalPythonExec def maybeCollapseTakeOrderedAndProject(plan: SparkPlan): SparkPlan = plan + + def genDecimalRoundExpressionOutput(decimalType: DecimalType, toScale: Int): DecimalType = { + val p = decimalType.precision + val s = decimalType.scale + // After rounding we may need one more digit in the integral part, + // e.g. `ceil(9.9, 0)` -> `10`, `ceil(99, -1)` -> `100`. + val integralLeastNumDigits = p - s + 1 + if (toScale < 0) { + // negative scale means we need to adjust `-scale` number of digits before the decimal + // point, which means we need at lease `-scale + 1` digits (after rounding). + val newPrecision = math.max(integralLeastNumDigits, -toScale + 1) + // We have to accept the risk of overflow as we can't exceed the max precision. + DecimalType(math.min(newPrecision, DecimalType.MAX_PRECISION), 0) + } else { + val newScale = math.min(s, toScale) + // We have to accept the risk of overflow as we can't exceed the max precision. + DecimalType(math.min(integralLeastNumDigits + newScale, 38), newScale) + } + } } diff --git a/gluten-core/src/main/scala/org/apache/gluten/execution/BasicPhysicalOperatorTransformer.scala b/gluten-core/src/main/scala/org/apache/gluten/execution/BasicPhysicalOperatorTransformer.scala index 962ad6aca9d37..8e87baf5381d9 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/execution/BasicPhysicalOperatorTransformer.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/execution/BasicPhysicalOperatorTransformer.scala @@ -113,7 +113,7 @@ abstract class FilterExecTransformerBase(val cond: Expression, val input: SparkP if (remainingCondition == null) { // All the filters can be pushed down and the computing of this Filter // is not needed. - return ValidationResult.ok + return ValidationResult.succeeded } val substraitContext = new SubstraitContext val operatorId = substraitContext.nextOperatorId(this.nodeName) @@ -311,15 +311,6 @@ case class ColumnarUnionExec(children: Seq[SparkPlan]) extends SparkPlan with Gl } override protected def doExecuteColumnar(): RDD[ColumnarBatch] = columnarInputRDD - - override protected def doValidateInternal(): ValidationResult = { - BackendsApiManager.getValidatorApiInstance - .doSchemaValidate(schema) - .map { - reason => ValidationResult.notOk(s"Found schema check failure for $schema, due to: $reason") - } - .getOrElse(ValidationResult.ok) - } } /** @@ -365,7 +356,7 @@ object FilterHandler extends PredicateHelper { * the filter conditions not pushed down into Scan. */ def getRemainingFilters(scanFilters: Seq[Expression], filters: Seq[Expression]): Seq[Expression] = - (ExpressionSet(filters) -- ExpressionSet(scanFilters)).toSeq + (filters.toSet -- scanFilters.toSet).toSeq // Separate and compare the filter conditions in Scan and Filter. // Try to push down the remaining conditions in Filter into Scan. diff --git a/gluten-core/src/main/scala/org/apache/gluten/execution/BasicScanExecTransformer.scala b/gluten-core/src/main/scala/org/apache/gluten/execution/BasicScanExecTransformer.scala index 64071fb14c0c0..99f145eeab1c9 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/execution/BasicScanExecTransformer.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/execution/BasicScanExecTransformer.scala @@ -88,7 +88,7 @@ trait BasicScanExecTransformer extends LeafTransformSupport with BaseDataSource val validationResult = BackendsApiManager.getSettings .supportFileFormatRead(fileFormat, fields, getPartitionSchema.nonEmpty, getInputFilePaths) - if (!validationResult.isValid) { + if (!validationResult.ok()) { return validationResult } diff --git a/gluten-core/src/main/scala/org/apache/gluten/execution/BatchScanExecTransformer.scala b/gluten-core/src/main/scala/org/apache/gluten/execution/BatchScanExecTransformer.scala index 6bff68895a249..4860847de9acd 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/execution/BatchScanExecTransformer.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/execution/BatchScanExecTransformer.scala @@ -133,18 +133,18 @@ abstract class BatchScanExecTransformerBase( override def doValidateInternal(): ValidationResult = { if (pushedAggregate.nonEmpty) { - return ValidationResult.notOk(s"Unsupported aggregation push down for $scan.") + return ValidationResult.failed(s"Unsupported aggregation push down for $scan.") } if ( SparkShimLoader.getSparkShims.findRowIndexColumnIndexInSchema(schema) > 0 && !BackendsApiManager.getSettings.supportNativeRowIndexColumn() ) { - return ValidationResult.notOk("Unsupported row index column scan in native.") + return ValidationResult.failed("Unsupported row index column scan in native.") } if (hasUnsupportedColumns) { - return ValidationResult.notOk(s"Unsupported columns scan in native.") + return ValidationResult.failed(s"Unsupported columns scan in native.") } super.doValidateInternal() diff --git a/gluten-core/src/main/scala/org/apache/gluten/execution/BroadcastNestedLoopJoinExecTransformer.scala b/gluten-core/src/main/scala/org/apache/gluten/execution/BroadcastNestedLoopJoinExecTransformer.scala index 092612ea73407..ae407b3b3efa1 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/execution/BroadcastNestedLoopJoinExecTransformer.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/execution/BroadcastNestedLoopJoinExecTransformer.scala @@ -16,20 +16,22 @@ */ package org.apache.gluten.execution +import org.apache.gluten.GlutenConfig import org.apache.gluten.backendsapi.BackendsApiManager import org.apache.gluten.extension.ValidationResult import org.apache.gluten.metrics.MetricsUpdater -import org.apache.gluten.substrait.SubstraitContext +import org.apache.gluten.substrait.{JoinParams, SubstraitContext} import org.apache.gluten.utils.SubstraitUtil import org.apache.spark.sql.catalyst.expressions.{Attribute, Expression} import org.apache.spark.sql.catalyst.optimizer.{BuildLeft, BuildRight, BuildSide} -import org.apache.spark.sql.catalyst.plans.{InnerLike, JoinType, LeftOuter, RightOuter} +import org.apache.spark.sql.catalyst.plans.{FullOuter, InnerLike, JoinType, LeftExistence, LeftOuter, RightOuter} import org.apache.spark.sql.catalyst.plans.physical.Partitioning import org.apache.spark.sql.execution.SparkPlan import org.apache.spark.sql.execution.joins.BaseJoinExec import org.apache.spark.sql.execution.metric.SQLMetric +import com.google.protobuf.Any import io.substrait.proto.CrossRel abstract class BroadcastNestedLoopJoinExecTransformer( @@ -49,7 +51,8 @@ abstract class BroadcastNestedLoopJoinExecTransformer( private lazy val substraitJoinType: CrossRel.JoinType = SubstraitUtil.toCrossRelSubstrait(joinType) - private lazy val buildTableId: String = "BuildTable-" + buildPlan.id + // Unique ID for builded table + lazy val buildBroadcastTableId: String = "BuiltBNLJBroadcastTable-" + buildPlan.id // Hint substrait to switch the left and right, // since we assume always build right side in substrait. @@ -79,6 +82,10 @@ abstract class BroadcastNestedLoopJoinExecTransformer( left.output ++ right.output.map(_.withNullability(true)) case RightOuter => left.output.map(_.withNullability(true)) ++ right.output + case LeftExistence(_) => + left.output + case FullOuter => + left.output.map(_.withNullability(true)) ++ right.output.map(_.withNullability(true)) case x => throw new IllegalArgumentException(s"${getClass.getSimpleName} not take $x as the JoinType") } @@ -103,6 +110,8 @@ abstract class BroadcastNestedLoopJoinExecTransformer( } } + def genJoinParameters(): Any = Any.getDefaultInstance + override protected def doTransform(context: SubstraitContext): TransformContext = { val streamedPlanContext = streamedPlan.asInstanceOf[TransformSupport].transform(context) val (inputStreamedRelNode, inputStreamedOutput) = @@ -113,6 +122,10 @@ abstract class BroadcastNestedLoopJoinExecTransformer( (buildPlanContext.root, buildPlanContext.outputAttributes) val operatorId = context.nextOperatorId(this.nodeName) + val joinParams = new JoinParams + if (condition.isDefined) { + joinParams.isWithCondition = true + } val crossRel = JoinUtils.createCrossRel( substraitJoinType, @@ -122,14 +135,17 @@ abstract class BroadcastNestedLoopJoinExecTransformer( inputStreamedOutput, inputBuildOutput, context, - operatorId + operatorId, + genJoinParameters() ) + context.registerJoinParam(operatorId, joinParams) + val projectRelPostJoinRel = JoinUtils.createProjectRelPostJoinRel( needSwitchChildren, joinType, - inputStreamedOutput, - inputBuildOutput, + streamedPlan.output, + buildPlan.output, context, operatorId, crossRel, @@ -145,18 +161,40 @@ abstract class BroadcastNestedLoopJoinExecTransformer( inputBuildOutput) } - override protected def doValidateInternal(): ValidationResult = { - if (!BackendsApiManager.getSettings.supportBroadcastNestedLoopJoinExec()) { - return ValidationResult.notOk("Broadcast Nested Loop join is not supported in this backend") + def validateJoinTypeAndBuildSide(): ValidationResult = { + val result = joinType match { + case _: InnerLike | LeftOuter | RightOuter => ValidationResult.succeeded + case _ => + ValidationResult.failed(s"$joinType join is not supported with BroadcastNestedLoopJoin") } - if (substraitJoinType == CrossRel.JoinType.UNRECOGNIZED) { - return ValidationResult.notOk(s"$joinType join is not supported with BroadcastNestedLoopJoin") + + if (!result.ok()) { + return result } + (joinType, buildSide) match { case (LeftOuter, BuildLeft) | (RightOuter, BuildRight) => - return ValidationResult.notOk(s"$joinType join is not supported with $buildSide") - case _ => // continue + ValidationResult.failed(s"$joinType join is not supported with $buildSide") + case _ => ValidationResult.succeeded // continue + } + } + + override protected def doValidateInternal(): ValidationResult = { + if (!GlutenConfig.getConf.broadcastNestedLoopJoinTransformerTransformerEnabled) { + return ValidationResult.failed( + s"Config ${GlutenConfig.BROADCAST_NESTED_LOOP_JOIN_TRANSFORMER_ENABLED.key} not enabled") } + + if (substraitJoinType == CrossRel.JoinType.UNRECOGNIZED) { + return ValidationResult.failed( + s"$joinType join is not supported with BroadcastNestedLoopJoin") + } + + val validateResult = validateJoinTypeAndBuildSide() + if (!validateResult.ok()) { + return validateResult + } + val substraitContext = new SubstraitContext val crossRel = JoinUtils.createCrossRel( @@ -168,6 +206,7 @@ abstract class BroadcastNestedLoopJoinExecTransformer( buildPlan.output, substraitContext, substraitContext.nextOperatorId(this.nodeName), + genJoinParameters(), validation = true ) doNativeValidation(substraitContext, crossRel) diff --git a/gluten-core/src/main/scala/org/apache/gluten/execution/CartesianProductExecTransformer.scala b/gluten-core/src/main/scala/org/apache/gluten/execution/CartesianProductExecTransformer.scala index 91831f18493ad..0dd110fa542f2 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/execution/CartesianProductExecTransformer.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/execution/CartesianProductExecTransformer.scala @@ -112,7 +112,7 @@ case class CartesianProductExecTransformer( override protected def doValidateInternal(): ValidationResult = { if (!BackendsApiManager.getSettings.supportCartesianProductExec()) { - return ValidationResult.notOk("Cartesian product is not supported in this backend") + return ValidationResult.failed("Cartesian product is not supported in this backend") } val substraitContext = new SubstraitContext val expressionNode = condition.map { diff --git a/gluten-core/src/main/scala/org/apache/gluten/execution/ExpandExecTransformer.scala b/gluten-core/src/main/scala/org/apache/gluten/execution/ExpandExecTransformer.scala index 362debb531ee6..63f76a25a2318 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/execution/ExpandExecTransformer.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/execution/ExpandExecTransformer.scala @@ -95,10 +95,10 @@ case class ExpandExecTransformer( override protected def doValidateInternal(): ValidationResult = { if (!BackendsApiManager.getSettings.supportExpandExec()) { - return ValidationResult.notOk("Current backend does not support expand") + return ValidationResult.failed("Current backend does not support expand") } if (projections.isEmpty) { - return ValidationResult.notOk("Current backend does not support empty projections in expand") + return ValidationResult.failed("Current backend does not support empty projections in expand") } val substraitContext = new SubstraitContext diff --git a/gluten-core/src/main/scala/org/apache/gluten/execution/FileSourceScanExecTransformer.scala b/gluten-core/src/main/scala/org/apache/gluten/execution/FileSourceScanExecTransformer.scala index 4f120488c2fb5..3b8ed1167afcf 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/execution/FileSourceScanExecTransformer.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/execution/FileSourceScanExecTransformer.scala @@ -130,23 +130,23 @@ abstract class FileSourceScanExecTransformerBase( if ( !metadataColumns.isEmpty && !BackendsApiManager.getSettings.supportNativeMetadataColumns() ) { - return ValidationResult.notOk(s"Unsupported metadata columns scan in native.") + return ValidationResult.failed(s"Unsupported metadata columns scan in native.") } if ( SparkShimLoader.getSparkShims.findRowIndexColumnIndexInSchema(schema) > 0 && !BackendsApiManager.getSettings.supportNativeRowIndexColumn() ) { - return ValidationResult.notOk("Unsupported row index column scan in native.") + return ValidationResult.failed("Unsupported row index column scan in native.") } if (hasUnsupportedColumns) { - return ValidationResult.notOk(s"Unsupported columns scan in native.") + return ValidationResult.failed(s"Unsupported columns scan in native.") } if (hasFieldIds) { // Spark read schema expects field Ids , the case didn't support yet by native. - return ValidationResult.notOk( + return ValidationResult.failed( s"Unsupported matching schema column names " + s"by field ids in native scan.") } diff --git a/gluten-core/src/main/scala/org/apache/gluten/execution/GenerateExecTransformerBase.scala b/gluten-core/src/main/scala/org/apache/gluten/execution/GenerateExecTransformerBase.scala index b5c9b85aeb0d5..af4a92f194c1b 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/execution/GenerateExecTransformerBase.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/execution/GenerateExecTransformerBase.scala @@ -67,7 +67,7 @@ abstract class GenerateExecTransformerBase( override protected def doValidateInternal(): ValidationResult = { val validationResult = doGeneratorValidate(generator, outer) - if (!validationResult.isValid) { + if (!validationResult.ok()) { return validationResult } val context = new SubstraitContext diff --git a/gluten-core/src/main/scala/org/apache/gluten/execution/HashAggregateExecBaseTransformer.scala b/gluten-core/src/main/scala/org/apache/gluten/execution/HashAggregateExecBaseTransformer.scala index 49a9ee1e816a3..9a28af801d831 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/execution/HashAggregateExecBaseTransformer.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/execution/HashAggregateExecBaseTransformer.scala @@ -84,9 +84,14 @@ abstract class HashAggregateExecBaseTransformer( val functionString = truncatedString(allAggregateExpressions, "[", ", ", "]", maxFields) val outputString = truncatedString(output, "[", ", ", "]", maxFields) if (verbose) { - s"HashAggregateTransformer(keys=$keyString, functions=$functionString, output=$outputString)" + s"HashAggregateTransformer(keys=$keyString, " + + s"functions=$functionString, " + + s"isStreamingAgg=$isCapableForStreamingAggregation, " + + s"output=$outputString)" } else { - s"HashAggregateTransformer(keys=$keyString, functions=$functionString)" + s"HashAggregateTransformer(keys=$keyString, " + + s"functions=$functionString, " + + s"isStreamingAgg=$isCapableForStreamingAggregation)" } } @@ -112,7 +117,7 @@ abstract class HashAggregateExecBaseTransformer( val unsupportedAggExprs = aggregateAttributes.filterNot(attr => checkType(attr.dataType)) if (unsupportedAggExprs.nonEmpty) { - return ValidationResult.notOk( + return ValidationResult.failed( "Found unsupported data type in aggregation expression: " + unsupportedAggExprs .map(attr => s"${attr.name}#${attr.exprId.id}:${attr.dataType}") @@ -120,7 +125,7 @@ abstract class HashAggregateExecBaseTransformer( } val unsupportedGroupExprs = groupingExpressions.filterNot(attr => checkType(attr.dataType)) if (unsupportedGroupExprs.nonEmpty) { - return ValidationResult.notOk( + return ValidationResult.failed( "Found unsupported data type in grouping expression: " + unsupportedGroupExprs .map(attr => s"${attr.name}#${attr.exprId.id}:${attr.dataType}") @@ -180,8 +185,7 @@ object HashAggregateExecBaseTransformer { case a: SortAggregateExec => a.initialInputBufferOffset } - def from(agg: BaseAggregateExec)( - childConverter: SparkPlan => SparkPlan = p => p): HashAggregateExecBaseTransformer = { + def from(agg: BaseAggregateExec): HashAggregateExecBaseTransformer = { BackendsApiManager.getSparkPlanExecApiInstance .genHashAggregateExecTransformer( agg.requiredChildDistributionExpressions, @@ -190,7 +194,7 @@ object HashAggregateExecBaseTransformer { agg.aggregateAttributes, getInitialInputBufferOffset(agg), agg.resultExpressions, - childConverter(agg.child) + agg.child ) } } diff --git a/gluten-core/src/main/scala/org/apache/gluten/execution/JoinExecTransformer.scala b/gluten-core/src/main/scala/org/apache/gluten/execution/JoinExecTransformer.scala index cd22c578594c6..86e6c1f412656 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/execution/JoinExecTransformer.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/execution/JoinExecTransformer.scala @@ -210,7 +210,7 @@ trait HashJoinLikeExecTransformer extends BaseJoinExec with TransformSupport { // Firstly, need to check if the Substrait plan for this operator can be successfully generated. if (substraitJoinType == JoinRel.JoinType.UNRECOGNIZED) { return ValidationResult - .notOk(s"Unsupported join type of $hashJoinType for substrait: $substraitJoinType") + .failed(s"Unsupported join type of $hashJoinType for substrait: $substraitJoinType") } val relNode = JoinUtils.createJoinRel( streamedKeyExprs, diff --git a/gluten-core/src/main/scala/org/apache/gluten/execution/JoinUtils.scala b/gluten-core/src/main/scala/org/apache/gluten/execution/JoinUtils.scala index eb2c0bfd72292..9dd73800e29bc 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/execution/JoinUtils.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/execution/JoinUtils.scala @@ -337,6 +337,7 @@ object JoinUtils { inputBuildOutput: Seq[Attribute], substraitContext: SubstraitContext, operatorId: java.lang.Long, + joinParameters: Any, validation: Boolean = false ): RelNode = { val expressionNode = condition.map { @@ -346,7 +347,7 @@ object JoinUtils { .doTransform(substraitContext.registeredFunction) } val extensionNode = - JoinUtils.createExtensionNode(inputStreamedOutput ++ inputBuildOutput, validation) + createJoinExtensionNode(joinParameters, inputStreamedOutput ++ inputBuildOutput) RelBuilder.makeCrossRel( inputStreamedRelNode, diff --git a/gluten-core/src/main/scala/org/apache/gluten/execution/SampleExecTransformer.scala b/gluten-core/src/main/scala/org/apache/gluten/execution/SampleExecTransformer.scala index 6f9ef34282bf0..bed59b913a1e9 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/execution/SampleExecTransformer.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/execution/SampleExecTransformer.scala @@ -99,7 +99,7 @@ case class SampleExecTransformer( override protected def doValidateInternal(): ValidationResult = { if (withReplacement) { - return ValidationResult.notOk( + return ValidationResult.failed( "Unsupported sample exec in native with " + s"withReplacement parameter is $withReplacement") } diff --git a/gluten-core/src/main/scala/org/apache/gluten/execution/ScanTransformerFactory.scala b/gluten-core/src/main/scala/org/apache/gluten/execution/ScanTransformerFactory.scala index fcb9e983e76b4..a05a5e72bfe1d 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/execution/ScanTransformerFactory.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/execution/ScanTransformerFactory.scala @@ -17,7 +17,7 @@ package org.apache.gluten.execution import org.apache.gluten.exception.GlutenNotSupportException -import org.apache.gluten.extension.columnar.TransformHints +import org.apache.gluten.extension.columnar.FallbackTags import org.apache.gluten.sql.shims.SparkShimLoader import org.apache.spark.sql.catalyst.expressions.Expression @@ -95,11 +95,11 @@ object ScanTransformerFactory { transformer.setPushDownFilters(allPushDownFilters.get) // Validate again if allPushDownFilters is defined. val validationResult = transformer.doValidate() - if (validationResult.isValid) { + if (validationResult.ok()) { transformer } else { val newSource = batchScan.copy(runtimeFilters = transformer.runtimeFilters) - TransformHints.tagNotTransformable(newSource, validationResult.reason.get) + FallbackTags.add(newSource, validationResult.reason()) newSource } } else { @@ -109,7 +109,7 @@ object ScanTransformerFactory { if (validation) { throw new GlutenNotSupportException(s"Unsupported scan ${batchScan.scan}") } - TransformHints.tagNotTransformable(batchScan, "The scan in BatchScanExec is not supported.") + FallbackTags.add(batchScan, "The scan in BatchScanExec is not supported.") batchScan } } diff --git a/gluten-core/src/main/scala/org/apache/gluten/execution/SortExecTransformer.scala b/gluten-core/src/main/scala/org/apache/gluten/execution/SortExecTransformer.scala index f79dc69e680b5..b69925d60fd21 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/execution/SortExecTransformer.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/execution/SortExecTransformer.scala @@ -91,7 +91,7 @@ case class SortExecTransformer( override protected def doValidateInternal(): ValidationResult = { if (!BackendsApiManager.getSettings.supportSortExec()) { - return ValidationResult.notOk("Current backend does not support sort") + return ValidationResult.failed("Current backend does not support sort") } val substraitContext = new SubstraitContext val operatorId = substraitContext.nextOperatorId(this.nodeName) diff --git a/gluten-core/src/main/scala/org/apache/gluten/execution/SortMergeJoinExecTransformer.scala b/gluten-core/src/main/scala/org/apache/gluten/execution/SortMergeJoinExecTransformer.scala index f032c4ca00879..c96789569f9ac 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/execution/SortMergeJoinExecTransformer.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/execution/SortMergeJoinExecTransformer.scala @@ -164,7 +164,7 @@ abstract class SortMergeJoinExecTransformerBase( // Firstly, need to check if the Substrait plan for this operator can be successfully generated. if (substraitJoinType == JoinRel.JoinType.UNRECOGNIZED) { return ValidationResult - .notOk(s"Found unsupported join type of $joinType for substrait: $substraitJoinType") + .failed(s"Found unsupported join type of $joinType for substrait: $substraitJoinType") } val relNode = JoinUtils.createJoinRel( streamedKeys, @@ -253,7 +253,7 @@ case class SortMergeJoinExecTransformer( // Firstly, need to check if the Substrait plan for this operator can be successfully generated. if (substraitJoinType == JoinRel.JoinType.JOIN_TYPE_OUTER) { return ValidationResult - .notOk(s"Found unsupported join type of $joinType for velox smj: $substraitJoinType") + .failed(s"Found unsupported join type of $joinType for velox smj: $substraitJoinType") } super.doValidateInternal() } diff --git a/gluten-core/src/main/scala/org/apache/gluten/execution/TakeOrderedAndProjectExecTransformer.scala b/gluten-core/src/main/scala/org/apache/gluten/execution/TakeOrderedAndProjectExecTransformer.scala index 74158d6332dc5..b31471e21397a 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/execution/TakeOrderedAndProjectExecTransformer.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/execution/TakeOrderedAndProjectExecTransformer.scala @@ -67,7 +67,7 @@ case class TakeOrderedAndProjectExecTransformer( override protected def doValidateInternal(): ValidationResult = { if (offset != 0) { - return ValidationResult.notOk(s"Native TopK does not support offset: $offset") + return ValidationResult.failed(s"Native TopK does not support offset: $offset") } var tagged: ValidationResult = null @@ -83,14 +83,14 @@ case class TakeOrderedAndProjectExecTransformer( ColumnarCollapseTransformStages.wrapInputIteratorTransformer(child) val sortPlan = SortExecTransformer(sortOrder, false, inputTransformer) val sortValidation = sortPlan.doValidate() - if (!sortValidation.isValid) { + if (!sortValidation.ok()) { return sortValidation } val limitPlan = LimitTransformer(sortPlan, offset, limit) tagged = limitPlan.doValidate() } - if (tagged.isValid) { + if (tagged.ok()) { val projectPlan = ProjectExecTransformer(projectList, child) tagged = projectPlan.doValidate() } diff --git a/gluten-core/src/main/scala/org/apache/gluten/execution/WholeStageTransformer.scala b/gluten-core/src/main/scala/org/apache/gluten/execution/WholeStageTransformer.scala index a49e8aa518b67..78132c08c7823 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/execution/WholeStageTransformer.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/execution/WholeStageTransformer.scala @@ -265,7 +265,7 @@ case class WholeStageTransformer(child: SparkPlan, materializeInput: Boolean = f } transformChildren(child, basicScanExecTransformers) - basicScanExecTransformers + basicScanExecTransformers.toSeq } override def doExecuteColumnar(): RDD[ColumnarBatch] = { diff --git a/gluten-core/src/main/scala/org/apache/gluten/execution/WindowExecTransformer.scala b/gluten-core/src/main/scala/org/apache/gluten/execution/WindowExecTransformer.scala index 6832221a404d9..4902b6c6cf1b7 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/execution/WindowExecTransformer.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/execution/WindowExecTransformer.scala @@ -67,11 +67,7 @@ case class WindowExecTransformer( } override def requiredChildOrdering: Seq[Seq[SortOrder]] = { - if ( - BackendsApiManager.getSettings.requiredChildOrderingForWindow() - && GlutenConfig.getConf.veloxColumnarWindowType.equals("streaming") - ) { - // Velox StreamingWindow need to require child order. + if (BackendsApiManager.getSettings.requiredChildOrderingForWindow()) { Seq(partitionSpec.map(SortOrder(_, Ascending)) ++ orderSpec) } else { Seq(Nil) @@ -169,7 +165,7 @@ case class WindowExecTransformer( override protected def doValidateInternal(): ValidationResult = { if (!BackendsApiManager.getSettings.supportWindowExec(windowExpression)) { return ValidationResult - .notOk(s"Found unsupported window expression: ${windowExpression.mkString(", ")}") + .failed(s"Found unsupported window expression: ${windowExpression.mkString(", ")}") } val substraitContext = new SubstraitContext val operatorId = substraitContext.nextOperatorId(this.nodeName) diff --git a/gluten-core/src/main/scala/org/apache/gluten/execution/WindowGroupLimitExecTransformer.scala b/gluten-core/src/main/scala/org/apache/gluten/execution/WindowGroupLimitExecTransformer.scala index 46a4e1aa4eeec..6068412fbad31 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/execution/WindowGroupLimitExecTransformer.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/execution/WindowGroupLimitExecTransformer.scala @@ -66,14 +66,24 @@ case class WindowGroupLimitExecTransformer( override def requiredChildOrdering: Seq[Seq[SortOrder]] = { if (BackendsApiManager.getSettings.requiredChildOrderingForWindowGroupLimit()) { - // Velox StreamingTopNRowNumber need to require child order. Seq(partitionSpec.map(SortOrder(_, Ascending)) ++ orderSpec) } else { Seq(Nil) } } - override def outputOrdering: Seq[SortOrder] = child.outputOrdering + override def outputOrdering: Seq[SortOrder] = { + if (requiredChildOrdering.forall(_.isEmpty)) { + // The Velox backend `TopNRowNumber` does not require child ordering, because it + // uses hash table to store partition and use priority queue to track of top limit rows. + // Ideally, the output of `TopNRowNumber` is unordered but it is grouped for partition keys. + // To be safe, here we do not propagate the ordering. + // TODO: Make the framework aware of grouped data distribution + Nil + } else { + child.outputOrdering + } + } override def outputPartitioning: Partitioning = child.outputPartitioning @@ -135,7 +145,7 @@ case class WindowGroupLimitExecTransformer( override protected def doValidateInternal(): ValidationResult = { if (!BackendsApiManager.getSettings.supportWindowGroupLimitExec(rankLikeFunction)) { return ValidationResult - .notOk(s"Found unsupported rank like function: $rankLikeFunction") + .failed(s"Found unsupported rank like function: $rankLikeFunction") } val substraitContext = new SubstraitContext val operatorId = substraitContext.nextOperatorId(this.nodeName) diff --git a/gluten-core/src/main/scala/org/apache/gluten/execution/WriteFilesExecTransformer.scala b/gluten-core/src/main/scala/org/apache/gluten/execution/WriteFilesExecTransformer.scala index 14d58bfa83771..d78f21beaabfe 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/execution/WriteFilesExecTransformer.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/execution/WriteFilesExecTransformer.scala @@ -150,8 +150,8 @@ case class WriteFilesExecTransformer( finalChildOutput.toStructType.fields, bucketSpec, caseInsensitiveOptions) - if (!validationResult.isValid) { - return ValidationResult.notOk("Unsupported native write: " + validationResult.reason.get) + if (!validationResult.ok()) { + return ValidationResult.failed("Unsupported native write: " + validationResult.reason()) } val substraitContext = new SubstraitContext diff --git a/gluten-core/src/main/scala/org/apache/gluten/expression/ConverterUtils.scala b/gluten-core/src/main/scala/org/apache/gluten/expression/ConverterUtils.scala index a944de3d3cefe..473ee7f9d62f6 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/expression/ConverterUtils.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/expression/ConverterUtils.scala @@ -73,7 +73,7 @@ object ConverterUtils extends Logging { } def collectAttributeTypeNodes(attributes: JList[Attribute]): JList[TypeNode] = { - collectAttributeTypeNodes(attributes.asScala) + collectAttributeTypeNodes(attributes.asScala.toSeq) } def collectAttributeTypeNodes(attributes: Seq[Attribute]): JList[TypeNode] = { @@ -85,7 +85,7 @@ object ConverterUtils extends Logging { } def collectAttributeNamesWithExprId(attributes: JList[Attribute]): JList[String] = { - collectAttributeNamesWithExprId(attributes.asScala) + collectAttributeNamesWithExprId(attributes.asScala.toSeq) } def collectAttributeNamesWithExprId(attributes: Seq[Attribute]): JList[String] = { @@ -197,7 +197,7 @@ object ConverterUtils extends Logging { val (field, nullable) = parseFromSubstraitType(typ) StructField("", field, nullable) } - (StructType(fields), isNullable(substraitType.getStruct.getNullability)) + (StructType(fields.toSeq), isNullable(substraitType.getStruct.getNullability)) case Type.KindCase.LIST => val list = substraitType.getList val (elementType, containsNull) = parseFromSubstraitType(list.getType) diff --git a/gluten-core/src/main/scala/org/apache/gluten/expression/DecimalRoundTransformer.scala b/gluten-core/src/main/scala/org/apache/gluten/expression/DecimalRoundTransformer.scala index 305d4feb93387..a8ccd2635c1c7 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/expression/DecimalRoundTransformer.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/expression/DecimalRoundTransformer.scala @@ -16,6 +16,7 @@ */ package org.apache.gluten.expression +import org.apache.gluten.backendsapi.BackendsApiManager import org.apache.gluten.exception.GlutenNotSupportException import org.apache.spark.sql.catalyst.expressions._ @@ -29,25 +30,13 @@ case class DecimalRoundTransformer( val toScale: Int = original.scale.eval(EmptyRow).asInstanceOf[Int] - // Use the same result type for different Spark versions. + // Use the same result type for different Spark versions in velox. + // The same result type with spark in ch. override val dataType: DataType = original.child.dataType match { case decimalType: DecimalType => - val p = decimalType.precision - val s = decimalType.scale - // After rounding we may need one more digit in the integral part, - // e.g. `ceil(9.9, 0)` -> `10`, `ceil(99, -1)` -> `100`. - val integralLeastNumDigits = p - s + 1 - if (toScale < 0) { - // negative scale means we need to adjust `-scale` number of digits before the decimal - // point, which means we need at lease `-scale + 1` digits (after rounding). - val newPrecision = math.max(integralLeastNumDigits, -toScale + 1) - // We have to accept the risk of overflow as we can't exceed the max precision. - DecimalType(math.min(newPrecision, DecimalType.MAX_PRECISION), 0) - } else { - val newScale = math.min(s, toScale) - // We have to accept the risk of overflow as we can't exceed the max precision. - DecimalType(math.min(integralLeastNumDigits + newScale, 38), newScale) - } + BackendsApiManager.getSparkPlanExecApiInstance.genDecimalRoundExpressionOutput( + decimalType, + toScale) case _ => throw new GlutenNotSupportException( s"Decimal type is expected but received ${original.child.dataType.typeName}.") diff --git a/gluten-core/src/main/scala/org/apache/gluten/expression/ExpressionConverter.scala b/gluten-core/src/main/scala/org/apache/gluten/expression/ExpressionConverter.scala index d5222cfc6350a..3ca66b51897b0 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/expression/ExpressionConverter.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/expression/ExpressionConverter.scala @@ -22,6 +22,7 @@ import org.apache.gluten.sql.shims.SparkShimLoader import org.apache.gluten.test.TestStats import org.apache.gluten.utils.DecimalArithmeticUtil +import org.apache.spark.{SPARK_REVISION, SPARK_VERSION_SHORT} import org.apache.spark.internal.Logging import org.apache.spark.sql.catalyst.SQLConfHelper import org.apache.spark.sql.catalyst.expressions._ @@ -396,14 +397,12 @@ object ExpressionConverter extends SQLConfHelper with Logging { r ) case size: Size => - if (size.legacySizeOfNull != SQLConf.get.legacySizeOfNull) { - throw new GlutenNotSupportException( - "The value of legacySizeOfNull field of size is " + - "not equals to legacySizeOfNull of SQLConf, this case is not supported yet") - } - BackendsApiManager.getSparkPlanExecApiInstance.genSizeExpressionTransformer( + // Covers Spark ArraySize which is replaced by Size(child, false). + val child = + replaceWithExpressionTransformerInternal(size.child, attributeSeq, expressionsMap) + GenericExpressionTransformer( substraitExprName, - replaceWithExpressionTransformerInternal(size.child, attributeSeq, expressionsMap), + Seq(child, LiteralTransformer(size.legacySizeOfNull)), size) case namedStruct: CreateNamedStruct => BackendsApiManager.getSparkPlanExecApiInstance.genNamedStructTransformer( @@ -558,6 +557,19 @@ object ExpressionConverter extends SQLConfHelper with Logging { expressionsMap), arrayTransform ) + case arraySort: ArraySort => + BackendsApiManager.getSparkPlanExecApiInstance.genArraySortTransformer( + substraitExprName, + replaceWithExpressionTransformerInternal( + arraySort.argument, + attributeSeq, + expressionsMap), + replaceWithExpressionTransformerInternal( + arraySort.function, + attributeSeq, + expressionsMap), + arraySort + ) case tryEval @ TryEval(a: Add) => BackendsApiManager.getSparkPlanExecApiInstance.genTryArithmeticTransformer( substraitExprName, @@ -671,6 +683,26 @@ object ExpressionConverter extends SQLConfHelper with Logging { t.children.map(replaceWithExpressionTransformerInternal(_, attributeSeq, expressionsMap)), t ) + case e: EulerNumber => + LiteralTransformer(Literal(Math.E)) + case p: Pi => + LiteralTransformer(Literal(Math.PI)) + case v: SparkVersion => + LiteralTransformer(SPARK_VERSION_SHORT + " " + SPARK_REVISION) + case dateAdd: DateAdd => + BackendsApiManager.getSparkPlanExecApiInstance.genDateAddTransformer( + attributeSeq, + substraitExprName, + dateAdd.children, + dateAdd + ) + case timeAdd: TimeAdd => + BackendsApiManager.getSparkPlanExecApiInstance.genDateAddTransformer( + attributeSeq, + substraitExprName, + timeAdd.children, + timeAdd + ) case expr => GenericExpressionTransformer( substraitExprName, diff --git a/gluten-core/src/main/scala/org/apache/gluten/expression/ExpressionMappings.scala b/gluten-core/src/main/scala/org/apache/gluten/expression/ExpressionMappings.scala index 806ec844de601..ebf0c5139245d 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/expression/ExpressionMappings.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/expression/ExpressionMappings.scala @@ -177,6 +177,7 @@ object ExpressionMappings { Sig[Second](EXTRACT), Sig[FromUnixTime](FROM_UNIXTIME), Sig[DateAdd](DATE_ADD), + Sig[TimeAdd](TIMESTAMP_ADD), Sig[DateSub](DATE_SUB), Sig[DateDiff](DATE_DIFF), Sig[ToUnixTimestamp](TO_UNIX_TIMESTAMP), @@ -248,6 +249,7 @@ object ExpressionMappings { Sig[ArrayFilter](FILTER), Sig[ArrayForAll](FORALL), Sig[ArrayExists](EXISTS), + Sig[ArraySort](ARRAY_SORT), Sig[Shuffle](SHUFFLE), Sig[ZipWith](ZIP_WITH), Sig[Flatten](FLATTEN), @@ -260,6 +262,8 @@ object ExpressionMappings { Sig[MapEntries](MAP_ENTRIES), Sig[MapZipWith](MAP_ZIP_WITH), Sig[StringToMap](STR_TO_MAP), + Sig[TransformKeys](TRANSFORM_KEYS), + Sig[TransformValues](TRANSFORM_VALUES), // Struct functions Sig[GetStructField](GET_STRUCT_FIELD), Sig[CreateNamedStruct](NAMED_STRUCT), @@ -282,6 +286,9 @@ object ExpressionMappings { Sig[MonotonicallyIncreasingID](MONOTONICALLY_INCREASING_ID), Sig[SparkPartitionID](SPARK_PARTITION_ID), Sig[WidthBucket](WIDTH_BUCKET), + Sig[ReplicateRows](REPLICATE_ROWS), + Sig[RaiseError](RAISE_ERROR), + Sig[SparkVersion](VERSION), // Decimal Sig[UnscaledValue](UNSCALED_VALUE), // Generator function diff --git a/gluten-core/src/main/scala/org/apache/gluten/expression/UDFMappings.scala b/gluten-core/src/main/scala/org/apache/gluten/expression/UDFMappings.scala index 7c836252b92d1..3b64c5117fbb5 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/expression/UDFMappings.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/expression/UDFMappings.scala @@ -32,7 +32,7 @@ object UDFMappings extends Logging { val pythonUDFMap: Map[String, String] = Map() val scalaUDFMap: Map[String, String] = Map() - private def appendKVToMap(key: String, value: String, res: Map[String, String]) { + private def appendKVToMap(key: String, value: String, res: Map[String, String]): Unit = { if (key.isEmpty || value.isEmpty()) { throw new IllegalArgumentException(s"key:$key or value:$value is empty") } @@ -46,7 +46,7 @@ object UDFMappings extends Logging { res.put(key.toLowerCase(Locale.ROOT), value) } - private def parseStringToMap(input: String, res: Map[String, String]) { + private def parseStringToMap(input: String, res: Map[String, String]): Unit = { input.split(",").map { item => val keyValue = item.split(":") @@ -57,7 +57,7 @@ object UDFMappings extends Logging { } } - def loadFromSparkConf(conf: SparkConf) { + def loadFromSparkConf(conf: SparkConf): Unit = { val strHiveUDFs = conf.get(GlutenConfig.GLUTEN_SUPPORTED_HIVE_UDFS, "") if (!StringUtils.isBlank(strHiveUDFs)) { parseStringToMap(strHiveUDFs, hiveUDFMap) diff --git a/gluten-core/src/main/scala/org/apache/gluten/extension/GlutenPlan.scala b/gluten-core/src/main/scala/org/apache/gluten/extension/GlutenPlan.scala index 8f1004be4aaae..0c70e1ea7a7b1 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/extension/GlutenPlan.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/extension/GlutenPlan.scala @@ -26,28 +26,29 @@ import org.apache.gluten.substrait.plan.PlanBuilder import org.apache.gluten.substrait.rel.RelNode import org.apache.gluten.test.TestStats import org.apache.gluten.utils.LogLevelUtil -import org.apache.gluten.validate.NativePlanValidationInfo import org.apache.spark.sql.execution.SparkPlan import com.google.common.collect.Lists -import scala.collection.JavaConverters._ - -case class ValidationResult(isValid: Boolean, reason: Option[String]) +sealed trait ValidationResult { + def ok(): Boolean + def reason(): String +} object ValidationResult { - def ok: ValidationResult = ValidationResult(isValid = true, None) - def notOk(reason: String): ValidationResult = ValidationResult(isValid = false, Option(reason)) - def convertFromValidationInfo(info: NativePlanValidationInfo): ValidationResult = { - if (info.isSupported) { - ok - } else { - val fallbackInfo = info.getFallbackInfo.asScala - .mkString("Native validation failed:\n ", "\n ", "") - notOk(fallbackInfo) - } + private case object Succeeded extends ValidationResult { + override def ok(): Boolean = true + override def reason(): String = throw new UnsupportedOperationException( + "Succeeded validation doesn't have failure details") } + + private case class Failed(override val reason: String) extends ValidationResult { + override def ok(): Boolean = false + } + + def succeeded: ValidationResult = Succeeded + def failed(reason: String): ValidationResult = Failed(reason) } /** Every Gluten Operator should extend this trait. */ @@ -63,10 +64,21 @@ trait GlutenPlan extends SparkPlan with Convention.KnownBatchType with LogLevelU * Validate whether this SparkPlan supports to be transformed into substrait node in Native Code. */ final def doValidate(): ValidationResult = { + val schemaVaidationResult = BackendsApiManager.getValidatorApiInstance + .doSchemaValidate(schema) + .map { + reason => + ValidationResult.failed(s"Found schema check failure for $schema, due to: $reason") + } + .getOrElse(ValidationResult.succeeded) + if (!schemaVaidationResult.ok()) { + TestStats.addFallBackClassName(this.getClass.toString) + return schemaVaidationResult + } try { TransformerState.enterValidation val res = doValidateInternal() - if (!res.isValid) { + if (!res.ok()) { TestStats.addFallBackClassName(this.getClass.toString) } res @@ -80,7 +92,7 @@ trait GlutenPlan extends SparkPlan with Convention.KnownBatchType with LogLevelU logValidationMessage( s"Validation failed with exception for plan: $nodeName, due to: ${e.getMessage}", e) - ValidationResult.notOk(e.getMessage) + ValidationResult.failed(e.getMessage) } finally { TransformerState.finishValidation } @@ -99,16 +111,16 @@ trait GlutenPlan extends SparkPlan with Convention.KnownBatchType with LogLevelU BackendsApiManager.getSparkPlanExecApiInstance.batchType } - protected def doValidateInternal(): ValidationResult = ValidationResult.ok + protected def doValidateInternal(): ValidationResult = ValidationResult.succeeded protected def doNativeValidation(context: SubstraitContext, node: RelNode): ValidationResult = { if (node != null && enableNativeValidation) { val planNode = PlanBuilder.makePlan(context, Lists.newArrayList(node)) val info = BackendsApiManager.getValidatorApiInstance .doNativeValidateWithFailureReason(planNode) - ValidationResult.convertFromValidationInfo(info) + info.asResult() } else { - ValidationResult.ok + ValidationResult.succeeded } } diff --git a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/CollapseProjectExecTransformer.scala b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/CollapseProjectExecTransformer.scala index 25674fd17147f..bfb926706cf7b 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/CollapseProjectExecTransformer.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/CollapseProjectExecTransformer.scala @@ -40,11 +40,11 @@ object CollapseProjectExecTransformer extends Rule[SparkPlan] { val collapsedProject = p2.copy(projectList = CollapseProjectShim.buildCleanedProjectList(p1.projectList, p2.projectList)) val validationResult = collapsedProject.doValidate() - if (validationResult.isValid) { + if (validationResult.ok()) { logDebug(s"Collapse project $p1 and $p2.") collapsedProject } else { - logDebug(s"Failed to collapse project, due to ${validationResult.reason.getOrElse("")}") + logDebug(s"Failed to collapse project, due to ${validationResult.reason()}") p1 } } diff --git a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/EliminateLocalSort.scala b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/EliminateLocalSort.scala new file mode 100644 index 0000000000000..6a5c195e5da15 --- /dev/null +++ b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/EliminateLocalSort.scala @@ -0,0 +1,94 @@ +/* + * 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. + */ +package org.apache.gluten.extension.columnar + +import org.apache.gluten.execution.{HashAggregateExecBaseTransformer, ProjectExecTransformer, ShuffledHashJoinExecTransformerBase, SortExecTransformer, WindowExecTransformer, WindowGroupLimitExecTransformer} + +import org.apache.spark.sql.catalyst.expressions.SortOrder +import org.apache.spark.sql.catalyst.rules.Rule +import org.apache.spark.sql.execution.{ProjectExec, SortExec, SparkPlan, UnaryExecNode} + +/** + * This rule is used to eliminate unnecessary local sort. + * + * This could happen if: + * - Convert sort merge join to shuffled hash join + * - Offload SortAggregate to native hash aggregate + * - Offload WindowGroupLimit to native TopNRowNumber + * - The columnar window type is `sort` + */ +object EliminateLocalSort extends Rule[SparkPlan] { + private def canEliminateLocalSort(p: SparkPlan): Boolean = p match { + case _: HashAggregateExecBaseTransformer => true + case _: ShuffledHashJoinExecTransformerBase => true + case _: WindowGroupLimitExecTransformer => true + case _: WindowExecTransformer => true + case _ => false + } + + private def canThrough(p: SparkPlan): Boolean = p match { + case _: ProjectExec => true + case _: ProjectExecTransformer => true + case _ => false + } + + private def orderingSatisfies(gChild: SparkPlan, requiredOrdering: Seq[SortOrder]): Boolean = { + SortOrder.orderingSatisfies(gChild.outputOrdering, requiredOrdering) + } + + override def apply(plan: SparkPlan): SparkPlan = { + plan.transformDown { + case p if canEliminateLocalSort(p) => + val requiredChildOrdering = p.requiredChildOrdering + assert(requiredChildOrdering.size == p.children.size) + val newChildren = p.children.zipWithIndex.map { + case (SortWithChild(gChild), i) if orderingSatisfies(gChild, requiredChildOrdering(i)) => + gChild + case (p: UnaryExecNode, i) if canThrough(p) => + // There may be more than one project between target operator and sort, + // e.g., both hash aggregate and sort pull out project + p.child match { + case SortWithChild(gChild) if orderingSatisfies(gChild, requiredChildOrdering(i)) => + p.withNewChildren(gChild :: Nil) + case _ => p + } + case p => p._1 + } + p.withNewChildren(newChildren) + } + } +} + +object SortWithChild { + def unapply(plan: SparkPlan): Option[SparkPlan] = { + plan match { + case p1 @ ProjectExec(_, SortExecTransformer(_, false, p2: ProjectExec, _)) + if p1.outputSet == p2.child.outputSet => + Some(p2.child) + case p1 @ ProjectExecTransformer( + _, + SortExecTransformer(_, false, p2: ProjectExecTransformer, _)) + if p1.outputSet == p2.child.outputSet => + Some(p2.child) + case SortExec(_, false, child, _) => + Some(child) + case SortExecTransformer(_, false, child, _) => + Some(child) + case _ => None + } + } +} diff --git a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/EnsureLocalSortRequirements.scala b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/EnsureLocalSortRequirements.scala index 0f5fc21aff870..ff989d796f8e2 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/EnsureLocalSortRequirements.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/EnsureLocalSortRequirements.scala @@ -17,7 +17,8 @@ package org.apache.gluten.extension.columnar import org.apache.gluten.GlutenConfig -import org.apache.gluten.execution.SortExecTransformer +import org.apache.gluten.extension.columnar.MiscColumnarRules.TransformPreOverrides +import org.apache.gluten.extension.columnar.rewrite.RewriteSparkPlanRulesManager import org.apache.spark.sql.catalyst.expressions.SortOrder import org.apache.spark.sql.catalyst.rules.Rule @@ -32,26 +33,22 @@ import org.apache.spark.sql.execution.{SortExec, SparkPlan} * SortAggregate with the same key. So, this rule adds local sort back if necessary. */ object EnsureLocalSortRequirements extends Rule[SparkPlan] { + private lazy val offload = TransformPreOverrides.apply() + private def addLocalSort( originalChild: SparkPlan, requiredOrdering: Seq[SortOrder]): SparkPlan = { val newChild = SortExec(requiredOrdering, global = false, child = originalChild) if (!GlutenConfig.getConf.enableColumnarSort) { - TransformHints.tagNotTransformable(newChild, "columnar Sort is not enabled in SortExec") + FallbackTags.add(newChild, "columnar Sort is not enabled in SortExec") newChild } else { - val newChildWithTransformer = - SortExecTransformer( - newChild.sortOrder, - newChild.global, - newChild.child, - newChild.testSpillFrequency) - val validationResult = newChildWithTransformer.doValidate() - if (validationResult.isValid) { - newChildWithTransformer + val rewrittenPlan = RewriteSparkPlanRulesManager.apply().apply(newChild) + if (rewrittenPlan.eq(newChild) && FallbackTags.nonEmpty(rewrittenPlan)) { + // The sort can not be offloaded + rewrittenPlan } else { - TransformHints.tagNotTransformable(newChild, validationResult) - newChild + offload.apply(rewrittenPlan) } } } diff --git a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/ExpandFallbackPolicy.scala b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/ExpandFallbackPolicy.scala index 4ee153173c5c8..491b54443d678 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/ExpandFallbackPolicy.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/ExpandFallbackPolicy.scala @@ -239,11 +239,11 @@ case class ExpandFallbackPolicy(isAdaptiveContext: Boolean, originalPlan: SparkP // Propagate fallback reason to vanilla SparkPlan glutenPlan.foreach { case _: GlutenPlan => - case p: SparkPlan if TransformHints.isNotTransformable(p) && p.logicalLink.isDefined => + case p: SparkPlan if FallbackTags.nonEmpty(p) && p.logicalLink.isDefined => originalPlan .find(_.logicalLink.exists(_.fastEquals(p.logicalLink.get))) - .filterNot(TransformHints.isNotTransformable) - .foreach(origin => TransformHints.tag(origin, TransformHints.getHint(p))) + .filterNot(FallbackTags.nonEmpty) + .foreach(origin => FallbackTags.add(origin, FallbackTags.get(p))) case _ => } @@ -278,9 +278,9 @@ case class ExpandFallbackPolicy(isAdaptiveContext: Boolean, originalPlan: SparkP ) { plan } else { - TransformHints.tagAllNotTransformable( + FallbackTags.addRecursively( vanillaSparkPlan, - TRANSFORM_UNSUPPORTED(fallbackInfo.reason, appendReasonIfExists = false)) + FallbackTag.Exclusive(fallbackInfo.reason.getOrElse("Unknown reason"))) FallbackNode(vanillaSparkPlan) } } else { diff --git a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/TransformHintRule.scala b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/FallbackRules.scala similarity index 79% rename from gluten-core/src/main/scala/org/apache/gluten/extension/columnar/TransformHintRule.scala rename to gluten-core/src/main/scala/org/apache/gluten/extension/columnar/FallbackRules.scala index 7fb451057a2ed..f9eaa4179c67b 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/TransformHintRule.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/FallbackRules.scala @@ -21,7 +21,7 @@ import org.apache.gluten.backendsapi.BackendsApiManager import org.apache.gluten.exception.GlutenNotSupportException import org.apache.gluten.execution._ import org.apache.gluten.extension.{GlutenPlan, ValidationResult} -import org.apache.gluten.extension.columnar.TransformHints.EncodeTransformableTagImplicits +import org.apache.gluten.extension.columnar.FallbackTags.EncodeFallbackTagImplicits import org.apache.gluten.extension.columnar.validator.{Validator, Validators} import org.apache.gluten.sql.shims.SparkShimLoader @@ -30,7 +30,7 @@ import org.apache.spark.sql.SparkSession import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.catalyst.expressions.AttributeReference import org.apache.spark.sql.catalyst.rules.Rule -import org.apache.spark.sql.catalyst.trees.TreeNodeTag +import org.apache.spark.sql.catalyst.trees.{TreeNode, TreeNodeTag} import org.apache.spark.sql.execution._ import org.apache.spark.sql.execution.adaptive.{AQEShuffleReadExec, QueryStageExec} import org.apache.spark.sql.execution.aggregate.{HashAggregateExec, ObjectHashAggregateExec, SortAggregateExec} @@ -45,19 +45,51 @@ import org.apache.spark.sql.types.StringType import org.apache.commons.lang3.exception.ExceptionUtils -sealed trait TransformHint { +sealed trait FallbackTag { val stacktrace: Option[String] = - if (TransformHints.DEBUG) { + if (FallbackTags.DEBUG) { Some(ExceptionUtils.getStackTrace(new Throwable())) } else None + + def reason(): String } -case class TRANSFORM_UNSUPPORTED(reason: Option[String], appendReasonIfExists: Boolean = true) - extends TransformHint +object FallbackTag { + + /** A tag that stores one reason text of fall back. */ + case class Appendable(override val reason: String) extends FallbackTag + + /** + * A tag that stores reason text of fall back. Other reasons will be discarded when this tag is + * added to plan. + */ + case class Exclusive(override val reason: String) extends FallbackTag + + trait Converter[T] { + def from(obj: T): Option[FallbackTag] + } + + object Converter { + implicit def asIs[T <: FallbackTag]: Converter[T] = (tag: T) => Some(tag) + + implicit object FromString extends Converter[String] { + override def from(reason: String): Option[FallbackTag] = Some(Appendable(reason)) + } -object TransformHints { - val TAG: TreeNodeTag[TransformHint] = - TreeNodeTag[TransformHint]("org.apache.gluten.transformhint") + implicit object FromValidationResult extends Converter[ValidationResult] { + override def from(result: ValidationResult): Option[FallbackTag] = { + if (result.ok()) { + return None + } + Some(Appendable(result.reason())) + } + } + } +} + +object FallbackTags { + val TAG: TreeNodeTag[FallbackTag] = + TreeNodeTag[FallbackTag]("org.apache.gluten.FallbackTag") val DEBUG = false @@ -69,11 +101,8 @@ object TransformHints { * validation rule. So user should not consider the plan "transformable" unless all validation * rules are passed. */ - def isNotTransformable(plan: SparkPlan): Boolean = { - getHintOption(plan) match { - case Some(TRANSFORM_UNSUPPORTED(_, _)) => true - case _ => false - } + def nonEmpty(plan: SparkPlan): Boolean = { + getOption(plan).nonEmpty } /** @@ -82,74 +111,53 @@ object TransformHints { * within Gluten transformers. If false, the plan node will be guaranteed fallback to Vanilla plan * node while being implemented. */ - def maybeTransformable(plan: SparkPlan): Boolean = !isNotTransformable(plan) - - def tag(plan: SparkPlan, hint: TransformHint): Unit = { - val mergedHint = getHintOption(plan) - .map { - case originalHint @ TRANSFORM_UNSUPPORTED(Some(originalReason), originAppend) => - hint match { - case TRANSFORM_UNSUPPORTED(Some(newReason), append) => - if (originAppend && append) { - TRANSFORM_UNSUPPORTED(Some(originalReason + "; " + newReason)) - } else if (originAppend) { - TRANSFORM_UNSUPPORTED(Some(originalReason)) - } else if (append) { - TRANSFORM_UNSUPPORTED(Some(newReason)) - } else { - TRANSFORM_UNSUPPORTED(Some(originalReason), false) - } - case TRANSFORM_UNSUPPORTED(None, _) => - originalHint - case _ => - throw new GlutenNotSupportException( - "Plan was already tagged as non-transformable, " + - s"cannot mark it as transformable after that:\n${plan.toString()}") - } - case _ => - hint + def maybeOffloadable(plan: SparkPlan): Boolean = !nonEmpty(plan) + + def add[T](plan: TreeNode[_], t: T)(implicit converter: FallbackTag.Converter[T]): Unit = { + val tagOption = getOption(plan) + val newTagOption = converter.from(t) + + val mergedTagOption: Option[FallbackTag] = + (tagOption ++ newTagOption).reduceOption[FallbackTag] { + // New tag comes while the plan was already tagged, merge. + case (_, exclusive: FallbackTag.Exclusive) => + exclusive + case (exclusive: FallbackTag.Exclusive, _) => + exclusive + case (l: FallbackTag.Appendable, r: FallbackTag.Appendable) => + FallbackTag.Appendable(s"${l.reason}; ${r.reason}") } - .getOrElse(hint) - plan.setTagValue(TAG, mergedHint) - } - - def untag(plan: SparkPlan): Unit = { - plan.unsetTagValue(TAG) - } - - def tagNotTransformable(plan: SparkPlan, validationResult: ValidationResult): Unit = { - if (!validationResult.isValid) { - tag(plan, TRANSFORM_UNSUPPORTED(validationResult.reason)) - } + mergedTagOption + .foreach(mergedTag => plan.setTagValue(TAG, mergedTag)) } - def tagNotTransformable(plan: SparkPlan, reason: String): Unit = { - tag(plan, TRANSFORM_UNSUPPORTED(Some(reason))) - } - - def tagAllNotTransformable(plan: SparkPlan, hint: TRANSFORM_UNSUPPORTED): Unit = { + def addRecursively[T](plan: TreeNode[_], t: T)(implicit + converter: FallbackTag.Converter[T]): Unit = { plan.foreach { case _: GlutenPlan => // ignore - case other => tag(other, hint) + case other: TreeNode[_] => add(other, t) } } - def getHint(plan: SparkPlan): TransformHint = { - getHintOption(plan).getOrElse( + def untag(plan: TreeNode[_]): Unit = { + plan.unsetTagValue(TAG) + } + + def get(plan: TreeNode[_]): FallbackTag = { + getOption(plan).getOrElse( throw new IllegalStateException("Transform hint tag not set in plan: " + plan.toString())) } - def getHintOption(plan: SparkPlan): Option[TransformHint] = { + def getOption(plan: TreeNode[_]): Option[FallbackTag] = { plan.getTagValue(TAG) } - implicit class EncodeTransformableTagImplicits(validationResult: ValidationResult) { - def tagOnFallback(plan: SparkPlan): Unit = { - if (validationResult.isValid) { + implicit class EncodeFallbackTagImplicits(result: ValidationResult) { + def tagOnFallback(plan: TreeNode[_]): Unit = { + if (result.ok()) { return } - val newTag = TRANSFORM_UNSUPPORTED(validationResult.reason) - tag(plan, newTag) + add(plan, result) } } } @@ -157,7 +165,7 @@ object TransformHints { case class FallbackOnANSIMode(session: SparkSession) extends Rule[SparkPlan] { override def apply(plan: SparkPlan): SparkPlan = { if (GlutenConfig.getConf.enableAnsiMode) { - plan.foreach(TransformHints.tagNotTransformable(_, "does not support ansi mode")) + plan.foreach(FallbackTags.add(_, "does not support ansi mode")) } plan } @@ -179,11 +187,11 @@ case class FallbackMultiCodegens(session: SparkSession) extends Rule[SparkPlan] case plan: SortMergeJoinExec if GlutenConfig.getConf.forceShuffledHashJoin => if ((count + 1) >= optimizeLevel) return true plan.children.exists(existsMultiCodegens(_, count + 1)) - case other => false + case _ => false } - def tagNotTransformable(plan: SparkPlan): SparkPlan = { - TransformHints.tagNotTransformable(plan, "fallback multi codegens") + def addFallbackTag(plan: SparkPlan): SparkPlan = { + FallbackTags.add(plan, "fallback multi codegens") plan } @@ -200,35 +208,35 @@ case class FallbackMultiCodegens(session: SparkSession) extends Rule[SparkPlan] } } - def tagNotTransformableRecursive(plan: SparkPlan): SparkPlan = { + def addFallbackTagRecursive(plan: SparkPlan): SparkPlan = { plan match { case p: ShuffleExchangeExec => - tagNotTransformable(p.withNewChildren(p.children.map(tagNotTransformableForMultiCodegens))) + addFallbackTag(p.withNewChildren(p.children.map(tagOnFallbackForMultiCodegens))) case p: BroadcastExchangeExec => - tagNotTransformable(p.withNewChildren(p.children.map(tagNotTransformableForMultiCodegens))) + addFallbackTag(p.withNewChildren(p.children.map(tagOnFallbackForMultiCodegens))) case p: ShuffledHashJoinExec => - tagNotTransformable(p.withNewChildren(p.children.map(tagNotTransformableRecursive))) + addFallbackTag(p.withNewChildren(p.children.map(addFallbackTagRecursive))) case p if !supportCodegen(p) => - p.withNewChildren(p.children.map(tagNotTransformableForMultiCodegens)) + p.withNewChildren(p.children.map(tagOnFallbackForMultiCodegens)) case p if isAQEShuffleReadExec(p) => - p.withNewChildren(p.children.map(tagNotTransformableForMultiCodegens)) + p.withNewChildren(p.children.map(tagOnFallbackForMultiCodegens)) case p: QueryStageExec => p - case p => tagNotTransformable(p.withNewChildren(p.children.map(tagNotTransformableRecursive))) + case p => addFallbackTag(p.withNewChildren(p.children.map(addFallbackTagRecursive))) } } - def tagNotTransformableForMultiCodegens(plan: SparkPlan): SparkPlan = { + def tagOnFallbackForMultiCodegens(plan: SparkPlan): SparkPlan = { plan match { case plan if existsMultiCodegens(plan) => - tagNotTransformableRecursive(plan) + addFallbackTagRecursive(plan) case other => - other.withNewChildren(other.children.map(tagNotTransformableForMultiCodegens)) + other.withNewChildren(other.children.map(tagOnFallbackForMultiCodegens)) } } override def apply(plan: SparkPlan): SparkPlan = { if (physicalJoinOptimize) { - tagNotTransformableForMultiCodegens(plan) + tagOnFallbackForMultiCodegens(plan) } else plan } } @@ -272,13 +280,11 @@ case class FallbackEmptySchemaRelation() extends Rule[SparkPlan] { if (p.children.exists(_.output.isEmpty)) { // Some backends are not eligible to offload plan with zero-column input. // If any child have empty output, mark the plan and that child as UNSUPPORTED. - TransformHints.tagNotTransformable(p, "at least one of its children has empty output") + FallbackTags.add(p, "at least one of its children has empty output") p.children.foreach { child => if (child.output.isEmpty && !child.isInstanceOf[WriteFilesExec]) { - TransformHints.tagNotTransformable( - child, - "at least one of its children has empty output") + FallbackTags.add(child, "at least one of its children has empty output") } } } @@ -291,8 +297,8 @@ case class FallbackEmptySchemaRelation() extends Rule[SparkPlan] { // The doValidate function will be called to check if the conversion is supported. // If false is returned or any unsupported exception is thrown, a row guard will // be added on the top of that plan to prevent actual conversion. -case class AddTransformHintRule() extends Rule[SparkPlan] { - import AddTransformHintRule._ +case class AddFallbackTagRule() extends Rule[SparkPlan] { + import AddFallbackTagRule._ private val glutenConf: GlutenConfig = GlutenConfig.getConf private val validator = Validators .builder() @@ -305,22 +311,15 @@ case class AddTransformHintRule() extends Rule[SparkPlan] { .build() def apply(plan: SparkPlan): SparkPlan = { - addTransformableTags(plan) - } - - /** Inserts a transformable tag on top of those that are not supported. */ - private def addTransformableTags(plan: SparkPlan): SparkPlan = { - // Walk the tree with post-order - val out = plan.mapChildren(addTransformableTags) - addTransformableTag(out) - out + plan.foreachUp { case p => addFallbackTag(p) } + plan } - private def addTransformableTag(plan: SparkPlan): Unit = { + private def addFallbackTag(plan: SparkPlan): Unit = { val outcome = validator.validate(plan) outcome match { case Validator.Failed(reason) => - TransformHints.tagNotTransformable(plan, reason) + FallbackTags.add(plan, reason) return case Validator.Passed => } @@ -353,13 +352,13 @@ case class AddTransformHintRule() extends Rule[SparkPlan] { .genFilterExecTransformer(plan.condition, plan.child) transformer.doValidate().tagOnFallback(plan) case plan: HashAggregateExec => - val transformer = HashAggregateExecBaseTransformer.from(plan)() + val transformer = HashAggregateExecBaseTransformer.from(plan) transformer.doValidate().tagOnFallback(plan) case plan: SortAggregateExec => - val transformer = HashAggregateExecBaseTransformer.from(plan)() + val transformer = HashAggregateExecBaseTransformer.from(plan) transformer.doValidate().tagOnFallback(plan) case plan: ObjectHashAggregateExec => - val transformer = HashAggregateExecBaseTransformer.from(plan)() + val transformer = HashAggregateExecBaseTransformer.from(plan) transformer.doValidate().tagOnFallback(plan) case plan: UnionExec => val transformer = ColumnarUnionExec(plan.children) @@ -508,11 +507,11 @@ case class AddTransformHintRule() extends Rule[SparkPlan] { ) transformer.doValidate().tagOnFallback(plan) case _ => - // Currently we assume a plan to be transformable by default. + // Currently we assume a plan to be offload-able by default. } } catch { case e @ (_: GlutenNotSupportException | _: UnsupportedOperationException) => - TransformHints.tagNotTransformable( + FallbackTags.add( plan, s"${e.getMessage}, original Spark plan is " + s"${plan.getClass}(${plan.children.toList.map(_.getClass)})") @@ -523,7 +522,7 @@ case class AddTransformHintRule() extends Rule[SparkPlan] { } } -object AddTransformHintRule { +object AddFallbackTagRule { implicit private class ValidatorBuilderImplicits(builder: Validators.Builder) { /** @@ -561,9 +560,9 @@ object AddTransformHintRule { } } -case class RemoveTransformHintRule() extends Rule[SparkPlan] { +case class RemoveFallbackTagRule() extends Rule[SparkPlan] { override def apply(plan: SparkPlan): SparkPlan = { - plan.foreach(TransformHints.untag) + plan.foreach(FallbackTags.untag) plan } } diff --git a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/MiscColumnarRules.scala b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/MiscColumnarRules.scala index 15fc8bea7054f..b7a30f7e177a5 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/MiscColumnarRules.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/MiscColumnarRules.scala @@ -20,10 +20,14 @@ import org.apache.gluten.extension.columnar.transition.{ColumnarToRowLike, Trans import org.apache.gluten.utils.{LogLevelUtil, PlanUtil} import org.apache.spark.sql.SparkSession +import org.apache.spark.sql.catalyst.expressions.Expression +import org.apache.spark.sql.catalyst.optimizer.{BuildLeft, BuildRight, BuildSide} +import org.apache.spark.sql.catalyst.plans.{JoinType, LeftSemi} import org.apache.spark.sql.catalyst.rules.{PlanChangeLogger, Rule} import org.apache.spark.sql.execution._ import org.apache.spark.sql.execution.adaptive.{AdaptiveSparkPlanExec, BroadcastQueryStageExec} import org.apache.spark.sql.execution.exchange.{BroadcastExchangeExec, BroadcastExchangeLike, ShuffleExchangeLike} +import org.apache.spark.sql.execution.joins.BroadcastNestedLoopJoinExec import org.apache.spark.sql.internal.SQLConf object MiscColumnarRules { @@ -190,4 +194,22 @@ object MiscColumnarRules { child } } + + // Remove unnecessary bnlj like sql: + // ``` select l.* from l left semi join r; ``` + // The result always is left table. + case class RemoveBroadcastNestedLoopJoin() extends Rule[SparkPlan] { + override def apply(plan: SparkPlan): SparkPlan = plan.transformUp { + case BroadcastNestedLoopJoinExec( + left: SparkPlan, + right: SparkPlan, + buildSide: BuildSide, + joinType: JoinType, + condition: Option[Expression]) if condition.isEmpty && joinType == LeftSemi => + buildSide match { + case BuildLeft => right + case BuildRight => left + } + } + } } diff --git a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/OffloadSingleNode.scala b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/OffloadSingleNode.scala index 1f6f840b5552e..1d4e11d912c11 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/OffloadSingleNode.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/OffloadSingleNode.scala @@ -56,7 +56,7 @@ sealed trait OffloadSingleNode extends Logging { // Aggregation transformation. case class OffloadAggregate() extends OffloadSingleNode with LogLevelUtil { override def offload(plan: SparkPlan): SparkPlan = plan match { - case plan if TransformHints.isNotTransformable(plan) => + case plan if FallbackTags.nonEmpty(plan) => plan case agg: HashAggregateExec => genHashAggregateExec(agg) @@ -72,7 +72,7 @@ case class OffloadAggregate() extends OffloadSingleNode with LogLevelUtil { * the actually used plan for execution. */ private def genHashAggregateExec(plan: HashAggregateExec): SparkPlan = { - if (TransformHints.isNotTransformable(plan)) { + if (FallbackTags.nonEmpty(plan)) { return plan } @@ -87,17 +87,17 @@ case class OffloadAggregate() extends OffloadSingleNode with LogLevelUtil { case _: TransformSupport => // If the child is transformable, transform aggregation as well. logDebug(s"Columnar Processing for ${plan.getClass} is currently supported.") - HashAggregateExecBaseTransformer.from(plan)() + HashAggregateExecBaseTransformer.from(plan) case p: SparkPlan if PlanUtil.isGlutenTableCache(p) => - HashAggregateExecBaseTransformer.from(plan)() + HashAggregateExecBaseTransformer.from(plan) case _ => // If the child is not transformable, do not transform the agg. - TransformHints.tagNotTransformable(plan, "child output schema is empty") + FallbackTags.add(plan, "child output schema is empty") plan } } else { logDebug(s"Columnar Processing for ${plan.getClass} is currently supported.") - HashAggregateExecBaseTransformer.from(plan)() + HashAggregateExecBaseTransformer.from(plan) } } } @@ -105,7 +105,7 @@ case class OffloadAggregate() extends OffloadSingleNode with LogLevelUtil { // Exchange transformation. case class OffloadExchange() extends OffloadSingleNode with LogLevelUtil { override def offload(plan: SparkPlan): SparkPlan = plan match { - case p if TransformHints.isNotTransformable(p) => + case p if FallbackTags.nonEmpty(p) => p case s: ShuffleExchangeExec if (s.child.supportsColumnar || GlutenConfig.getConf.enablePreferColumnar) && @@ -124,7 +124,7 @@ case class OffloadExchange() extends OffloadSingleNode with LogLevelUtil { case class OffloadJoin() extends OffloadSingleNode with LogLevelUtil { override def offload(plan: SparkPlan): SparkPlan = { - if (TransformHints.isNotTransformable(plan)) { + if (FallbackTags.nonEmpty(plan)) { logDebug(s"Columnar Processing for ${plan.getClass} is under row guard.") return plan } @@ -278,6 +278,17 @@ case class OffloadProject() extends OffloadSingleNode with LogLevelUtil { p.copy(genNewProjectList(projectList), addMetadataCol(child, replacedExprs)) case p @ ProjectExecTransformer(projectList, child) => p.copy(genNewProjectList(projectList), addMetadataCol(child, replacedExprs)) + case u @ UnionExec(children) => + val newFirstChild = addMetadataCol(children.head, replacedExprs) + val newOtherChildren = children.tail.map { + child => + // Make sure exprId is unique in each child of Union. + val newReplacedExprs = replacedExprs.map { + expr => (expr._1, AttributeReference(expr._2.name, expr._2.dataType, false)()) + } + addMetadataCol(child, newReplacedExprs) + } + u.copy(children = newFirstChild +: newOtherChildren) case _ => plan.withNewChildren(plan.children.map(addMetadataCol(_, replacedExprs))) } } @@ -291,24 +302,23 @@ case class OffloadProject() extends OffloadSingleNode with LogLevelUtil { f } } - val addHint = AddTransformHintRule() + val addHint = AddFallbackTagRule() val newProjectList = projectExec.projectList.filterNot(containsInputFileRelatedExpr) val newProjectExec = ProjectExec(newProjectList, projectExec.child) addHint.apply(newProjectExec) - if (TransformHints.isNotTransformable(newProjectExec)) { + if (FallbackTags.nonEmpty(newProjectExec)) { // Project is still not transformable after remove `input_file_name` expressions. projectExec } else { - // the project with `input_file_name` expression should have at most - // one data source, reference: + // the project with `input_file_name` expression may have multiple data source + // by union all, reference: // https://github.com/apache/spark/blob/e459674127e7b21e2767cc62d10ea6f1f941936c - // /sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/rules.scala#L506 + // /sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/rules.scala#L519 val leafScans = findScanNodes(projectExec) - assert(leafScans.size <= 1) - if (leafScans.isEmpty || TransformHints.isNotTransformable(leafScans(0))) { + if (leafScans.isEmpty || leafScans.exists(FallbackTags.nonEmpty)) { // It means // 1. projectExec has `input_file_name` but no scan child. - // 2. It has scan child node but the scan node fallback. + // 2. It has scan children node but the scan node fallback. projectExec } else { val replacedExprs = scala.collection.mutable.Map[String, AttributeReference]() @@ -326,12 +336,12 @@ case class OffloadProject() extends OffloadSingleNode with LogLevelUtil { private def genProjectExec(projectExec: ProjectExec): SparkPlan = { if ( - TransformHints.isNotTransformable(projectExec) && + FallbackTags.nonEmpty(projectExec) && BackendsApiManager.getSettings.supportNativeInputFileRelatedExpr() && projectExec.projectList.exists(containsInputFileRelatedExpr) ) { tryOffloadProjectExecWithInputFileRelatedExprs(projectExec) - } else if (TransformHints.isNotTransformable(projectExec)) { + } else if (FallbackTags.nonEmpty(projectExec)) { projectExec } else { logDebug(s"Columnar Processing for ${projectExec.getClass} is currently supported.") @@ -366,7 +376,7 @@ case class OffloadFilter() extends OffloadSingleNode with LogLevelUtil { * the actually used plan for execution. */ private def genFilterExec(filter: FilterExec): SparkPlan = { - if (TransformHints.isNotTransformable(filter)) { + if (FallbackTags.nonEmpty(filter)) { return filter } @@ -375,11 +385,11 @@ case class OffloadFilter() extends OffloadSingleNode with LogLevelUtil { // Push down the left conditions in Filter into FileSourceScan. val newChild: SparkPlan = filter.child match { case scan @ (_: FileSourceScanExec | _: BatchScanExec) => - if (TransformHints.maybeTransformable(scan)) { + if (FallbackTags.maybeOffloadable(scan)) { val newScan = FilterHandler.pushFilterToScan(filter.condition, scan) newScan match { - case ts: TransformSupport if ts.doValidate().isValid => ts + case ts: TransformSupport if ts.doValidate().ok() => ts case _ => scan } } else scan @@ -410,7 +420,7 @@ object OffloadOthers { def doReplace(p: SparkPlan): SparkPlan = { val plan = p - if (TransformHints.isNotTransformable(plan)) { + if (FallbackTags.nonEmpty(plan)) { return plan } plan match { @@ -425,16 +435,10 @@ object OffloadOthers { ColumnarCoalesceExec(plan.numPartitions, plan.child) case plan: SortAggregateExec => logDebug(s"Columnar Processing for ${plan.getClass} is currently supported.") - HashAggregateExecBaseTransformer.from(plan) { - case sort: SortExecTransformer if !sort.global => - sort.child - case sort: SortExec if !sort.global => - sort.child - case other => other - } + HashAggregateExecBaseTransformer.from(plan) case plan: ObjectHashAggregateExec => logDebug(s"Columnar Processing for ${plan.getClass} is currently supported.") - HashAggregateExecBaseTransformer.from(plan)() + HashAggregateExecBaseTransformer.from(plan) case plan: UnionExec => val children = plan.children logDebug(s"Columnar Processing for ${plan.getClass} is currently supported.") @@ -556,12 +560,12 @@ object OffloadOthers { case plan: FileSourceScanExec => val transformer = ScanTransformerFactory.createFileSourceScanTransformer(plan) val validationResult = transformer.doValidate() - if (validationResult.isValid) { + if (validationResult.ok()) { logDebug(s"Columnar Processing for ${plan.getClass} is currently supported.") transformer } else { logDebug(s"Columnar Processing for ${plan.getClass} is currently unsupported.") - TransformHints.tagNotTransformable(plan, validationResult.reason.get) + FallbackTags.add(plan, validationResult.reason()) plan } case plan: BatchScanExec => @@ -571,12 +575,12 @@ object OffloadOthers { val hiveTableScanExecTransformer = BackendsApiManager.getSparkPlanExecApiInstance.genHiveTableScanExecTransformer(plan) val validateResult = hiveTableScanExecTransformer.doValidate() - if (validateResult.isValid) { + if (validateResult.ok()) { logDebug(s"Columnar Processing for ${plan.getClass} is currently supported.") return hiveTableScanExecTransformer } logDebug(s"Columnar Processing for ${plan.getClass} is currently unsupported.") - TransformHints.tagNotTransformable(plan, validateResult.reason.get) + FallbackTags.add(plan, validateResult.reason()) plan case other => throw new GlutenNotSupportException(s"${other.getClass.toString} is not supported.") diff --git a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/RemoveNativeWriteFilesSortAndProject.scala b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/RemoveNativeWriteFilesSortAndProject.scala index ce94626d999d5..ac35ac83bb21d 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/RemoveNativeWriteFilesSortAndProject.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/RemoveNativeWriteFilesSortAndProject.scala @@ -71,12 +71,12 @@ object NativeWriteFilesWithSkippingSortAndProject extends Logging { } val transformer = ProjectExecTransformer(newProjectList, p.child) val validationResult = transformer.doValidate() - if (validationResult.isValid) { + if (validationResult.ok()) { Some(transformer) } else { // If we can not transform the project, then we fallback to origin plan which means // we also retain the sort operator. - TransformHints.tagNotTransformable(p, validationResult) + FallbackTags.add(p, validationResult) None } case _ => None diff --git a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/enumerated/EnumeratedApplier.scala b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/enumerated/EnumeratedApplier.scala index d5260f66adba6..3df0282f8e642 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/enumerated/EnumeratedApplier.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/enumerated/EnumeratedApplier.scala @@ -45,7 +45,12 @@ class EnumeratedApplier(session: SparkSession) with Logging with LogLevelUtil { // An empirical value. - private val aqeStackTraceIndex = 16 + private val aqeStackTraceIndex = + if (scala.util.Properties.releaseVersion.exists(_.startsWith("2.12"))) { + 16 + } else { + 14 + } private val adaptiveContext = AdaptiveContext(session, aqeStackTraceIndex) override def apply(plan: SparkPlan, outputsColumnar: Boolean): SparkPlan = @@ -97,6 +102,7 @@ class EnumeratedApplier(session: SparkSession) List( (_: SparkSession) => RemoveNativeWriteFilesSortAndProject(), (spark: SparkSession) => RewriteTransformer(spark), + (_: SparkSession) => EliminateLocalSort, (_: SparkSession) => EnsureLocalSortRequirements, (_: SparkSession) => CollapseProjectExecTransformer ) ::: @@ -128,7 +134,7 @@ class EnumeratedApplier(session: SparkSession) // when columnar table cache is enabled. (s: SparkSession) => RemoveGlutenTableCacheColumnarToRow(s), (s: SparkSession) => GlutenFallbackReporter(GlutenConfig.getConf, s), - (_: SparkSession) => RemoveTransformHintRule() + (_: SparkSession) => RemoveFallbackTagRule() ) } } diff --git a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/enumerated/EnumeratedTransform.scala b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/enumerated/EnumeratedTransform.scala index 30e4c0a798230..4b747eb70075b 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/enumerated/EnumeratedTransform.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/enumerated/EnumeratedTransform.scala @@ -63,7 +63,6 @@ case class EnumeratedTransform(session: SparkSession, outputsColumnar: Boolean) OffloadOthers()) .toRule, RasOffload.from[CoalesceExec](OffloadOthers()).toRule, - RasOffload.from[ProjectExec](OffloadOthers()).toRule, RasOffload.from[SortAggregateExec](OffloadOthers()).toRule, RasOffload.from[ObjectHashAggregateExec](OffloadOthers()).toRule, RasOffload.from[UnionExec](OffloadOthers()).toRule, diff --git a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/enumerated/PushFilterToScan.scala b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/enumerated/PushFilterToScan.scala index 611d6db0bd483..4070a0a586120 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/enumerated/PushFilterToScan.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/enumerated/PushFilterToScan.scala @@ -37,7 +37,7 @@ class PushFilterToScan(validator: Validator) extends RasRule[SparkPlan] { val newScan = FilterHandler.pushFilterToScan(filter.condition, scan) newScan match { - case ts: TransformSupport if ts.doValidate().isValid => + case ts: TransformSupport if ts.doValidate().ok() => List(filter.withNewChildren(List(ts))) case _ => List.empty diff --git a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/enumerated/RasOffload.scala b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/enumerated/RasOffload.scala index 8091127da0bfa..43f52a9e4758e 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/enumerated/RasOffload.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/enumerated/RasOffload.scala @@ -106,7 +106,7 @@ object RasOffload { case Validator.Passed => val offloaded = base.offload(from) val offloadedNodes = offloaded.collect[GlutenPlan] { case t: GlutenPlan => t } - if (offloadedNodes.exists(!_.doValidate().isValid)) { + if (offloadedNodes.exists(!_.doValidate().ok())) { // 4. If native validation fails on the offloaded node, return the // original one. from diff --git a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/enumerated/RasOffloadHashAggregate.scala b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/enumerated/RasOffloadHashAggregate.scala index 6c125478bd019..272e05ca7b7b5 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/enumerated/RasOffloadHashAggregate.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/enumerated/RasOffloadHashAggregate.scala @@ -24,7 +24,7 @@ import org.apache.spark.sql.execution.aggregate.HashAggregateExec object RasOffloadHashAggregate extends RasOffload { override def offload(node: SparkPlan): SparkPlan = node match { case agg: HashAggregateExec => - val out = HashAggregateExecBaseTransformer.from(agg)() + val out = HashAggregateExecBaseTransformer.from(agg) out case other => other } diff --git a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/enumerated/RasOffloadProject.scala b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/enumerated/RasOffloadProject.scala index 0bbf57499b73a..4b55fff0ada17 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/enumerated/RasOffloadProject.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/enumerated/RasOffloadProject.scala @@ -20,6 +20,7 @@ import org.apache.gluten.execution.ProjectExecTransformer import org.apache.spark.sql.execution.{ProjectExec, SparkPlan} +/** TODO: Map [[org.apache.gluten.extension.columnar.OffloadProject]] to RAS. */ object RasOffloadProject extends RasOffload { override def offload(node: SparkPlan): SparkPlan = node match { case ProjectExec(projectList, child) => diff --git a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/enumerated/RemoveFilter.scala b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/enumerated/RemoveFilter.scala index e2b8439fd218e..8b8441e8d6ce7 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/enumerated/RemoveFilter.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/enumerated/RemoveFilter.scala @@ -41,9 +41,12 @@ object RemoveFilter extends RasRule[SparkPlan] { override def shift(node: SparkPlan): Iterable[SparkPlan] = { val filter = node.asInstanceOf[FilterExecTransformerBase] if (filter.isNoop()) { - val out = NoopFilter(filter.child, filter.output) - out.copyTagsFrom(filter) - return List(out) + if (filter.output != filter.child.output) { + val out = NoopFilter(filter.child, filter.output) + out.copyTagsFrom(filter) + return List(out) + } + return List(filter.child) } List.empty } diff --git a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/heuristic/HeuristicApplier.scala b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/heuristic/HeuristicApplier.scala index d925bc231cd92..738d67f4b77bb 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/heuristic/HeuristicApplier.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/heuristic/HeuristicApplier.scala @@ -40,7 +40,12 @@ class HeuristicApplier(session: SparkSession) with Logging with LogLevelUtil { // This is an empirical value, may need to be changed for supporting other versions of spark. - private val aqeStackTraceIndex = 19 + private val aqeStackTraceIndex = + if (scala.util.Properties.releaseVersion.exists(_.startsWith("2.12"))) { + 19 + } else { + 17 + } private val adaptiveContext = AdaptiveContext(session, aqeStackTraceIndex) override def apply(plan: SparkPlan, outputsColumnar: Boolean): SparkPlan = { @@ -103,12 +108,13 @@ class HeuristicApplier(session: SparkSession) (_: SparkSession) => FallbackEmptySchemaRelation(), (spark: SparkSession) => MergeTwoPhasesHashBaseAggregate(spark), (_: SparkSession) => RewriteSparkPlanRulesManager(), - (_: SparkSession) => AddTransformHintRule() + (_: SparkSession) => AddFallbackTagRule() ) ::: List((_: SparkSession) => TransformPreOverrides()) ::: List( (_: SparkSession) => RemoveNativeWriteFilesSortAndProject(), (spark: SparkSession) => RewriteTransformer(spark), + (_: SparkSession) => EliminateLocalSort, (_: SparkSession) => EnsureLocalSortRequirements, (_: SparkSession) => CollapseProjectExecTransformer ) ::: @@ -150,7 +156,7 @@ class HeuristicApplier(session: SparkSession) // when columnar table cache is enabled. (s: SparkSession) => RemoveGlutenTableCacheColumnarToRow(s), (s: SparkSession) => GlutenFallbackReporter(GlutenConfig.getConf, s), - (_: SparkSession) => RemoveTransformHintRule() + (_: SparkSession) => RemoveFallbackTagRule() ) } diff --git a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/rewrite/RewriteJoin.scala b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/rewrite/RewriteJoin.scala index e038f5af0a070..4fd420b025abf 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/rewrite/RewriteJoin.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/rewrite/RewriteJoin.scala @@ -17,7 +17,6 @@ package org.apache.gluten.extension.columnar.rewrite import org.apache.gluten.GlutenConfig -import org.apache.gluten.execution.SortUtils import org.apache.spark.sql.catalyst.optimizer.{BuildLeft, BuildRight, BuildSide, JoinSelectionHelper} import org.apache.spark.sql.catalyst.plans.JoinType @@ -52,8 +51,8 @@ object RewriteJoin extends RewriteSingleNode with JoinSelectionHelper { smj.joinType, buildSide, smj.condition, - SortUtils.dropPartialSort(smj.left), - SortUtils.dropPartialSort(smj.right), + smj.left, + smj.right, smj.isSkewJoin ) case _ => plan diff --git a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/rewrite/RewriteSparkPlanRulesManager.scala b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/rewrite/RewriteSparkPlanRulesManager.scala index 34fe34f3f3fac..e005a3dc81639 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/rewrite/RewriteSparkPlanRulesManager.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/rewrite/RewriteSparkPlanRulesManager.scala @@ -16,7 +16,7 @@ */ package org.apache.gluten.extension.columnar.rewrite -import org.apache.gluten.extension.columnar.{AddTransformHintRule, TransformHint, TransformHints} +import org.apache.gluten.extension.columnar.{AddFallbackTagRule, FallbackTag, FallbackTags} import org.apache.gluten.sql.shims.SparkShimLoader import org.apache.spark.rdd.RDD @@ -49,7 +49,7 @@ class RewriteSparkPlanRulesManager private (rewriteRules: Seq[RewriteSingleNode] extends Rule[SparkPlan] { private def mayNeedRewrite(plan: SparkPlan): Boolean = { - TransformHints.maybeTransformable(plan) && { + FallbackTags.maybeOffloadable(plan) && { plan match { case _: SortExec => true case _: TakeOrderedAndProjectExec => true @@ -67,14 +67,14 @@ class RewriteSparkPlanRulesManager private (rewriteRules: Seq[RewriteSingleNode] } } - private def getTransformHintBack(rewrittenPlan: SparkPlan): Option[TransformHint] = { + private def getFallbackTagBack(rewrittenPlan: SparkPlan): Option[FallbackTag] = { // The rewritten plan may contain more nodes than origin, for now it should only be // `ProjectExec`. val target = rewrittenPlan.collect { case p if !p.isInstanceOf[ProjectExec] && !p.isInstanceOf[RewrittenNodeWall] => p } assert(target.size == 1) - TransformHints.getHintOption(target.head) + FallbackTags.getOption(target.head) } private def applyRewriteRules(origin: SparkPlan): (SparkPlan, Option[String]) = { @@ -93,7 +93,7 @@ class RewriteSparkPlanRulesManager private (rewriteRules: Seq[RewriteSingleNode] } override def apply(plan: SparkPlan): SparkPlan = { - val addHint = AddTransformHintRule() + val addHint = AddFallbackTagRule() plan.transformUp { case origin if mayNeedRewrite(origin) => // Add a wall to avoid transforming unnecessary nodes. @@ -104,18 +104,18 @@ class RewriteSparkPlanRulesManager private (rewriteRules: Seq[RewriteSingleNode] // Note, it is not expected, but it happens in CH backend when pulling out // aggregate. // TODO: Fix the exception and remove this branch - TransformHints.tagNotTransformable(origin, error.get) + FallbackTags.add(origin, error.get) origin } else if (withWall.fastEquals(rewrittenPlan)) { // Return origin if the rewrite rules do nothing. - // We do not add tag and leave it to the outside `AddTransformHintRule`. + // We do not add tag and leave it to the outside `AddFallbackTagRule`. origin } else { addHint.apply(rewrittenPlan) - val hint = getTransformHintBack(rewrittenPlan) - if (hint.isDefined) { + val tag = getFallbackTagBack(rewrittenPlan) + if (tag.isDefined) { // If the rewritten plan is still not transformable, return the original plan. - TransformHints.tag(origin, hint.get) + FallbackTags.add(origin, tag.get) origin } else { rewrittenPlan.transformUp { diff --git a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/validator/Validators.scala b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/validator/Validators.scala index 56b63ef8457ad..903723ccb56b5 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/validator/Validators.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/extension/columnar/validator/Validators.scala @@ -19,7 +19,7 @@ package org.apache.gluten.extension.columnar.validator import org.apache.gluten.GlutenConfig import org.apache.gluten.backendsapi.{BackendsApiManager, BackendSettingsApi} import org.apache.gluten.expression.ExpressionUtils -import org.apache.gluten.extension.columnar.{TRANSFORM_UNSUPPORTED, TransformHints} +import org.apache.gluten.extension.columnar.FallbackTags import org.apache.gluten.sql.shims.SparkShimLoader import org.apache.spark.sql.execution._ @@ -97,7 +97,7 @@ object Validators { if (buffer.isEmpty) { NoopValidator } else { - new ValidatorPipeline(buffer) + new ValidatorPipeline(buffer.toSeq) } } } @@ -108,9 +108,9 @@ object Validators { private object FallbackByHint extends Validator { override def validate(plan: SparkPlan): Validator.OutCome = { - if (TransformHints.isNotTransformable(plan)) { - val hint = TransformHints.getHint(plan).asInstanceOf[TRANSFORM_UNSUPPORTED] - return fail(hint.reason.getOrElse("Reason not recorded")) + if (FallbackTags.nonEmpty(plan)) { + val tag = FallbackTags.get(plan) + return fail(tag.reason()) } pass() } @@ -147,8 +147,6 @@ object Validators { case p: SortAggregateExec if !settings.replaceSortAggWithHashAgg => fail(p) case p: CartesianProductExec if !settings.supportCartesianProductExec() => fail(p) - case p: BroadcastNestedLoopJoinExec if !settings.supportBroadcastNestedLoopJoinExec() => - fail(p) case p: TakeOrderedAndProjectExec if !settings.supportColumnarShuffleExec() => fail(p) case _ => pass() } diff --git a/gluten-core/src/main/scala/org/apache/gluten/planner/GlutenOptimization.scala b/gluten-core/src/main/scala/org/apache/gluten/planner/GlutenOptimization.scala index 555e7d6143bc1..5b24f596395d7 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/planner/GlutenOptimization.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/planner/GlutenOptimization.scala @@ -61,7 +61,7 @@ object GlutenOptimization { GlutenMetadataModel(), GlutenPropertyModel(), GlutenExplain, - RasRule.Factory.reuse(rules)) + RasRule.Factory.reuse(rules.toSeq)) } } } diff --git a/gluten-core/src/main/scala/org/apache/gluten/softaffinity/SoftAffinityManager.scala b/gluten-core/src/main/scala/org/apache/gluten/softaffinity/SoftAffinityManager.scala index 72d590d04c556..278e1b5500929 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/softaffinity/SoftAffinityManager.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/softaffinity/SoftAffinityManager.scala @@ -263,7 +263,7 @@ abstract class AffinityManager extends LogLevelUtil with Logging { rand.shuffle(hosts) logOnLevel(logLevel, s"get host for $f: ${hosts.distinct.mkString(",")}") } - hosts.distinct + hosts.distinct.toSeq } def updatePartitionMap(f: FilePartition, rddId: Int): Unit = { diff --git a/gluten-core/src/main/scala/org/apache/gluten/utils/DecimalArithmeticUtil.scala b/gluten-core/src/main/scala/org/apache/gluten/utils/DecimalArithmeticUtil.scala index 479eb8bb5c291..d3a3373aa0585 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/utils/DecimalArithmeticUtil.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/utils/DecimalArithmeticUtil.scala @@ -28,8 +28,14 @@ import org.apache.spark.sql.utils.DecimalTypeUtil object DecimalArithmeticUtil { + val MIN_ADJUSTED_SCALE = 6 + val MAX_PRECISION = 38 + val MAX_SCALE = 38 + // Returns the result decimal type of a decimal arithmetic computing. def getResultType(expr: BinaryArithmetic, type1: DecimalType, type2: DecimalType): DecimalType = { + + val allowPrecisionLoss = SQLConf.get.decimalOperationsAllowPrecisionLoss var resultScale = 0 var resultPrecision = 0 expr match { @@ -45,13 +51,34 @@ object DecimalArithmeticUtil { resultScale = type1.scale + type2.scale resultPrecision = type1.precision + type2.precision + 1 case _: Divide => - resultScale = - Math.max(DecimalType.MINIMUM_ADJUSTED_SCALE, type1.scale + type2.precision + 1) - resultPrecision = type1.precision - type1.scale + type2.scale + resultScale + if (allowPrecisionLoss) { + resultScale = Math.max(MIN_ADJUSTED_SCALE, type1.scale + type2.precision + 1) + resultPrecision = type1.precision - type1.scale + type2.scale + resultScale + } else { + var intDig = Math.min(MAX_SCALE, type1.precision - type1.scale + type2.scale) + var decDig = Math.min(MAX_SCALE, Math.max(6, type1.scale + type2.precision + 1)) + val diff = (intDig + decDig) - MAX_SCALE + if (diff > 0) { + decDig -= diff / 2 + 1 + intDig = MAX_SCALE - decDig + } + resultPrecision = intDig + decDig + resultScale = decDig + } case other => throw new GlutenNotSupportException(s"$other is not supported.") } - DecimalTypeUtil.adjustPrecisionScale(resultPrecision, resultScale) + + if (allowPrecisionLoss) { + DecimalTypeUtil.adjustPrecisionScale(resultPrecision, resultScale) + } else { + bounded(resultPrecision, resultScale) + } + + } + + def bounded(precision: Int, scale: Int): DecimalType = { + DecimalType(Math.min(precision, MAX_PRECISION), Math.min(scale, MAX_SCALE)) } // If casting between DecimalType, unnecessary cast is skipped to avoid data loss, diff --git a/gluten-core/src/main/scala/org/apache/gluten/utils/SubstraitUtil.scala b/gluten-core/src/main/scala/org/apache/gluten/utils/SubstraitUtil.scala index 9671c7a6bca2c..e8e7ce06feaf4 100644 --- a/gluten-core/src/main/scala/org/apache/gluten/utils/SubstraitUtil.scala +++ b/gluten-core/src/main/scala/org/apache/gluten/utils/SubstraitUtil.scala @@ -48,6 +48,10 @@ object SubstraitUtil { // the left and right relations are exchanged and the // join type is reverted. CrossRel.JoinType.JOIN_TYPE_LEFT + case LeftSemi => + CrossRel.JoinType.JOIN_TYPE_LEFT_SEMI + case FullOuter => + CrossRel.JoinType.JOIN_TYPE_OUTER case _ => CrossRel.JoinType.UNRECOGNIZED } diff --git a/gluten-core/src/main/scala/org/apache/spark/softaffinity/SoftAffinity.scala b/gluten-core/src/main/scala/org/apache/spark/softaffinity/SoftAffinity.scala index 86133542e2694..cfdce536062e3 100644 --- a/gluten-core/src/main/scala/org/apache/spark/softaffinity/SoftAffinity.scala +++ b/gluten-core/src/main/scala/org/apache/spark/softaffinity/SoftAffinity.scala @@ -39,7 +39,7 @@ abstract class Affinity(val manager: AffinityManager) extends LogLevelUtil with filePaths: Array[String], preferredLocations: Array[String]): Array[String] = { if (shouldUseSoftAffinity(filePaths, preferredLocations)) { - internalGetHostLocations(filePaths.min) + internalGetHostLocations(filePaths(0)) } else { preferredLocations } diff --git a/gluten-core/src/main/scala/org/apache/spark/sql/execution/ColumnarBroadcastExchangeExec.scala b/gluten-core/src/main/scala/org/apache/spark/sql/execution/ColumnarBroadcastExchangeExec.scala index df1c87cb0ccc4..d55733fe4e971 100644 --- a/gluten-core/src/main/scala/org/apache/spark/sql/execution/ColumnarBroadcastExchangeExec.scala +++ b/gluten-core/src/main/scala/org/apache/spark/sql/execution/ColumnarBroadcastExchangeExec.scala @@ -17,7 +17,7 @@ package org.apache.spark.sql.execution import org.apache.gluten.backendsapi.BackendsApiManager -import org.apache.gluten.extension.{GlutenPlan, ValidationResult} +import org.apache.gluten.extension.GlutenPlan import org.apache.gluten.metrics.GlutenTimeMetric import org.apache.gluten.sql.shims.SparkShimLoader @@ -27,7 +27,7 @@ import org.apache.spark.rdd.RDD import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.catalyst.expressions.Attribute import org.apache.spark.sql.catalyst.plans.logical.Statistics -import org.apache.spark.sql.catalyst.plans.physical.{BroadcastMode, BroadcastPartitioning, IdentityBroadcastMode, Partitioning} +import org.apache.spark.sql.catalyst.plans.physical.{BroadcastMode, BroadcastPartitioning, Partitioning} import org.apache.spark.sql.execution.exchange.{BroadcastExchangeExec, BroadcastExchangeLike} import org.apache.spark.sql.execution.metric.{SQLMetric, SQLMetrics} import org.apache.spark.sql.internal.SQLConf @@ -133,26 +133,6 @@ case class ColumnarBroadcastExchangeExec(mode: BroadcastMode, child: SparkPlan) ColumnarBroadcastExchangeExec(canonicalized, child.canonicalized) } - override protected def doValidateInternal(): ValidationResult = { - // CH backend does not support IdentityBroadcastMode used in BNLJ - if ( - mode == IdentityBroadcastMode && !BackendsApiManager.getSettings - .supportBroadcastNestedLoopJoinExec() - ) { - return ValidationResult.notOk("This backend does not support IdentityBroadcastMode and BNLJ") - } - BackendsApiManager.getValidatorApiInstance - .doSchemaValidate(schema) - .map { - reason => - { - ValidationResult.notOk( - s"Unsupported schema in broadcast exchange: $schema, reason: $reason") - } - } - .getOrElse(ValidationResult.ok) - } - override def doPrepare(): Unit = { // Materialize the future. relationFuture diff --git a/gluten-core/src/main/scala/org/apache/spark/sql/execution/ColumnarShuffleExchangeExec.scala b/gluten-core/src/main/scala/org/apache/spark/sql/execution/ColumnarShuffleExchangeExec.scala index 85a4dd3878a30..31175a43fbaec 100644 --- a/gluten-core/src/main/scala/org/apache/spark/sql/execution/ColumnarShuffleExchangeExec.scala +++ b/gluten-core/src/main/scala/org/apache/spark/sql/execution/ColumnarShuffleExchangeExec.scala @@ -18,8 +18,7 @@ package org.apache.spark.sql.execution import org.apache.gluten.GlutenConfig import org.apache.gluten.backendsapi.BackendsApiManager -import org.apache.gluten.extension.GlutenPlan -import org.apache.gluten.extension.ValidationResult +import org.apache.gluten.extension.{GlutenPlan, ValidationResult} import org.apache.gluten.sql.shims.SparkShimLoader import org.apache.spark._ @@ -119,10 +118,10 @@ case class ColumnarShuffleExchangeExec( .doColumnarShuffleExchangeExecValidate(outputPartitioning, child) .map { reason => - ValidationResult.notOk( + ValidationResult.failed( s"Found schema check failure for schema ${child.schema} due to: $reason") } - .getOrElse(ValidationResult.ok) + .getOrElse(ValidationResult.succeeded) } override def nodeName: String = "ColumnarExchange" diff --git a/gluten-core/src/main/scala/org/apache/spark/sql/execution/GlutenExplainUtils.scala b/gluten-core/src/main/scala/org/apache/spark/sql/execution/GlutenExplainUtils.scala index 781dc6b6f717a..338136b6d8704 100644 --- a/gluten-core/src/main/scala/org/apache/spark/sql/execution/GlutenExplainUtils.scala +++ b/gluten-core/src/main/scala/org/apache/spark/sql/execution/GlutenExplainUtils.scala @@ -18,12 +18,12 @@ package org.apache.spark.sql.execution import org.apache.gluten.execution.WholeStageTransformer import org.apache.gluten.extension.GlutenPlan +import org.apache.gluten.extension.columnar.FallbackTags import org.apache.gluten.utils.PlanUtil import org.apache.spark.sql.AnalysisException import org.apache.spark.sql.catalyst.expressions.{Expression, PlanExpression} import org.apache.spark.sql.catalyst.plans.QueryPlan -import org.apache.spark.sql.execution.GlutenFallbackReporter.FALLBACK_REASON_TAG import org.apache.spark.sql.execution.adaptive.{AdaptiveSparkPlanExec, AdaptiveSparkPlanHelper, AQEShuffleReadExec, QueryStageExec} import org.apache.spark.sql.execution.columnar.InMemoryTableScanExec import org.apache.spark.sql.execution.command.{DataWritingCommandExec, ExecutedCommandExec} @@ -59,8 +59,8 @@ object GlutenExplainUtils extends AdaptiveSparkPlanHelper { p: SparkPlan, fallbackNodeToReason: mutable.HashMap[String, String] ): Unit = { - p.logicalLink.flatMap(_.getTagValue(FALLBACK_REASON_TAG)) match { - case Some(reason) => addFallbackNodeWithReason(p, reason, fallbackNodeToReason) + p.logicalLink.flatMap(FallbackTags.getOption) match { + case Some(tag) => addFallbackNodeWithReason(p, tag.reason(), fallbackNodeToReason) case _ => // If the SparkPlan does not have fallback reason, then there are two options: // 1. Gluten ignore that plan and it's a kind of fallback diff --git a/gluten-core/src/main/scala/org/apache/spark/sql/execution/GlutenFallbackReporter.scala b/gluten-core/src/main/scala/org/apache/spark/sql/execution/GlutenFallbackReporter.scala index 721a30eb4f409..67ecf81b9ffda 100644 --- a/gluten-core/src/main/scala/org/apache/spark/sql/execution/GlutenFallbackReporter.scala +++ b/gluten-core/src/main/scala/org/apache/spark/sql/execution/GlutenFallbackReporter.scala @@ -19,14 +19,12 @@ package org.apache.spark.sql.execution import org.apache.gluten.GlutenConfig import org.apache.gluten.events.GlutenPlanFallbackEvent import org.apache.gluten.extension.GlutenPlan -import org.apache.gluten.extension.columnar.{TRANSFORM_UNSUPPORTED, TransformHints} +import org.apache.gluten.extension.columnar.FallbackTags import org.apache.gluten.utils.LogLevelUtil import org.apache.spark.sql.SparkSession import org.apache.spark.sql.catalyst.rules.Rule -import org.apache.spark.sql.catalyst.trees.TreeNodeTag import org.apache.spark.sql.catalyst.util.StringUtils.PlanStringConcat -import org.apache.spark.sql.execution.GlutenFallbackReporter.FALLBACK_REASON_TAG import org.apache.spark.sql.execution.ui.GlutenEventUtils /** @@ -57,42 +55,15 @@ case class GlutenFallbackReporter(glutenConfig: GlutenConfig, spark: SparkSessio val validationLogLevel = glutenConfig.validationLogLevel plan.foreachUp { case _: GlutenPlan => // ignore - case p: SparkPlan if TransformHints.isNotTransformable(p) => - TransformHints.getHint(p) match { - case TRANSFORM_UNSUPPORTED(Some(reason), append) => - logFallbackReason(validationLogLevel, p.nodeName, reason) - // With in next round stage in AQE, the physical plan would be a new instance that - // can not preserve the tag, so we need to set the fallback reason to logical plan. - // Then we can be aware of the fallback reason for the whole plan. - // If a logical plan mapping to several physical plan, we add all reason into - // that logical plan to make sure we do not lose any fallback reason. - p.logicalLink.foreach { - logicalPlan => - val newReason = logicalPlan - .getTagValue(FALLBACK_REASON_TAG) - .map { - lastReason => - if (!append) { - lastReason - } else if (lastReason.contains(reason)) { - // use the last reason, as the reason is redundant - lastReason - } else if (reason.contains(lastReason)) { - // overwrite the reason - reason - } else { - // add the new reason - lastReason + "; " + reason - } - } - .getOrElse(reason) - logicalPlan.setTagValue(FALLBACK_REASON_TAG, newReason) - } - case TRANSFORM_UNSUPPORTED(_, _) => - logFallbackReason(validationLogLevel, p.nodeName, "unknown reason") - case _ => - throw new IllegalStateException("Unreachable code") - } + case p: SparkPlan if FallbackTags.nonEmpty(p) => + val tag = FallbackTags.get(p) + logFallbackReason(validationLogLevel, p.nodeName, tag.reason()) + // With in next round stage in AQE, the physical plan would be a new instance that + // can not preserve the tag, so we need to set the fallback reason to logical plan. + // Then we can be aware of the fallback reason for the whole plan. + // If a logical plan mapping to several physical plan, we add all reason into + // that logical plan to make sure we do not lose any fallback reason. + p.logicalLink.foreach(logicalPlan => FallbackTags.add(logicalPlan, tag)) case _ => } } @@ -119,7 +90,4 @@ case class GlutenFallbackReporter(glutenConfig: GlutenConfig, spark: SparkSessio } } -object GlutenFallbackReporter { - // A tag used to inject to logical plan to preserve the fallback reason - val FALLBACK_REASON_TAG = new TreeNodeTag[String]("GLUTEN_FALLBACK_REASON") -} +object GlutenFallbackReporter {} diff --git a/gluten-core/src/main/scala/org/apache/spark/sql/execution/GlutenImplicits.scala b/gluten-core/src/main/scala/org/apache/spark/sql/execution/GlutenImplicits.scala index b0dc3a958e137..eb42f0a884602 100644 --- a/gluten-core/src/main/scala/org/apache/spark/sql/execution/GlutenImplicits.scala +++ b/gluten-core/src/main/scala/org/apache/spark/sql/execution/GlutenImplicits.scala @@ -205,8 +205,8 @@ object GlutenImplicits { FallbackSummary( totalNumGlutenNodes, totalNumFallbackNodes, - totalPhysicalPlanDescription, - totalFallbackNodeToReason + totalPhysicalPlanDescription.toSeq, + totalFallbackNodeToReason.toSeq ) } diff --git a/gluten-core/src/main/scala/org/apache/spark/sql/execution/ShuffledColumnarBatchRDD.scala b/gluten-core/src/main/scala/org/apache/spark/sql/execution/ShuffledColumnarBatchRDD.scala index 42db17b6cd6bb..0642c3a24760f 100644 --- a/gluten-core/src/main/scala/org/apache/spark/sql/execution/ShuffledColumnarBatchRDD.scala +++ b/gluten-core/src/main/scala/org/apache/spark/sql/execution/ShuffledColumnarBatchRDD.scala @@ -139,7 +139,7 @@ class ShuffledColumnarBatchRDD( } } - override def clearDependencies() { + override def clearDependencies(): Unit = { super.clearDependencies() dependency = null } diff --git a/gluten-core/src/main/scala/org/apache/spark/sql/execution/datasources/GlutenFormatWriterInjectsBase.scala b/gluten-core/src/main/scala/org/apache/spark/sql/execution/datasources/GlutenFormatWriterInjectsBase.scala index fbdbeadba8861..450b88163afca 100644 --- a/gluten-core/src/main/scala/org/apache/spark/sql/execution/datasources/GlutenFormatWriterInjectsBase.scala +++ b/gluten-core/src/main/scala/org/apache/spark/sql/execution/datasources/GlutenFormatWriterInjectsBase.scala @@ -18,7 +18,7 @@ package org.apache.spark.sql.execution.datasources import org.apache.gluten.execution.{ProjectExecTransformer, SortExecTransformer, TransformSupport, WholeStageTransformer} import org.apache.gluten.execution.datasource.GlutenFormatWriterInjects -import org.apache.gluten.extension.columnar.AddTransformHintRule +import org.apache.gluten.extension.columnar.AddFallbackTagRule import org.apache.gluten.extension.columnar.MiscColumnarRules.TransformPreOverrides import org.apache.gluten.extension.columnar.rewrite.RewriteSparkPlanRulesManager @@ -47,7 +47,7 @@ trait GlutenFormatWriterInjectsBase extends GlutenFormatWriterInjects { val rules = List( RewriteSparkPlanRulesManager(), - AddTransformHintRule(), + AddFallbackTagRule(), TransformPreOverrides() ) val transformed = rules.foldLeft(plan) { case (latestPlan, rule) => rule.apply(latestPlan) } diff --git a/gluten-core/src/main/scala/org/apache/spark/sql/execution/python/EvalPythonExecTransformer.scala b/gluten-core/src/main/scala/org/apache/spark/sql/execution/python/EvalPythonExecTransformer.scala index ecedc1bae01c8..6a9da0a9cf92e 100644 --- a/gluten-core/src/main/scala/org/apache/spark/sql/execution/python/EvalPythonExecTransformer.scala +++ b/gluten-core/src/main/scala/org/apache/spark/sql/execution/python/EvalPythonExecTransformer.scala @@ -62,7 +62,7 @@ case class EvalPythonExecTransformer( // All udfs should be scalar python udf for (udf <- udfs) { if (!PythonUDF.isScalarPythonUDF(udf)) { - return ValidationResult.notOk(s"$udf is not scalar python udf") + return ValidationResult.failed(s"$udf is not scalar python udf") } } diff --git a/gluten-core/src/main/scala/org/apache/spark/sql/hive/HivePartitionConverter.scala b/gluten-core/src/main/scala/org/apache/spark/sql/hive/HivePartitionConverter.scala index d76eca3d3c49e..3a65d6f559ea1 100644 --- a/gluten-core/src/main/scala/org/apache/spark/sql/hive/HivePartitionConverter.scala +++ b/gluten-core/src/main/scala/org/apache/spark/sql/hive/HivePartitionConverter.scala @@ -80,9 +80,10 @@ class HivePartitionConverter(hadoopConf: Configuration, session: SparkSession) // just like for Apache Spark. val uri = p.getDataLocation.toUri val partValues: Seq[Any] = { - p.getValues.asScala.zip(partitionColTypes).map { - case (value, dataType) => castFromString(value, dataType) - } + p.getValues.asScala + .zip(partitionColTypes) + .map { case (value, dataType) => castFromString(value, dataType) } + .toSeq } val partValuesAsInternalRow = InternalRow.fromSeq(partValues) diff --git a/gluten-core/src/main/scala/org/apache/spark/sql/hive/HiveTableScanExecTransformer.scala b/gluten-core/src/main/scala/org/apache/spark/sql/hive/HiveTableScanExecTransformer.scala index 95793e5dc9354..8133f1d4218bf 100644 --- a/gluten-core/src/main/scala/org/apache/spark/sql/hive/HiveTableScanExecTransformer.scala +++ b/gluten-core/src/main/scala/org/apache/spark/sql/hive/HiveTableScanExecTransformer.scala @@ -45,7 +45,7 @@ import java.net.URI case class HiveTableScanExecTransformer( requestedAttributes: Seq[Attribute], relation: HiveTableRelation, - partitionPruningPred: Seq[Expression])(session: SparkSession) + partitionPruningPred: Seq[Expression])(@transient session: SparkSession) extends AbstractHiveTableScanExec(requestedAttributes, relation, partitionPruningPred)(session) with BasicScanExecTransformer { @@ -202,7 +202,7 @@ object HiveTableScanExecTransformer { hiveTableScan.relation, hiveTableScan.partitionPruningPred)(hiveTableScan.session) hiveTableScanTransformer.doValidate() - case _ => ValidationResult.notOk("Is not a Hive scan") + case _ => ValidationResult.failed("Is not a Hive scan") } } diff --git a/gluten-data/src/main/java/org/apache/gluten/columnarbatch/ColumnarBatchJniWrapper.java b/gluten-data/src/main/java/org/apache/gluten/columnarbatch/ColumnarBatchJniWrapper.java index a834e13a4348e..e71e9d7bee1b5 100644 --- a/gluten-data/src/main/java/org/apache/gluten/columnarbatch/ColumnarBatchJniWrapper.java +++ b/gluten-data/src/main/java/org/apache/gluten/columnarbatch/ColumnarBatchJniWrapper.java @@ -48,8 +48,6 @@ public static ColumnarBatchJniWrapper create(Runtime runtime) { public native long select(long batch, int[] columnIndices); - public native long obtainOwnership(long batch); - public native void close(long batch); @Override diff --git a/gluten-data/src/main/java/org/apache/gluten/columnarbatch/ColumnarBatches.java b/gluten-data/src/main/java/org/apache/gluten/columnarbatch/ColumnarBatches.java index fc3b56c1bcadb..cb68e032dc5ba 100644 --- a/gluten-data/src/main/java/org/apache/gluten/columnarbatch/ColumnarBatches.java +++ b/gluten-data/src/main/java/org/apache/gluten/columnarbatch/ColumnarBatches.java @@ -24,6 +24,7 @@ import org.apache.gluten.utils.ImplicitClass; import org.apache.gluten.vectorized.ArrowWritableColumnVector; +import com.google.common.annotations.VisibleForTesting; import org.apache.arrow.c.ArrowArray; import org.apache.arrow.c.ArrowSchema; import org.apache.arrow.c.CDataDictionaryProvider; @@ -94,10 +95,12 @@ private static void transferVectors(ColumnarBatch from, ColumnarBatch target) { if (target.numCols() != from.numCols()) { throw new IllegalStateException(); } - final ColumnVector[] vectors = (ColumnVector[]) FIELD_COLUMNS.get(target); + final ColumnVector[] newVectors = new ColumnVector[from.numCols()]; for (int i = 0; i < target.numCols(); i++) { - vectors[i] = from.column(i); + newVectors[i] = from.column(i); } + FIELD_COLUMNS.set(target, newVectors); + System.out.println(); } catch (IllegalAccessException e) { throw new GlutenException(e); } @@ -127,7 +130,7 @@ public static ColumnarBatch select(ColumnarBatch batch, int[] columnIndices) { final IndicatorVector iv = getIndicatorVector(batch); long outputBatchHandle = ColumnarBatchJniWrapper.create(runtime).select(iv.handle(), columnIndices); - return create(runtime, outputBatchHandle); + return create(outputBatchHandle); case HEAVY: return new ColumnarBatch( Arrays.stream(columnIndices).mapToObj(batch::column).toArray(ColumnVector[]::new), @@ -218,7 +221,7 @@ private static ColumnarBatch offload(BufferAllocator allocator, ColumnarBatch in long handle = ColumnarBatchJniWrapper.create(runtime) .createWithArrowArray(cSchema.memoryAddress(), cArray.memoryAddress()); - ColumnarBatch output = ColumnarBatches.create(runtime, handle); + ColumnarBatch output = ColumnarBatches.create(handle); // Follow input's reference count. This might be optimized using // automatic clean-up or once the extensibility of ColumnarBatch is enriched @@ -294,7 +297,8 @@ private static long getRefCntHeavy(ColumnarBatch input) { return refCnt; } - private static long getRefCnt(ColumnarBatch input) { + @VisibleForTesting + static long getRefCnt(ColumnarBatch input) { switch (identifyBatchType(input)) { case LIGHT: return getRefCntLight(input); @@ -348,8 +352,8 @@ private static ColumnarBatch create(IndicatorVector iv) { return new ColumnarBatch(columnVectors, numRows); } - public static ColumnarBatch create(Runtime runtime, long nativeHandle) { - return create(new IndicatorVector(runtime, nativeHandle)); + public static ColumnarBatch create(long nativeHandle) { + return create(IndicatorVector.obtain(nativeHandle)); } public static void retain(ColumnarBatch b) { diff --git a/gluten-data/src/main/java/org/apache/gluten/columnarbatch/IndicatorVector.java b/gluten-data/src/main/java/org/apache/gluten/columnarbatch/IndicatorVector.java index 0ec5b78ce5000..7fe87e95fa548 100644 --- a/gluten-data/src/main/java/org/apache/gluten/columnarbatch/IndicatorVector.java +++ b/gluten-data/src/main/java/org/apache/gluten/columnarbatch/IndicatorVector.java @@ -16,15 +16,24 @@ */ package org.apache.gluten.columnarbatch; -import org.apache.gluten.exec.Runtime; +import org.apache.spark.util.TaskResources; import java.util.concurrent.atomic.AtomicLong; public class IndicatorVector extends IndicatorVectorBase { + private final IndicatorVectorPool pool; private final AtomicLong refCnt = new AtomicLong(1L); - protected IndicatorVector(Runtime runtime, long handle) { - super(runtime, handle); + protected IndicatorVector(IndicatorVectorPool pool, long handle) { + super(handle); + this.pool = pool; + } + + static IndicatorVector obtain(long handle) { + final IndicatorVectorPool pool = + TaskResources.addResourceIfNotRegistered( + IndicatorVectorPool.class.getName(), IndicatorVectorPool::new); + return pool.obtain(handle); } @Override @@ -44,6 +53,7 @@ void release() { return; } if (refCnt.decrementAndGet() == 0) { + pool.remove(handle); jniWrapper.close(handle); } } diff --git a/gluten-data/src/main/java/org/apache/gluten/columnarbatch/IndicatorVectorBase.java b/gluten-data/src/main/java/org/apache/gluten/columnarbatch/IndicatorVectorBase.java index fa695127adbf1..1bc685bd5cebe 100644 --- a/gluten-data/src/main/java/org/apache/gluten/columnarbatch/IndicatorVectorBase.java +++ b/gluten-data/src/main/java/org/apache/gluten/columnarbatch/IndicatorVectorBase.java @@ -16,7 +16,7 @@ */ package org.apache.gluten.columnarbatch; -import org.apache.gluten.exec.Runtime; +import org.apache.gluten.exec.Runtimes; import org.apache.spark.sql.types.DataTypes; import org.apache.spark.sql.types.Decimal; @@ -26,35 +26,14 @@ import org.apache.spark.unsafe.types.UTF8String; public abstract class IndicatorVectorBase extends ColumnVector { - private final Runtime runtime; - protected final long handle; protected final ColumnarBatchJniWrapper jniWrapper; + protected final long handle; - protected IndicatorVectorBase(Runtime runtime, long handle) { + protected IndicatorVectorBase(long handle) { super(DataTypes.NullType); - this.runtime = runtime; - this.jniWrapper = ColumnarBatchJniWrapper.create(runtime); - this.handle = takeOwnership(handle); - } - - private long takeOwnership(long handle) { - // Note: Underlying memory of returned batch still holds - // reference to the original memory manager. As - // a result, once its original resident runtime / mm is - // released, data may become invalid. Currently, it's - // the caller's responsibility to make sure the original - // runtime / mm keep alive even this function - // was called. - // - // Additionally, as in Gluten we have principle that runtime - // mm that were created earlier will be released - // later, this FILO practice is what helps the runtime that - // took ownership be able to access the data constantly - // because the original runtime will live longer than - // itself. - long newHandle = jniWrapper.obtainOwnership(handle); - jniWrapper.close(handle); - return newHandle; + this.jniWrapper = + ColumnarBatchJniWrapper.create(Runtimes.contextInstance("IndicatorVectorBase#init")); + this.handle = handle; } public String getType() { diff --git a/gluten-data/src/main/java/org/apache/gluten/columnarbatch/IndicatorVectorPool.java b/gluten-data/src/main/java/org/apache/gluten/columnarbatch/IndicatorVectorPool.java new file mode 100644 index 0000000000000..6e46742b564ad --- /dev/null +++ b/gluten-data/src/main/java/org/apache/gluten/columnarbatch/IndicatorVectorPool.java @@ -0,0 +1,66 @@ +/* + * 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. + */ +package org.apache.gluten.columnarbatch; + +import org.apache.spark.util.TaskResource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class IndicatorVectorPool implements TaskResource { + private static final Logger LOG = LoggerFactory.getLogger(IndicatorVectorPool.class); + // A pool for all alive indicator vectors. The reason we adopt the pool + // is, we don't want one native columnar batch (which is located via the + // long int handle through JNI bridge) to be owned by more than one IndicatorVector + // instance so release method of the native columnar batch could be guaranteed + // to be called and only called once. + private final Map uniqueInstances = new ConcurrentHashMap<>(); + + IndicatorVectorPool() {} + + @Override + public void release() throws Exception { + if (!uniqueInstances.isEmpty()) { + LOG.warn( + "There are still unreleased native columnar batches during ending the task." + + " Will close them automatically however the batches should be better released" + + " manually to minimize memory pressure."); + } + } + + IndicatorVector obtain(long handle) { + return uniqueInstances.computeIfAbsent(handle, h -> new IndicatorVector(this, handle)); + } + + void remove(long handle) { + if (uniqueInstances.remove(handle) == null) { + throw new IllegalStateException("Indicator vector not found in pool, this should not happen"); + } + } + + @Override + public int priority() { + return 0; + } + + @Override + public String resourceName() { + return IndicatorVectorPool.class.getName(); + } +} diff --git a/gluten-data/src/main/java/org/apache/gluten/vectorized/ColumnarBatchOutIterator.java b/gluten-data/src/main/java/org/apache/gluten/vectorized/ColumnarBatchOutIterator.java index ddf00844f9b00..9dd0404384ad4 100644 --- a/gluten-data/src/main/java/org/apache/gluten/vectorized/ColumnarBatchOutIterator.java +++ b/gluten-data/src/main/java/org/apache/gluten/vectorized/ColumnarBatchOutIterator.java @@ -67,7 +67,7 @@ public ColumnarBatch nextInternal() throws IOException { if (batchHandle == -1L) { return null; // stream ended } - return ColumnarBatches.create(runtime, batchHandle); + return ColumnarBatches.create(batchHandle); } @Override diff --git a/gluten-data/src/main/scala/org/apache/spark/sql/execution/ColumnarBuildSideRelation.scala b/gluten-data/src/main/scala/org/apache/spark/sql/execution/ColumnarBuildSideRelation.scala index fb39df6026f6e..9f13ea967a8d8 100644 --- a/gluten-data/src/main/scala/org/apache/spark/sql/execution/ColumnarBuildSideRelation.scala +++ b/gluten-data/src/main/scala/org/apache/spark/sql/execution/ColumnarBuildSideRelation.scala @@ -68,7 +68,7 @@ case class ColumnarBuildSideRelation(output: Seq[Attribute], batches: Array[Arra jniWrapper .deserialize(serializeHandle, batches(batchId)) batchId += 1 - ColumnarBatches.create(runtime, handle) + ColumnarBatches.create(handle) } }) .protectInvocationFlow() @@ -124,7 +124,7 @@ case class ColumnarBuildSideRelation(output: Seq[Attribute], batches: Array[Arra batchId += 1 val batchHandle = serializerJniWrapper.deserialize(serializeHandle, batchBytes) - val batch = ColumnarBatches.create(runtime, batchHandle) + val batch = ColumnarBatches.create(batchHandle) if (batch.numRows == 0) { batch.close() Iterator.empty diff --git a/gluten-data/src/main/scala/org/apache/spark/sql/execution/utils/ExecUtil.scala b/gluten-data/src/main/scala/org/apache/spark/sql/execution/utils/ExecUtil.scala index 8526dbbec0bfb..94bdc73a5b502 100644 --- a/gluten-data/src/main/scala/org/apache/spark/sql/execution/utils/ExecUtil.scala +++ b/gluten-data/src/main/scala/org/apache/spark/sql/execution/utils/ExecUtil.scala @@ -151,10 +151,7 @@ object ExecUtil { val newHandle = ColumnarBatches.compose(pidBatch, cb) // Composed batch already hold pidBatch's shared ref, so close is safe. ColumnarBatches.forceClose(pidBatch) - ( - 0, - ColumnarBatches - .create(Runtimes.contextInstance("ExecUtil#getShuffleDependency"), newHandle)) + (0, ColumnarBatches.create(newHandle)) }) .recyclePayload(p => ColumnarBatches.forceClose(p._2)) // FIXME why force close? .create() diff --git a/gluten-delta/src/main/scala/org/apache/gluten/execution/DeltaScanTransformer.scala b/gluten-delta/src/main/scala/org/apache/gluten/execution/DeltaScanTransformer.scala index 1cd735cf7ee7d..31e6c6940cd97 100644 --- a/gluten-delta/src/main/scala/org/apache/gluten/execution/DeltaScanTransformer.scala +++ b/gluten-delta/src/main/scala/org/apache/gluten/execution/DeltaScanTransformer.scala @@ -57,7 +57,7 @@ case class DeltaScanTransformer( _.name == "__delta_internal_is_row_deleted") || requiredSchema.fields.exists( _.name == "__delta_internal_row_index") ) { - return ValidationResult.notOk(s"Deletion vector is not supported in native.") + return ValidationResult.failed(s"Deletion vector is not supported in native.") } super.doValidateInternal() diff --git a/gluten-ras/common/src/main/scala/org/apache/gluten/ras/memo/ForwardMemoTable.scala b/gluten-ras/common/src/main/scala/org/apache/gluten/ras/memo/ForwardMemoTable.scala index dd4033866f861..b99fb280fe5a5 100644 --- a/gluten-ras/common/src/main/scala/org/apache/gluten/ras/memo/ForwardMemoTable.scala +++ b/gluten-ras/common/src/main/scala/org/apache/gluten/ras/memo/ForwardMemoTable.scala @@ -155,7 +155,7 @@ class ForwardMemoTable[T <: AnyRef] private (override val ras: Ras[T]) groupBuffer(id) } - override def allClusterKeys(): Seq[RasClusterKey] = clusterKeyBuffer + override def allClusterKeys(): Seq[RasClusterKey] = clusterKeyBuffer.toSeq override def allGroupIds(): Seq[Int] = { val from = -dummyGroupBuffer.size diff --git a/gluten-ras/common/src/main/scala/org/apache/gluten/ras/path/PathMask.scala b/gluten-ras/common/src/main/scala/org/apache/gluten/ras/path/PathMask.scala index a8caded407b16..c7dd3d2c0718e 100644 --- a/gluten-ras/common/src/main/scala/org/apache/gluten/ras/path/PathMask.scala +++ b/gluten-ras/common/src/main/scala/org/apache/gluten/ras/path/PathMask.scala @@ -96,7 +96,7 @@ object PathMask { return None } - PathMask(buffer) + PathMask(buffer.toSeq) } Some(out) @@ -168,7 +168,7 @@ object PathMask { dfs(0, 0) - PathMask(buffer) + PathMask(buffer.toSeq) } // Return the sub-mask whose root node is the node at the input index diff --git a/gluten-ras/common/src/test/scala/org/apache/gluten/ras/mock/MockMemoState.scala b/gluten-ras/common/src/test/scala/org/apache/gluten/ras/mock/MockMemoState.scala index 37d66e2bd7031..1c8458af3c61e 100644 --- a/gluten-ras/common/src/test/scala/org/apache/gluten/ras/mock/MockMemoState.scala +++ b/gluten-ras/common/src/test/scala/org/apache/gluten/ras/mock/MockMemoState.scala @@ -102,7 +102,7 @@ object MockMemoState { nodeBuffer ++= nodes } - override def nodes(): Seq[CanonicalNode[T]] = nodeBuffer + override def nodes(): Seq[CanonicalNode[T]] = nodeBuffer.toSeq } object MockMutableCluster { @@ -153,7 +153,7 @@ object MockMemoState { group } - def allGroups(): Seq[MockMutableGroup[T]] = groupBuffer + def allGroups(): Seq[MockMutableGroup[T]] = groupBuffer.toSeq } object Factory { diff --git a/gluten-ras/pom.xml b/gluten-ras/pom.xml index e2e8fccb22001..973af760fa87f 100644 --- a/gluten-ras/pom.xml +++ b/gluten-ras/pom.xml @@ -32,7 +32,7 @@ org.scalacheck scalacheck_${scala.binary.version} - 1.13.5 + 1.17.0 test @@ -48,13 +48,13 @@ org.scalatestplus - scalatestplus-mockito_2.12 + scalatestplus-mockito_${scala.binary.version} 1.0.0-M2 test org.scalatestplus - scalatestplus-scalacheck_2.12 + scalatestplus-scalacheck_${scala.binary.version} 3.1.0.0-RC2 test diff --git a/gluten-uniffle/velox/src/main/java/org/apache/spark/shuffle/writer/VeloxUniffleColumnarShuffleWriter.java b/gluten-uniffle/velox/src/main/java/org/apache/spark/shuffle/writer/VeloxUniffleColumnarShuffleWriter.java index bd205ba7a4695..ca5b3ad9529f8 100644 --- a/gluten-uniffle/velox/src/main/java/org/apache/spark/shuffle/writer/VeloxUniffleColumnarShuffleWriter.java +++ b/gluten-uniffle/velox/src/main/java/org/apache/spark/shuffle/writer/VeloxUniffleColumnarShuffleWriter.java @@ -165,13 +165,6 @@ public long spill(MemoryTarget self, Spiller.Phase phase, long size) { if (!Spillers.PHASE_SET_SPILL_ONLY.contains(phase)) { return 0L; } - if (nativeShuffleWriter == -1) { - throw new IllegalStateException( - "Fatal: spill() called before a shuffle shuffle writer " - + "evaluator is created. This behavior should be" - + "optimized by moving memory " - + "allocations from make() to split()"); - } LOG.info("Gluten shuffle writer: Trying to push {} bytes of data", size); long pushed = jniWrapper.nativeEvict(nativeShuffleWriter, size, false); LOG.info("Gluten shuffle writer: Pushed {} / {} bytes of data", pushed, size); diff --git a/gluten-ut/common/src/test/scala/org/apache/spark/sql/GlutenTestsTrait.scala b/gluten-ut/common/src/test/scala/org/apache/spark/sql/GlutenTestsTrait.scala index ee765ed360991..5df9d007193ef 100644 --- a/gluten-ut/common/src/test/scala/org/apache/spark/sql/GlutenTestsTrait.scala +++ b/gluten-ut/common/src/test/scala/org/apache/spark/sql/GlutenTestsTrait.scala @@ -360,6 +360,6 @@ trait GlutenTestsTrait extends GlutenTestsCommonTrait { } _spark.internalCreateDataFrame( _spark.sparkContext.parallelize(Seq(inputRow)), - StructType(structFileSeq)) + StructType(structFileSeq.toSeq)) } } diff --git a/gluten-ut/pom.xml b/gluten-ut/pom.xml index 79afa94c8e325..1e474042d0fa2 100644 --- a/gluten-ut/pom.xml +++ b/gluten-ut/pom.xml @@ -98,7 +98,7 @@ org.scalacheck scalacheck_${scala.binary.version} - 1.13.5 + 1.17.0 test @@ -145,13 +145,13 @@ org.scalatestplus - scalatestplus-mockito_2.12 + scalatestplus-mockito_${scala.binary.version} 1.0.0-M2 test org.scalatestplus - scalatestplus-scalacheck_2.12 + scalatestplus-scalacheck_${scala.binary.version} 3.1.0.0-RC2 test diff --git a/gluten-ut/spark32/src/test/resources/sql-tests/inputs/misc-functions.sql b/gluten-ut/spark32/src/test/resources/sql-tests/inputs/misc-functions.sql new file mode 100644 index 0000000000000..907ff33000d8e --- /dev/null +++ b/gluten-ut/spark32/src/test/resources/sql-tests/inputs/misc-functions.sql @@ -0,0 +1,22 @@ +-- test for misc functions + +-- typeof +select typeof(null); +select typeof(true); +select typeof(1Y), typeof(1S), typeof(1), typeof(1L); +select typeof(cast(1.0 as float)), typeof(1.0D), typeof(1.2); +select typeof(date '1986-05-23'), typeof(timestamp '1986-05-23'), typeof(interval '23 days'); +select typeof(x'ABCD'), typeof('SPARK'); +select typeof(array(1, 2)), typeof(map(1, 2)), typeof(named_struct('a', 1, 'b', 'spark')); + +-- Spark-32793: Rewrite AssertTrue with RaiseError +SELECT assert_true(true), assert_true(boolean(1)); +SELECT assert_true(false); +SELECT assert_true(boolean(0)); +SELECT assert_true(null); +SELECT assert_true(boolean(null)); +SELECT assert_true(false, 'custom error message'); + +CREATE TEMPORARY VIEW tbl_misc AS SELECT * FROM (VALUES (1), (8), (2)) AS T(v); +SELECT raise_error('error message'); +SELECT if(v > 5, raise_error('too big: ' || v), v + 1) FROM tbl_misc; diff --git a/gluten-ut/spark32/src/test/resources/sql-tests/results/misc-functions.sql.out b/gluten-ut/spark32/src/test/resources/sql-tests/results/misc-functions.sql.out new file mode 100644 index 0000000000000..6985233c33187 --- /dev/null +++ b/gluten-ut/spark32/src/test/resources/sql-tests/results/misc-functions.sql.out @@ -0,0 +1,137 @@ +-- Automatically generated by SQLQueryTestSuite +-- Number of queries: 16 + + +-- !query +select typeof(null) +-- !query schema +struct +-- !query output +void + + +-- !query +select typeof(true) +-- !query schema +struct +-- !query output +boolean + + +-- !query +select typeof(1Y), typeof(1S), typeof(1), typeof(1L) +-- !query schema +struct +-- !query output +tinyint smallint int bigint + + +-- !query +select typeof(cast(1.0 as float)), typeof(1.0D), typeof(1.2) +-- !query schema +struct +-- !query output +float double decimal(2,1) + + +-- !query +select typeof(date '1986-05-23'), typeof(timestamp '1986-05-23'), typeof(interval '23 days') +-- !query schema +struct +-- !query output +date timestamp interval day + + +-- !query +select typeof(x'ABCD'), typeof('SPARK') +-- !query schema +struct +-- !query output +binary string + + +-- !query +select typeof(array(1, 2)), typeof(map(1, 2)), typeof(named_struct('a', 1, 'b', 'spark')) +-- !query schema +struct +-- !query output +array map struct + + +-- !query +SELECT assert_true(true), assert_true(boolean(1)) +-- !query schema +struct +-- !query output +NULL NULL + + +-- !query +SELECT assert_true(false) +-- !query schema +struct<> +-- !query output +org.apache.gluten.exception.GlutenException +'false' is not true! + + +-- !query +SELECT assert_true(boolean(0)) +-- !query schema +struct<> +-- !query output +org.apache.gluten.exception.GlutenException +'cast(0 as boolean)' is not true! + + +-- !query +SELECT assert_true(null) +-- !query schema +struct<> +-- !query output +org.apache.gluten.exception.GlutenException +'null' is not true! + + +-- !query +SELECT assert_true(boolean(null)) +-- !query schema +struct<> +-- !query output +org.apache.gluten.exception.GlutenException +'cast(null as boolean)' is not true! + + +-- !query +SELECT assert_true(false, 'custom error message') +-- !query schema +struct<> +-- !query output +org.apache.gluten.exception.GlutenException +custom error message + + +-- !query +CREATE TEMPORARY VIEW tbl_misc AS SELECT * FROM (VALUES (1), (8), (2)) AS T(v) +-- !query schema +struct<> +-- !query output + + + +-- !query +SELECT raise_error('error message') +-- !query schema +struct<> +-- !query output +org.apache.gluten.exception.GlutenException +error message + + +-- !query +SELECT if(v > 5, raise_error('too big: ' || v), v + 1) FROM tbl_misc +-- !query schema +struct<> +-- !query output +org.apache.gluten.exception.GlutenException +too big: 8 diff --git a/gluten-ut/spark32/src/test/scala/org/apache/gluten/utils/clickhouse/ClickHouseTestSettings.scala b/gluten-ut/spark32/src/test/scala/org/apache/gluten/utils/clickhouse/ClickHouseTestSettings.scala index 60df3ee37f669..8fd68d5170b93 100644 --- a/gluten-ut/spark32/src/test/scala/org/apache/gluten/utils/clickhouse/ClickHouseTestSettings.scala +++ b/gluten-ut/spark32/src/test/scala/org/apache/gluten/utils/clickhouse/ClickHouseTestSettings.scala @@ -665,7 +665,6 @@ class ClickHouseTestSettings extends BackendTestSettings { .exclude("Map Concat") .exclude("MapFromEntries") .exclude("ArraysOverlap") - .exclude("ArrayJoin") .exclude("ArraysZip") .exclude("Sequence of numbers") .exclude("Sequence of timestamps") @@ -850,6 +849,9 @@ class ClickHouseTestSettings extends BackendTestSettings { .exclude("atan2") .exclude("round/bround") .exclude("SPARK-37388: width_bucket") + .exclude("shift left") + .exclude("shift right") + .exclude("shift right unsigned") enableSuite[GlutenMiscExpressionsSuite] enableSuite[GlutenNondeterministicSuite] .exclude("MonotonicallyIncreasingID") diff --git a/gluten-ut/spark32/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala b/gluten-ut/spark32/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala index a17f72de31214..d5e8df63869ef 100644 --- a/gluten-ut/spark32/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala +++ b/gluten-ut/spark32/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala @@ -296,6 +296,11 @@ class VeloxTestSettings extends BackendTestSettings { .exclude("sliding range between with aggregation") .exclude("store and retrieve column stats in different time zones") enableSuite[GlutenColumnExpressionSuite] + // Velox raise_error('errMsg') throws a velox_user_error exception with the message 'errMsg'. + // The final caught Spark exception's getCause().getMessage() contains 'errMsg' but does not + // equal 'errMsg' exactly. The following two tests will be skipped and overridden in Gluten. + .exclude("raise_error") + .exclude("assert_true") enableSuite[GlutenDataFrameImplicitsSuite] enableSuite[GlutenGeneratorFunctionSuite] enableSuite[GlutenDataFrameTimeWindowingSuite] diff --git a/gluten-ut/spark32/src/test/scala/org/apache/spark/sql/GlutenColumnExpressionSuite.scala b/gluten-ut/spark32/src/test/scala/org/apache/spark/sql/GlutenColumnExpressionSuite.scala index a4b530e637af9..437cef29215ce 100644 --- a/gluten-ut/spark32/src/test/scala/org/apache/spark/sql/GlutenColumnExpressionSuite.scala +++ b/gluten-ut/spark32/src/test/scala/org/apache/spark/sql/GlutenColumnExpressionSuite.scala @@ -16,40 +16,83 @@ */ package org.apache.spark.sql +import org.apache.spark.SparkException import org.apache.spark.sql.execution.ProjectExec -import org.apache.spark.sql.functions.{expr, input_file_name} -import org.apache.spark.sql.types.{ArrayType, IntegerType, StringType, StructField, StructType} +import org.apache.spark.sql.functions.{assert_true, expr, input_file_name, lit, raise_error} class GlutenColumnExpressionSuite extends ColumnExpressionSuite with GlutenSQLTestsTrait { - testGluten("input_file_name with scan is fallback") { - withTempPath { - dir => - val rawData = Seq( - Row(1, "Alice", Seq(Row(Seq(1, 2, 3)))), - Row(2, "Bob", Seq(Row(Seq(4, 5)))), - Row(3, "Charlie", Seq(Row(Seq(6, 7, 8, 9)))) - ) - val schema = StructType( - Array( - StructField("id", IntegerType, nullable = false), - StructField("name", StringType, nullable = false), - StructField( - "nested_column", - ArrayType( - StructType(Array( - StructField("array_in_struct", ArrayType(IntegerType), nullable = true) - ))), - nullable = true) - )) - val data: DataFrame = spark.createDataFrame(sparkContext.parallelize(rawData), schema) - data.write.parquet(dir.getCanonicalPath) - - val q = - spark.read.parquet(dir.getCanonicalPath).select(input_file_name(), expr("nested_column")) - val firstRow = q.head() - assert(firstRow.getString(0).contains(dir.toURI.getPath)) - val project = q.queryExecution.executedPlan.collect { case p: ProjectExec => p } - assert(project.size == 1) + import testImplicits._ + testGluten("raise_error") { + val strDf = Seq(("hello")).toDF("a") + + val e1 = intercept[SparkException] { + strDf.select(raise_error(lit(null.asInstanceOf[String]))).collect() + } + assert(e1.getCause.isInstanceOf[RuntimeException]) + + val e2 = intercept[SparkException] { + strDf.select(raise_error($"a")).collect() + } + assert(e2.getCause.isInstanceOf[RuntimeException]) + assert(e2.getCause.getMessage contains "hello") + } + + testGluten("assert_true") { + // assert_true(condition, errMsgCol) + val booleanDf = Seq((true), (false)).toDF("cond") + checkAnswer( + booleanDf.filter("cond = true").select(assert_true($"cond")), + Row(null) :: Nil + ) + val e1 = intercept[SparkException] { + booleanDf.select(assert_true($"cond", lit(null.asInstanceOf[String]))).collect() + } + assert(e1.getCause.isInstanceOf[RuntimeException]) + + val nullDf = Seq(("first row", None), ("second row", Some(true))).toDF("n", "cond") + checkAnswer( + nullDf.filter("cond = true").select(assert_true($"cond", $"cond")), + Row(null) :: Nil + ) + val e2 = intercept[SparkException] { + nullDf.select(assert_true($"cond", $"n")).collect() + } + assert(e2.getCause.isInstanceOf[RuntimeException]) + assert(e2.getCause.getMessage contains "first row") + + // assert_true(condition) + val intDf = Seq((0, 1)).toDF("a", "b") + checkAnswer(intDf.select(assert_true($"a" < $"b")), Row(null) :: Nil) + val e3 = intercept[SparkException] { + intDf.select(assert_true($"a" > $"b")).collect() + } + assert(e3.getCause.isInstanceOf[RuntimeException]) + assert(e3.getCause.getMessage contains "'('a > 'b)' is not true!") + } + + testGluten( + "input_file_name, input_file_block_start and input_file_block_length " + + "should fall back if scan falls back") { + withSQLConf(("spark.gluten.sql.columnar.filescan", "false")) { + withTempPath { + dir => + val data = sparkContext.parallelize(0 to 10).toDF("id") + data.write.parquet(dir.getCanonicalPath) + + val q = + spark.read + .parquet(dir.getCanonicalPath) + .select( + input_file_name(), + expr("input_file_block_start()"), + expr("input_file_block_length()")) + val firstRow = q.head() + assert(firstRow.getString(0).contains(dir.toURI.getPath)) + assert(firstRow.getLong(1) == 0) + assert(firstRow.getLong(2) > 0) + val project = q.queryExecution.executedPlan.collect { case p: ProjectExec => p } + assert(project.size == 1) + } } } } diff --git a/gluten-ut/spark32/src/test/scala/org/apache/spark/sql/GlutenSQLQueryTestSuite.scala b/gluten-ut/spark32/src/test/scala/org/apache/spark/sql/GlutenSQLQueryTestSuite.scala index 4b75ce13c0678..4fbd89bda05c7 100644 --- a/gluten-ut/spark32/src/test/scala/org/apache/spark/sql/GlutenSQLQueryTestSuite.scala +++ b/gluten-ut/spark32/src/test/scala/org/apache/spark/sql/GlutenSQLQueryTestSuite.scala @@ -17,9 +17,10 @@ package org.apache.spark.sql import org.apache.gluten.GlutenConfig +import org.apache.gluten.exception.GlutenException import org.apache.gluten.utils.{BackendTestSettings, BackendTestUtils, SystemParameters} -import org.apache.spark.SparkConf +import org.apache.spark.{SparkConf, SparkException} import org.apache.spark.sql.catalyst.expressions.codegen.CodeGenerator import org.apache.spark.sql.catalyst.plans.SQLHelper import org.apache.spark.sql.catalyst.rules.RuleExecutor @@ -39,6 +40,7 @@ import java.util.Locale import scala.collection.mutable.ArrayBuffer import scala.sys.process.{Process, ProcessLogger} import scala.util.Try +import scala.util.control.NonFatal /** * End-to-end test cases for SQL queries. @@ -761,4 +763,45 @@ class GlutenSQLQueryTestSuite super.afterAll() } } + + /** + * This method handles exceptions occurred during query execution as they may need special care to + * become comparable to the expected output. + * + * @param result + * a function that returns a pair of schema and output + */ + override protected def handleExceptions( + result: => (String, Seq[String])): (String, Seq[String]) = { + try { + result + } catch { + case a: AnalysisException => + // Do not output the logical plan tree which contains expression IDs. + // Also implement a crude way of masking expression IDs in the error message + // with a generic pattern "###". + val msg = if (a.plan.nonEmpty) a.getSimpleMessage else a.getMessage + (emptySchema, Seq(a.getClass.getName, msg.replaceAll("#\\d+", "#x"))) + case s: SparkException if s.getCause != null => + // For a runtime exception, it is hard to match because its message contains + // information of stage, task ID, etc. + // To make result matching simpler, here we match the cause of the exception if it exists. + s.getCause match { + case e: GlutenException => + val reasonPattern = "Reason: (.*)".r + val reason = reasonPattern.findFirstMatchIn(e.getMessage).map(_.group(1)) + + reason match { + case Some(r) => + (emptySchema, Seq(e.getClass.getName, r)) + case None => (emptySchema, Seq()) + } + case cause => + (emptySchema, Seq(cause.getClass.getName, cause.getMessage)) + } + case NonFatal(e) => + // If there is an exception, put the exception class followed by the message. + (emptySchema, Seq(e.getClass.getName, e.getMessage)) + } + } } diff --git a/gluten-ut/spark32/src/test/scala/org/apache/spark/sql/extension/CustomerColumnarPreRules.scala b/gluten-ut/spark32/src/test/scala/org/apache/spark/sql/extension/CustomerColumnarPreRules.scala index fe37da206a561..2ee1573ea07ab 100644 --- a/gluten-ut/spark32/src/test/scala/org/apache/spark/sql/extension/CustomerColumnarPreRules.scala +++ b/gluten-ut/spark32/src/test/scala/org/apache/spark/sql/extension/CustomerColumnarPreRules.scala @@ -35,7 +35,7 @@ case class CustomerColumnarPreRules(session: SparkSession) extends Rule[SparkPla fileSourceScan.tableIdentifier, fileSourceScan.disableBucketedScan ) - if (transformer.doValidate().isValid) { + if (transformer.doValidate().ok()) { transformer } else { plan diff --git a/gluten-ut/spark33/src/test/resources/sql-tests/inputs/misc-functions.sql b/gluten-ut/spark33/src/test/resources/sql-tests/inputs/misc-functions.sql new file mode 100644 index 0000000000000..907ff33000d8e --- /dev/null +++ b/gluten-ut/spark33/src/test/resources/sql-tests/inputs/misc-functions.sql @@ -0,0 +1,22 @@ +-- test for misc functions + +-- typeof +select typeof(null); +select typeof(true); +select typeof(1Y), typeof(1S), typeof(1), typeof(1L); +select typeof(cast(1.0 as float)), typeof(1.0D), typeof(1.2); +select typeof(date '1986-05-23'), typeof(timestamp '1986-05-23'), typeof(interval '23 days'); +select typeof(x'ABCD'), typeof('SPARK'); +select typeof(array(1, 2)), typeof(map(1, 2)), typeof(named_struct('a', 1, 'b', 'spark')); + +-- Spark-32793: Rewrite AssertTrue with RaiseError +SELECT assert_true(true), assert_true(boolean(1)); +SELECT assert_true(false); +SELECT assert_true(boolean(0)); +SELECT assert_true(null); +SELECT assert_true(boolean(null)); +SELECT assert_true(false, 'custom error message'); + +CREATE TEMPORARY VIEW tbl_misc AS SELECT * FROM (VALUES (1), (8), (2)) AS T(v); +SELECT raise_error('error message'); +SELECT if(v > 5, raise_error('too big: ' || v), v + 1) FROM tbl_misc; diff --git a/gluten-ut/spark33/src/test/resources/sql-tests/results/misc-functions.sql.out b/gluten-ut/spark33/src/test/resources/sql-tests/results/misc-functions.sql.out new file mode 100644 index 0000000000000..6985233c33187 --- /dev/null +++ b/gluten-ut/spark33/src/test/resources/sql-tests/results/misc-functions.sql.out @@ -0,0 +1,137 @@ +-- Automatically generated by SQLQueryTestSuite +-- Number of queries: 16 + + +-- !query +select typeof(null) +-- !query schema +struct +-- !query output +void + + +-- !query +select typeof(true) +-- !query schema +struct +-- !query output +boolean + + +-- !query +select typeof(1Y), typeof(1S), typeof(1), typeof(1L) +-- !query schema +struct +-- !query output +tinyint smallint int bigint + + +-- !query +select typeof(cast(1.0 as float)), typeof(1.0D), typeof(1.2) +-- !query schema +struct +-- !query output +float double decimal(2,1) + + +-- !query +select typeof(date '1986-05-23'), typeof(timestamp '1986-05-23'), typeof(interval '23 days') +-- !query schema +struct +-- !query output +date timestamp interval day + + +-- !query +select typeof(x'ABCD'), typeof('SPARK') +-- !query schema +struct +-- !query output +binary string + + +-- !query +select typeof(array(1, 2)), typeof(map(1, 2)), typeof(named_struct('a', 1, 'b', 'spark')) +-- !query schema +struct +-- !query output +array map struct + + +-- !query +SELECT assert_true(true), assert_true(boolean(1)) +-- !query schema +struct +-- !query output +NULL NULL + + +-- !query +SELECT assert_true(false) +-- !query schema +struct<> +-- !query output +org.apache.gluten.exception.GlutenException +'false' is not true! + + +-- !query +SELECT assert_true(boolean(0)) +-- !query schema +struct<> +-- !query output +org.apache.gluten.exception.GlutenException +'cast(0 as boolean)' is not true! + + +-- !query +SELECT assert_true(null) +-- !query schema +struct<> +-- !query output +org.apache.gluten.exception.GlutenException +'null' is not true! + + +-- !query +SELECT assert_true(boolean(null)) +-- !query schema +struct<> +-- !query output +org.apache.gluten.exception.GlutenException +'cast(null as boolean)' is not true! + + +-- !query +SELECT assert_true(false, 'custom error message') +-- !query schema +struct<> +-- !query output +org.apache.gluten.exception.GlutenException +custom error message + + +-- !query +CREATE TEMPORARY VIEW tbl_misc AS SELECT * FROM (VALUES (1), (8), (2)) AS T(v) +-- !query schema +struct<> +-- !query output + + + +-- !query +SELECT raise_error('error message') +-- !query schema +struct<> +-- !query output +org.apache.gluten.exception.GlutenException +error message + + +-- !query +SELECT if(v > 5, raise_error('too big: ' || v), v + 1) FROM tbl_misc +-- !query schema +struct<> +-- !query output +org.apache.gluten.exception.GlutenException +too big: 8 diff --git a/gluten-ut/spark33/src/test/scala/org/apache/gluten/utils/clickhouse/ClickHouseTestSettings.scala b/gluten-ut/spark33/src/test/scala/org/apache/gluten/utils/clickhouse/ClickHouseTestSettings.scala index df9f49bfc72ed..f69598adf5552 100644 --- a/gluten-ut/spark33/src/test/scala/org/apache/gluten/utils/clickhouse/ClickHouseTestSettings.scala +++ b/gluten-ut/spark33/src/test/scala/org/apache/gluten/utils/clickhouse/ClickHouseTestSettings.scala @@ -656,7 +656,6 @@ class ClickHouseTestSettings extends BackendTestSettings { .exclude("Map Concat") .exclude("MapFromEntries") .exclude("ArraysOverlap") - .exclude("ArrayJoin") .exclude("ArraysZip") .exclude("Sequence of numbers") .exclude("Sequence of timestamps") @@ -809,6 +808,9 @@ class ClickHouseTestSettings extends BackendTestSettings { .exclude("SPARK-35926: Support YearMonthIntervalType in width-bucket function") .exclude("SPARK-35925: Support DayTimeIntervalType in width-bucket function") .exclude("SPARK-37388: width_bucket") + .exclude("shift left") + .exclude("shift right") + .exclude("shift right unsigned") enableSuite[GlutenMiscExpressionsSuite] enableSuite[GlutenNondeterministicSuite] .exclude("MonotonicallyIncreasingID") diff --git a/gluten-ut/spark33/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala b/gluten-ut/spark33/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala index ae3e7c7b8e9d7..fcc2bd3432623 100644 --- a/gluten-ut/spark33/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala +++ b/gluten-ut/spark33/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala @@ -950,6 +950,11 @@ class VeloxTestSettings extends BackendTestSettings { enableSuite[GlutenFileSourceCharVarcharTestSuite] enableSuite[GlutenDSV2CharVarcharTestSuite] enableSuite[GlutenColumnExpressionSuite] + // Velox raise_error('errMsg') throws a velox_user_error exception with the message 'errMsg'. + // The final caught Spark exception's getCause().getMessage() contains 'errMsg' but does not + // equal 'errMsg' exactly. The following two tests will be skipped and overridden in Gluten. + .exclude("raise_error") + .exclude("assert_true") enableSuite[GlutenComplexTypeSuite] enableSuite[GlutenConfigBehaviorSuite] // Will be fixed by cleaning up ColumnarShuffleExchangeExec. diff --git a/gluten-ut/spark33/src/test/scala/org/apache/spark/sql/GlutenColumnExpressionSuite.scala b/gluten-ut/spark33/src/test/scala/org/apache/spark/sql/GlutenColumnExpressionSuite.scala index a4b530e637af9..437cef29215ce 100644 --- a/gluten-ut/spark33/src/test/scala/org/apache/spark/sql/GlutenColumnExpressionSuite.scala +++ b/gluten-ut/spark33/src/test/scala/org/apache/spark/sql/GlutenColumnExpressionSuite.scala @@ -16,40 +16,83 @@ */ package org.apache.spark.sql +import org.apache.spark.SparkException import org.apache.spark.sql.execution.ProjectExec -import org.apache.spark.sql.functions.{expr, input_file_name} -import org.apache.spark.sql.types.{ArrayType, IntegerType, StringType, StructField, StructType} +import org.apache.spark.sql.functions.{assert_true, expr, input_file_name, lit, raise_error} class GlutenColumnExpressionSuite extends ColumnExpressionSuite with GlutenSQLTestsTrait { - testGluten("input_file_name with scan is fallback") { - withTempPath { - dir => - val rawData = Seq( - Row(1, "Alice", Seq(Row(Seq(1, 2, 3)))), - Row(2, "Bob", Seq(Row(Seq(4, 5)))), - Row(3, "Charlie", Seq(Row(Seq(6, 7, 8, 9)))) - ) - val schema = StructType( - Array( - StructField("id", IntegerType, nullable = false), - StructField("name", StringType, nullable = false), - StructField( - "nested_column", - ArrayType( - StructType(Array( - StructField("array_in_struct", ArrayType(IntegerType), nullable = true) - ))), - nullable = true) - )) - val data: DataFrame = spark.createDataFrame(sparkContext.parallelize(rawData), schema) - data.write.parquet(dir.getCanonicalPath) - - val q = - spark.read.parquet(dir.getCanonicalPath).select(input_file_name(), expr("nested_column")) - val firstRow = q.head() - assert(firstRow.getString(0).contains(dir.toURI.getPath)) - val project = q.queryExecution.executedPlan.collect { case p: ProjectExec => p } - assert(project.size == 1) + import testImplicits._ + testGluten("raise_error") { + val strDf = Seq(("hello")).toDF("a") + + val e1 = intercept[SparkException] { + strDf.select(raise_error(lit(null.asInstanceOf[String]))).collect() + } + assert(e1.getCause.isInstanceOf[RuntimeException]) + + val e2 = intercept[SparkException] { + strDf.select(raise_error($"a")).collect() + } + assert(e2.getCause.isInstanceOf[RuntimeException]) + assert(e2.getCause.getMessage contains "hello") + } + + testGluten("assert_true") { + // assert_true(condition, errMsgCol) + val booleanDf = Seq((true), (false)).toDF("cond") + checkAnswer( + booleanDf.filter("cond = true").select(assert_true($"cond")), + Row(null) :: Nil + ) + val e1 = intercept[SparkException] { + booleanDf.select(assert_true($"cond", lit(null.asInstanceOf[String]))).collect() + } + assert(e1.getCause.isInstanceOf[RuntimeException]) + + val nullDf = Seq(("first row", None), ("second row", Some(true))).toDF("n", "cond") + checkAnswer( + nullDf.filter("cond = true").select(assert_true($"cond", $"cond")), + Row(null) :: Nil + ) + val e2 = intercept[SparkException] { + nullDf.select(assert_true($"cond", $"n")).collect() + } + assert(e2.getCause.isInstanceOf[RuntimeException]) + assert(e2.getCause.getMessage contains "first row") + + // assert_true(condition) + val intDf = Seq((0, 1)).toDF("a", "b") + checkAnswer(intDf.select(assert_true($"a" < $"b")), Row(null) :: Nil) + val e3 = intercept[SparkException] { + intDf.select(assert_true($"a" > $"b")).collect() + } + assert(e3.getCause.isInstanceOf[RuntimeException]) + assert(e3.getCause.getMessage contains "'('a > 'b)' is not true!") + } + + testGluten( + "input_file_name, input_file_block_start and input_file_block_length " + + "should fall back if scan falls back") { + withSQLConf(("spark.gluten.sql.columnar.filescan", "false")) { + withTempPath { + dir => + val data = sparkContext.parallelize(0 to 10).toDF("id") + data.write.parquet(dir.getCanonicalPath) + + val q = + spark.read + .parquet(dir.getCanonicalPath) + .select( + input_file_name(), + expr("input_file_block_start()"), + expr("input_file_block_length()")) + val firstRow = q.head() + assert(firstRow.getString(0).contains(dir.toURI.getPath)) + assert(firstRow.getLong(1) == 0) + assert(firstRow.getLong(2) > 0) + val project = q.queryExecution.executedPlan.collect { case p: ProjectExec => p } + assert(project.size == 1) + } } } } diff --git a/gluten-ut/spark33/src/test/scala/org/apache/spark/sql/GlutenSQLQueryTestSuite.scala b/gluten-ut/spark33/src/test/scala/org/apache/spark/sql/GlutenSQLQueryTestSuite.scala index 4536aa54057c0..6e2a9efa87c07 100644 --- a/gluten-ut/spark33/src/test/scala/org/apache/spark/sql/GlutenSQLQueryTestSuite.scala +++ b/gluten-ut/spark33/src/test/scala/org/apache/spark/sql/GlutenSQLQueryTestSuite.scala @@ -17,9 +17,10 @@ package org.apache.spark.sql import org.apache.gluten.GlutenConfig +import org.apache.gluten.exception.GlutenException import org.apache.gluten.utils.{BackendTestSettings, BackendTestUtils, SystemParameters} -import org.apache.spark.SparkConf +import org.apache.spark.{SparkConf, SparkException} import org.apache.spark.sql.catalyst.expressions.codegen.CodeGenerator import org.apache.spark.sql.catalyst.plans.SQLHelper import org.apache.spark.sql.catalyst.rules.RuleExecutor @@ -39,6 +40,7 @@ import java.util.Locale import scala.collection.mutable.ArrayBuffer import scala.sys.process.{Process, ProcessLogger} import scala.util.Try +import scala.util.control.NonFatal /** * End-to-end test cases for SQL queries. @@ -761,4 +763,45 @@ class GlutenSQLQueryTestSuite super.afterAll() } } + + /** + * This method handles exceptions occurred during query execution as they may need special care to + * become comparable to the expected output. + * + * @param result + * a function that returns a pair of schema and output + */ + override protected def handleExceptions( + result: => (String, Seq[String])): (String, Seq[String]) = { + try { + result + } catch { + case a: AnalysisException => + // Do not output the logical plan tree which contains expression IDs. + // Also implement a crude way of masking expression IDs in the error message + // with a generic pattern "###". + val msg = if (a.plan.nonEmpty) a.getSimpleMessage else a.getMessage + (emptySchema, Seq(a.getClass.getName, msg.replaceAll("#\\d+", "#x"))) + case s: SparkException if s.getCause != null => + // For a runtime exception, it is hard to match because its message contains + // information of stage, task ID, etc. + // To make result matching simpler, here we match the cause of the exception if it exists. + val cause = s.getCause + cause match { + case e: GlutenException => + val reasonPattern = "Reason: (.*)".r + val reason = reasonPattern.findFirstMatchIn(e.getMessage).map(_.group(1)) + + reason match { + case Some(r) => + (emptySchema, Seq(e.getClass.getName, r)) + case None => (emptySchema, Seq()) + } + case _ => (emptySchema, Seq(cause.getClass.getName, cause.getMessage)) + } + case NonFatal(e) => + // If there is an exception, put the exception class followed by the message. + (emptySchema, Seq(e.getClass.getName, e.getMessage)) + } + } } diff --git a/gluten-ut/spark33/src/test/scala/org/apache/spark/sql/execution/FallbackStrategiesSuite.scala b/gluten-ut/spark33/src/test/scala/org/apache/spark/sql/execution/FallbackStrategiesSuite.scala index fff883d49e86f..54d7596b602c5 100644 --- a/gluten-ut/spark33/src/test/scala/org/apache/spark/sql/execution/FallbackStrategiesSuite.scala +++ b/gluten-ut/spark33/src/test/scala/org/apache/spark/sql/execution/FallbackStrategiesSuite.scala @@ -19,7 +19,7 @@ package org.apache.spark.sql.execution import org.apache.gluten.backendsapi.BackendsApiManager import org.apache.gluten.execution.BasicScanExecTransformer import org.apache.gluten.extension.GlutenPlan -import org.apache.gluten.extension.columnar.{FallbackEmptySchemaRelation, TRANSFORM_UNSUPPORTED, TransformHints} +import org.apache.gluten.extension.columnar.{FallbackEmptySchemaRelation, FallbackTags} import org.apache.gluten.extension.columnar.heuristic.HeuristicApplier import org.apache.gluten.extension.columnar.transition.InsertTransitions import org.apache.gluten.utils.QueryPlanSelector @@ -124,17 +124,16 @@ class FallbackStrategiesSuite extends GlutenSQLTestsTrait { testGluten("Tag not transformable more than once") { val originalPlan = UnaryOp1(LeafOp(supportsColumnar = true)) - TransformHints.tag(originalPlan, TRANSFORM_UNSUPPORTED(Some("fake reason"))) + FallbackTags.add(originalPlan, "fake reason") val rule = FallbackEmptySchemaRelation() val newPlan = rule.apply(originalPlan) - val reason = TransformHints.getHint(newPlan).asInstanceOf[TRANSFORM_UNSUPPORTED].reason - assert(reason.isDefined) + val reason = FallbackTags.get(newPlan).reason() if (BackendsApiManager.getSettings.fallbackOnEmptySchema(newPlan)) { assert( - reason.get.contains("fake reason") && - reason.get.contains("at least one of its children has empty output")) + reason.contains("fake reason") && + reason.contains("at least one of its children has empty output")) } else { - assert(reason.get.contains("fake reason")) + assert(reason.contains("fake reason")) } } diff --git a/gluten-ut/spark33/src/test/scala/org/apache/spark/sql/extension/CustomerColumnarPreRules.scala b/gluten-ut/spark33/src/test/scala/org/apache/spark/sql/extension/CustomerColumnarPreRules.scala index fe37da206a561..2ee1573ea07ab 100644 --- a/gluten-ut/spark33/src/test/scala/org/apache/spark/sql/extension/CustomerColumnarPreRules.scala +++ b/gluten-ut/spark33/src/test/scala/org/apache/spark/sql/extension/CustomerColumnarPreRules.scala @@ -35,7 +35,7 @@ case class CustomerColumnarPreRules(session: SparkSession) extends Rule[SparkPla fileSourceScan.tableIdentifier, fileSourceScan.disableBucketedScan ) - if (transformer.doValidate().isValid) { + if (transformer.doValidate().ok()) { transformer } else { plan diff --git a/gluten-ut/spark33/src/test/scala/org/apache/spark/sql/gluten/GlutenFallbackSuite.scala b/gluten-ut/spark33/src/test/scala/org/apache/spark/sql/gluten/GlutenFallbackSuite.scala index 6860d6a129583..e724cf31c6895 100644 --- a/gluten-ut/spark33/src/test/scala/org/apache/spark/sql/gluten/GlutenFallbackSuite.scala +++ b/gluten-ut/spark33/src/test/scala/org/apache/spark/sql/gluten/GlutenFallbackSuite.scala @@ -110,7 +110,7 @@ class GlutenFallbackSuite extends GlutenSQLTestsTrait with AdaptiveSparkPlanHelp execution.get.fallbackNodeToReason.head._2 .contains("FullOuter join is not supported with BroadcastNestedLoopJoin")) } else { - assert(execution.get.numFallbackNodes == 2) + assert(execution.get.numFallbackNodes == 0) } } diff --git a/gluten-ut/spark34/src/test/resources/sql-tests/inputs/misc-functions.sql b/gluten-ut/spark34/src/test/resources/sql-tests/inputs/misc-functions.sql new file mode 100644 index 0000000000000..907ff33000d8e --- /dev/null +++ b/gluten-ut/spark34/src/test/resources/sql-tests/inputs/misc-functions.sql @@ -0,0 +1,22 @@ +-- test for misc functions + +-- typeof +select typeof(null); +select typeof(true); +select typeof(1Y), typeof(1S), typeof(1), typeof(1L); +select typeof(cast(1.0 as float)), typeof(1.0D), typeof(1.2); +select typeof(date '1986-05-23'), typeof(timestamp '1986-05-23'), typeof(interval '23 days'); +select typeof(x'ABCD'), typeof('SPARK'); +select typeof(array(1, 2)), typeof(map(1, 2)), typeof(named_struct('a', 1, 'b', 'spark')); + +-- Spark-32793: Rewrite AssertTrue with RaiseError +SELECT assert_true(true), assert_true(boolean(1)); +SELECT assert_true(false); +SELECT assert_true(boolean(0)); +SELECT assert_true(null); +SELECT assert_true(boolean(null)); +SELECT assert_true(false, 'custom error message'); + +CREATE TEMPORARY VIEW tbl_misc AS SELECT * FROM (VALUES (1), (8), (2)) AS T(v); +SELECT raise_error('error message'); +SELECT if(v > 5, raise_error('too big: ' || v), v + 1) FROM tbl_misc; diff --git a/gluten-ut/spark34/src/test/resources/sql-tests/results/misc-functions.sql.out b/gluten-ut/spark34/src/test/resources/sql-tests/results/misc-functions.sql.out new file mode 100644 index 0000000000000..d6d1289a5adb7 --- /dev/null +++ b/gluten-ut/spark34/src/test/resources/sql-tests/results/misc-functions.sql.out @@ -0,0 +1,134 @@ +-- Automatically generated by SQLQueryTestSuite +-- !query +select typeof(null) +-- !query schema +struct +-- !query output +void + + +-- !query +select typeof(true) +-- !query schema +struct +-- !query output +boolean + + +-- !query +select typeof(1Y), typeof(1S), typeof(1), typeof(1L) +-- !query schema +struct +-- !query output +tinyint smallint int bigint + + +-- !query +select typeof(cast(1.0 as float)), typeof(1.0D), typeof(1.2) +-- !query schema +struct +-- !query output +float double decimal(2,1) + + +-- !query +select typeof(date '1986-05-23'), typeof(timestamp '1986-05-23'), typeof(interval '23 days') +-- !query schema +struct +-- !query output +date timestamp interval day + + +-- !query +select typeof(x'ABCD'), typeof('SPARK') +-- !query schema +struct +-- !query output +binary string + + +-- !query +select typeof(array(1, 2)), typeof(map(1, 2)), typeof(named_struct('a', 1, 'b', 'spark')) +-- !query schema +struct +-- !query output +array map struct + + +-- !query +SELECT assert_true(true), assert_true(boolean(1)) +-- !query schema +struct +-- !query output +NULL NULL + + +-- !query +SELECT assert_true(false) +-- !query schema +struct<> +-- !query output +org.apache.gluten.exception.GlutenException +'false' is not true! + + +-- !query +SELECT assert_true(boolean(0)) +-- !query schema +struct<> +-- !query output +org.apache.gluten.exception.GlutenException +'cast(0 as boolean)' is not true! + + +-- !query +SELECT assert_true(null) +-- !query schema +struct<> +-- !query output +org.apache.gluten.exception.GlutenException +'null' is not true! + + +-- !query +SELECT assert_true(boolean(null)) +-- !query schema +struct<> +-- !query output +org.apache.gluten.exception.GlutenException +'cast(null as boolean)' is not true! + + +-- !query +SELECT assert_true(false, 'custom error message') +-- !query schema +struct<> +-- !query output +org.apache.gluten.exception.GlutenException +custom error message + + +-- !query +CREATE TEMPORARY VIEW tbl_misc AS SELECT * FROM (VALUES (1), (8), (2)) AS T(v) +-- !query schema +struct<> +-- !query output + + + +-- !query +SELECT raise_error('error message') +-- !query schema +struct<> +-- !query output +org.apache.gluten.exception.GlutenException +error message + + +-- !query +SELECT if(v > 5, raise_error('too big: ' || v), v + 1) FROM tbl_misc +-- !query schema +struct<> +-- !query output +org.apache.gluten.exception.GlutenException +too big: 8 diff --git a/gluten-ut/spark34/src/test/scala/org/apache/gluten/utils/clickhouse/ClickHouseTestSettings.scala b/gluten-ut/spark34/src/test/scala/org/apache/gluten/utils/clickhouse/ClickHouseTestSettings.scala index 0dc2cdd89f935..ab288e835b127 100644 --- a/gluten-ut/spark34/src/test/scala/org/apache/gluten/utils/clickhouse/ClickHouseTestSettings.scala +++ b/gluten-ut/spark34/src/test/scala/org/apache/gluten/utils/clickhouse/ClickHouseTestSettings.scala @@ -544,7 +544,6 @@ class ClickHouseTestSettings extends BackendTestSettings { .exclude("Map Concat") .exclude("MapFromEntries") .exclude("ArraysOverlap") - .exclude("ArrayJoin") .exclude("ArraysZip") .exclude("Sequence of numbers") .exclude("Sequence of timestamps") @@ -711,6 +710,9 @@ class ClickHouseTestSettings extends BackendTestSettings { .exclude("SPARK-35926: Support YearMonthIntervalType in width-bucket function") .exclude("SPARK-35925: Support DayTimeIntervalType in width-bucket function") .exclude("SPARK-37388: width_bucket") + .exclude("shift left") + .exclude("shift right") + .exclude("shift right unsigned") enableSuite[GlutenMiscExpressionsSuite] enableSuite[GlutenNondeterministicSuite] .exclude("MonotonicallyIncreasingID") diff --git a/gluten-ut/spark34/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala b/gluten-ut/spark34/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala index 0da19922ffdaf..57346f493945b 100644 --- a/gluten-ut/spark34/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala +++ b/gluten-ut/spark34/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala @@ -955,6 +955,11 @@ class VeloxTestSettings extends BackendTestSettings { enableSuite[GlutenFileSourceCharVarcharTestSuite] enableSuite[GlutenDSV2CharVarcharTestSuite] enableSuite[GlutenColumnExpressionSuite] + // Velox raise_error('errMsg') throws a velox_user_error exception with the message 'errMsg'. + // The final caught Spark exception's getCause().getMessage() contains 'errMsg' but does not + // equal 'errMsg' exactly. The following two tests will be skipped and overridden in Gluten. + .exclude("raise_error") + .exclude("assert_true") enableSuite[GlutenComplexTypeSuite] enableSuite[GlutenConfigBehaviorSuite] // Will be fixed by cleaning up ColumnarShuffleExchangeExec. diff --git a/gluten-ut/spark34/src/test/scala/org/apache/spark/sql/GlutenColumnExpressionSuite.scala b/gluten-ut/spark34/src/test/scala/org/apache/spark/sql/GlutenColumnExpressionSuite.scala index a4b530e637af9..437cef29215ce 100644 --- a/gluten-ut/spark34/src/test/scala/org/apache/spark/sql/GlutenColumnExpressionSuite.scala +++ b/gluten-ut/spark34/src/test/scala/org/apache/spark/sql/GlutenColumnExpressionSuite.scala @@ -16,40 +16,83 @@ */ package org.apache.spark.sql +import org.apache.spark.SparkException import org.apache.spark.sql.execution.ProjectExec -import org.apache.spark.sql.functions.{expr, input_file_name} -import org.apache.spark.sql.types.{ArrayType, IntegerType, StringType, StructField, StructType} +import org.apache.spark.sql.functions.{assert_true, expr, input_file_name, lit, raise_error} class GlutenColumnExpressionSuite extends ColumnExpressionSuite with GlutenSQLTestsTrait { - testGluten("input_file_name with scan is fallback") { - withTempPath { - dir => - val rawData = Seq( - Row(1, "Alice", Seq(Row(Seq(1, 2, 3)))), - Row(2, "Bob", Seq(Row(Seq(4, 5)))), - Row(3, "Charlie", Seq(Row(Seq(6, 7, 8, 9)))) - ) - val schema = StructType( - Array( - StructField("id", IntegerType, nullable = false), - StructField("name", StringType, nullable = false), - StructField( - "nested_column", - ArrayType( - StructType(Array( - StructField("array_in_struct", ArrayType(IntegerType), nullable = true) - ))), - nullable = true) - )) - val data: DataFrame = spark.createDataFrame(sparkContext.parallelize(rawData), schema) - data.write.parquet(dir.getCanonicalPath) - - val q = - spark.read.parquet(dir.getCanonicalPath).select(input_file_name(), expr("nested_column")) - val firstRow = q.head() - assert(firstRow.getString(0).contains(dir.toURI.getPath)) - val project = q.queryExecution.executedPlan.collect { case p: ProjectExec => p } - assert(project.size == 1) + import testImplicits._ + testGluten("raise_error") { + val strDf = Seq(("hello")).toDF("a") + + val e1 = intercept[SparkException] { + strDf.select(raise_error(lit(null.asInstanceOf[String]))).collect() + } + assert(e1.getCause.isInstanceOf[RuntimeException]) + + val e2 = intercept[SparkException] { + strDf.select(raise_error($"a")).collect() + } + assert(e2.getCause.isInstanceOf[RuntimeException]) + assert(e2.getCause.getMessage contains "hello") + } + + testGluten("assert_true") { + // assert_true(condition, errMsgCol) + val booleanDf = Seq((true), (false)).toDF("cond") + checkAnswer( + booleanDf.filter("cond = true").select(assert_true($"cond")), + Row(null) :: Nil + ) + val e1 = intercept[SparkException] { + booleanDf.select(assert_true($"cond", lit(null.asInstanceOf[String]))).collect() + } + assert(e1.getCause.isInstanceOf[RuntimeException]) + + val nullDf = Seq(("first row", None), ("second row", Some(true))).toDF("n", "cond") + checkAnswer( + nullDf.filter("cond = true").select(assert_true($"cond", $"cond")), + Row(null) :: Nil + ) + val e2 = intercept[SparkException] { + nullDf.select(assert_true($"cond", $"n")).collect() + } + assert(e2.getCause.isInstanceOf[RuntimeException]) + assert(e2.getCause.getMessage contains "first row") + + // assert_true(condition) + val intDf = Seq((0, 1)).toDF("a", "b") + checkAnswer(intDf.select(assert_true($"a" < $"b")), Row(null) :: Nil) + val e3 = intercept[SparkException] { + intDf.select(assert_true($"a" > $"b")).collect() + } + assert(e3.getCause.isInstanceOf[RuntimeException]) + assert(e3.getCause.getMessage contains "'('a > 'b)' is not true!") + } + + testGluten( + "input_file_name, input_file_block_start and input_file_block_length " + + "should fall back if scan falls back") { + withSQLConf(("spark.gluten.sql.columnar.filescan", "false")) { + withTempPath { + dir => + val data = sparkContext.parallelize(0 to 10).toDF("id") + data.write.parquet(dir.getCanonicalPath) + + val q = + spark.read + .parquet(dir.getCanonicalPath) + .select( + input_file_name(), + expr("input_file_block_start()"), + expr("input_file_block_length()")) + val firstRow = q.head() + assert(firstRow.getString(0).contains(dir.toURI.getPath)) + assert(firstRow.getLong(1) == 0) + assert(firstRow.getLong(2) > 0) + val project = q.queryExecution.executedPlan.collect { case p: ProjectExec => p } + assert(project.size == 1) + } } } } diff --git a/gluten-ut/spark34/src/test/scala/org/apache/spark/sql/GlutenSQLQueryTestSuite.scala b/gluten-ut/spark34/src/test/scala/org/apache/spark/sql/GlutenSQLQueryTestSuite.scala index 0ea1f13ec2efa..8a291990ea31f 100644 --- a/gluten-ut/spark34/src/test/scala/org/apache/spark/sql/GlutenSQLQueryTestSuite.scala +++ b/gluten-ut/spark34/src/test/scala/org/apache/spark/sql/GlutenSQLQueryTestSuite.scala @@ -17,9 +17,12 @@ package org.apache.spark.sql import org.apache.gluten.GlutenConfig +import org.apache.gluten.exception.GlutenException import org.apache.gluten.utils.{BackendTestSettings, BackendTestUtils, SystemParameters} -import org.apache.spark.SparkConf +import org.apache.spark.{SparkConf, SparkException, SparkThrowable} +import org.apache.spark.ErrorMessageFormat.MINIMAL +import org.apache.spark.SparkThrowableHelper.getMessage import org.apache.spark.sql.catalyst.expressions.codegen.CodeGenerator import org.apache.spark.sql.catalyst.plans.SQLHelper import org.apache.spark.sql.catalyst.rules.RuleExecutor @@ -40,6 +43,7 @@ import scala.collection.mutable import scala.collection.mutable.ArrayBuffer import scala.sys.process.{Process, ProcessLogger} import scala.util.Try +import scala.util.control.NonFatal /** * End-to-end test cases for SQL queries. @@ -781,4 +785,50 @@ class GlutenSQLQueryTestSuite super.afterAll() } } + + /** + * This method handles exceptions occurred during query execution as they may need special care to + * become comparable to the expected output. + * + * @param result + * a function that returns a pair of schema and output + */ + override protected def handleExceptions( + result: => (String, Seq[String])): (String, Seq[String]) = { + val format = MINIMAL + try { + result + } catch { + case e: SparkThrowable with Throwable if e.getErrorClass != null => + (emptySchema, Seq(e.getClass.getName, getMessage(e, format))) + case a: AnalysisException => + // Do not output the logical plan tree which contains expression IDs. + // Also implement a crude way of masking expression IDs in the error message + // with a generic pattern "###". + (emptySchema, Seq(a.getClass.getName, a.getSimpleMessage.replaceAll("#\\d+", "#x"))) + case s: SparkException if s.getCause != null => + // For a runtime exception, it is hard to match because its message contains + // information of stage, task ID, etc. + // To make result matching simpler, here we match the cause of the exception if it exists. + s.getCause match { + case e: SparkThrowable with Throwable if e.getErrorClass != null => + (emptySchema, Seq(e.getClass.getName, getMessage(e, format))) + case e: GlutenException => + val reasonPattern = "Reason: (.*)".r + val reason = reasonPattern.findFirstMatchIn(e.getMessage).map(_.group(1)) + + reason match { + case Some(r) => + (emptySchema, Seq(e.getClass.getName, r)) + case None => (emptySchema, Seq()) + } + + case cause => + (emptySchema, Seq(cause.getClass.getName, cause.getMessage)) + } + case NonFatal(e) => + // If there is an exception, put the exception class followed by the message. + (emptySchema, Seq(e.getClass.getName, e.getMessage)) + } + } } diff --git a/gluten-ut/spark34/src/test/scala/org/apache/spark/sql/execution/FallbackStrategiesSuite.scala b/gluten-ut/spark34/src/test/scala/org/apache/spark/sql/execution/FallbackStrategiesSuite.scala index 7976288dd4efc..5150a47688519 100644 --- a/gluten-ut/spark34/src/test/scala/org/apache/spark/sql/execution/FallbackStrategiesSuite.scala +++ b/gluten-ut/spark34/src/test/scala/org/apache/spark/sql/execution/FallbackStrategiesSuite.scala @@ -19,7 +19,7 @@ package org.apache.spark.sql.execution import org.apache.gluten.backendsapi.BackendsApiManager import org.apache.gluten.execution.BasicScanExecTransformer import org.apache.gluten.extension.GlutenPlan -import org.apache.gluten.extension.columnar.{FallbackEmptySchemaRelation, TRANSFORM_UNSUPPORTED, TransformHints} +import org.apache.gluten.extension.columnar.{FallbackEmptySchemaRelation, FallbackTags} import org.apache.gluten.extension.columnar.heuristic.HeuristicApplier import org.apache.gluten.extension.columnar.transition.InsertTransitions import org.apache.gluten.utils.QueryPlanSelector @@ -125,17 +125,16 @@ class FallbackStrategiesSuite extends GlutenSQLTestsTrait { testGluten("Tag not transformable more than once") { val originalPlan = UnaryOp1(LeafOp(supportsColumnar = true)) - TransformHints.tag(originalPlan, TRANSFORM_UNSUPPORTED(Some("fake reason"))) + FallbackTags.add(originalPlan, "fake reason") val rule = FallbackEmptySchemaRelation() val newPlan = rule.apply(originalPlan) - val reason = TransformHints.getHint(newPlan).asInstanceOf[TRANSFORM_UNSUPPORTED].reason - assert(reason.isDefined) + val reason = FallbackTags.get(newPlan).reason() if (BackendsApiManager.getSettings.fallbackOnEmptySchema(newPlan)) { assert( - reason.get.contains("fake reason") && - reason.get.contains("at least one of its children has empty output")) + reason.contains("fake reason") && + reason.contains("at least one of its children has empty output")) } else { - assert(reason.get.contains("fake reason")) + assert(reason.contains("fake reason")) } } diff --git a/gluten-ut/spark34/src/test/scala/org/apache/spark/sql/extension/CustomerColumnarPreRules.scala b/gluten-ut/spark34/src/test/scala/org/apache/spark/sql/extension/CustomerColumnarPreRules.scala index fe37da206a561..2ee1573ea07ab 100644 --- a/gluten-ut/spark34/src/test/scala/org/apache/spark/sql/extension/CustomerColumnarPreRules.scala +++ b/gluten-ut/spark34/src/test/scala/org/apache/spark/sql/extension/CustomerColumnarPreRules.scala @@ -35,7 +35,7 @@ case class CustomerColumnarPreRules(session: SparkSession) extends Rule[SparkPla fileSourceScan.tableIdentifier, fileSourceScan.disableBucketedScan ) - if (transformer.doValidate().isValid) { + if (transformer.doValidate().ok()) { transformer } else { plan diff --git a/gluten-ut/spark35/src/test/resources/sql-tests/inputs/misc-functions.sql b/gluten-ut/spark35/src/test/resources/sql-tests/inputs/misc-functions.sql new file mode 100644 index 0000000000000..907ff33000d8e --- /dev/null +++ b/gluten-ut/spark35/src/test/resources/sql-tests/inputs/misc-functions.sql @@ -0,0 +1,22 @@ +-- test for misc functions + +-- typeof +select typeof(null); +select typeof(true); +select typeof(1Y), typeof(1S), typeof(1), typeof(1L); +select typeof(cast(1.0 as float)), typeof(1.0D), typeof(1.2); +select typeof(date '1986-05-23'), typeof(timestamp '1986-05-23'), typeof(interval '23 days'); +select typeof(x'ABCD'), typeof('SPARK'); +select typeof(array(1, 2)), typeof(map(1, 2)), typeof(named_struct('a', 1, 'b', 'spark')); + +-- Spark-32793: Rewrite AssertTrue with RaiseError +SELECT assert_true(true), assert_true(boolean(1)); +SELECT assert_true(false); +SELECT assert_true(boolean(0)); +SELECT assert_true(null); +SELECT assert_true(boolean(null)); +SELECT assert_true(false, 'custom error message'); + +CREATE TEMPORARY VIEW tbl_misc AS SELECT * FROM (VALUES (1), (8), (2)) AS T(v); +SELECT raise_error('error message'); +SELECT if(v > 5, raise_error('too big: ' || v), v + 1) FROM tbl_misc; diff --git a/gluten-ut/spark35/src/test/resources/sql-tests/results/misc-functions.sql.out b/gluten-ut/spark35/src/test/resources/sql-tests/results/misc-functions.sql.out new file mode 100644 index 0000000000000..d6d1289a5adb7 --- /dev/null +++ b/gluten-ut/spark35/src/test/resources/sql-tests/results/misc-functions.sql.out @@ -0,0 +1,134 @@ +-- Automatically generated by SQLQueryTestSuite +-- !query +select typeof(null) +-- !query schema +struct +-- !query output +void + + +-- !query +select typeof(true) +-- !query schema +struct +-- !query output +boolean + + +-- !query +select typeof(1Y), typeof(1S), typeof(1), typeof(1L) +-- !query schema +struct +-- !query output +tinyint smallint int bigint + + +-- !query +select typeof(cast(1.0 as float)), typeof(1.0D), typeof(1.2) +-- !query schema +struct +-- !query output +float double decimal(2,1) + + +-- !query +select typeof(date '1986-05-23'), typeof(timestamp '1986-05-23'), typeof(interval '23 days') +-- !query schema +struct +-- !query output +date timestamp interval day + + +-- !query +select typeof(x'ABCD'), typeof('SPARK') +-- !query schema +struct +-- !query output +binary string + + +-- !query +select typeof(array(1, 2)), typeof(map(1, 2)), typeof(named_struct('a', 1, 'b', 'spark')) +-- !query schema +struct +-- !query output +array map struct + + +-- !query +SELECT assert_true(true), assert_true(boolean(1)) +-- !query schema +struct +-- !query output +NULL NULL + + +-- !query +SELECT assert_true(false) +-- !query schema +struct<> +-- !query output +org.apache.gluten.exception.GlutenException +'false' is not true! + + +-- !query +SELECT assert_true(boolean(0)) +-- !query schema +struct<> +-- !query output +org.apache.gluten.exception.GlutenException +'cast(0 as boolean)' is not true! + + +-- !query +SELECT assert_true(null) +-- !query schema +struct<> +-- !query output +org.apache.gluten.exception.GlutenException +'null' is not true! + + +-- !query +SELECT assert_true(boolean(null)) +-- !query schema +struct<> +-- !query output +org.apache.gluten.exception.GlutenException +'cast(null as boolean)' is not true! + + +-- !query +SELECT assert_true(false, 'custom error message') +-- !query schema +struct<> +-- !query output +org.apache.gluten.exception.GlutenException +custom error message + + +-- !query +CREATE TEMPORARY VIEW tbl_misc AS SELECT * FROM (VALUES (1), (8), (2)) AS T(v) +-- !query schema +struct<> +-- !query output + + + +-- !query +SELECT raise_error('error message') +-- !query schema +struct<> +-- !query output +org.apache.gluten.exception.GlutenException +error message + + +-- !query +SELECT if(v > 5, raise_error('too big: ' || v), v + 1) FROM tbl_misc +-- !query schema +struct<> +-- !query output +org.apache.gluten.exception.GlutenException +too big: 8 diff --git a/gluten-ut/spark35/src/test/scala/org/apache/gluten/utils/clickhouse/ClickHouseTestSettings.scala b/gluten-ut/spark35/src/test/scala/org/apache/gluten/utils/clickhouse/ClickHouseTestSettings.scala index 0dc2cdd89f935..ab288e835b127 100644 --- a/gluten-ut/spark35/src/test/scala/org/apache/gluten/utils/clickhouse/ClickHouseTestSettings.scala +++ b/gluten-ut/spark35/src/test/scala/org/apache/gluten/utils/clickhouse/ClickHouseTestSettings.scala @@ -544,7 +544,6 @@ class ClickHouseTestSettings extends BackendTestSettings { .exclude("Map Concat") .exclude("MapFromEntries") .exclude("ArraysOverlap") - .exclude("ArrayJoin") .exclude("ArraysZip") .exclude("Sequence of numbers") .exclude("Sequence of timestamps") @@ -711,6 +710,9 @@ class ClickHouseTestSettings extends BackendTestSettings { .exclude("SPARK-35926: Support YearMonthIntervalType in width-bucket function") .exclude("SPARK-35925: Support DayTimeIntervalType in width-bucket function") .exclude("SPARK-37388: width_bucket") + .exclude("shift left") + .exclude("shift right") + .exclude("shift right unsigned") enableSuite[GlutenMiscExpressionsSuite] enableSuite[GlutenNondeterministicSuite] .exclude("MonotonicallyIncreasingID") diff --git a/gluten-ut/spark35/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala b/gluten-ut/spark35/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala index e54aca34ec757..9716a7c143742 100644 --- a/gluten-ut/spark35/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala +++ b/gluten-ut/spark35/src/test/scala/org/apache/gluten/utils/velox/VeloxTestSettings.scala @@ -969,6 +969,11 @@ class VeloxTestSettings extends BackendTestSettings { enableSuite[GlutenFileSourceCharVarcharTestSuite] enableSuite[GlutenDSV2CharVarcharTestSuite] enableSuite[GlutenColumnExpressionSuite] + // Velox raise_error('errMsg') throws a velox_user_error exception with the message 'errMsg'. + // The final caught Spark exception's getCause().getMessage() contains 'errMsg' but does not + // equal 'errMsg' exactly. The following two tests will be skipped and overridden in Gluten. + .exclude("raise_error") + .exclude("assert_true") enableSuite[GlutenComplexTypeSuite] enableSuite[GlutenConfigBehaviorSuite] // Will be fixed by cleaning up ColumnarShuffleExchangeExec. diff --git a/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/GlutenColumnExpressionSuite.scala b/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/GlutenColumnExpressionSuite.scala index 8a28c4e98a26b..437cef29215ce 100644 --- a/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/GlutenColumnExpressionSuite.scala +++ b/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/GlutenColumnExpressionSuite.scala @@ -16,40 +16,83 @@ */ package org.apache.spark.sql +import org.apache.spark.SparkException import org.apache.spark.sql.execution.ProjectExec -import org.apache.spark.sql.functions.{expr, input_file_name} -import org.apache.spark.sql.types._ +import org.apache.spark.sql.functions.{assert_true, expr, input_file_name, lit, raise_error} class GlutenColumnExpressionSuite extends ColumnExpressionSuite with GlutenSQLTestsTrait { - testGluten("input_file_name with scan is fallback") { - withTempPath { - dir => - val rawData = Seq( - Row(1, "Alice", Seq(Row(Seq(1, 2, 3)))), - Row(2, "Bob", Seq(Row(Seq(4, 5)))), - Row(3, "Charlie", Seq(Row(Seq(6, 7, 8, 9)))) - ) - val schema = StructType( - Array( - StructField("id", IntegerType, nullable = false), - StructField("name", StringType, nullable = false), - StructField( - "nested_column", - ArrayType( - StructType(Array( - StructField("array_in_struct", ArrayType(IntegerType), nullable = true) - ))), - nullable = true) - )) - val data: DataFrame = spark.createDataFrame(sparkContext.parallelize(rawData), schema) - data.write.parquet(dir.getCanonicalPath) - - val q = - spark.read.parquet(dir.getCanonicalPath).select(input_file_name(), expr("nested_column")) - val firstRow = q.head() - assert(firstRow.getString(0).contains(dir.toURI.getPath)) - val project = q.queryExecution.executedPlan.collect { case p: ProjectExec => p } - assert(project.size == 1) + import testImplicits._ + testGluten("raise_error") { + val strDf = Seq(("hello")).toDF("a") + + val e1 = intercept[SparkException] { + strDf.select(raise_error(lit(null.asInstanceOf[String]))).collect() + } + assert(e1.getCause.isInstanceOf[RuntimeException]) + + val e2 = intercept[SparkException] { + strDf.select(raise_error($"a")).collect() + } + assert(e2.getCause.isInstanceOf[RuntimeException]) + assert(e2.getCause.getMessage contains "hello") + } + + testGluten("assert_true") { + // assert_true(condition, errMsgCol) + val booleanDf = Seq((true), (false)).toDF("cond") + checkAnswer( + booleanDf.filter("cond = true").select(assert_true($"cond")), + Row(null) :: Nil + ) + val e1 = intercept[SparkException] { + booleanDf.select(assert_true($"cond", lit(null.asInstanceOf[String]))).collect() + } + assert(e1.getCause.isInstanceOf[RuntimeException]) + + val nullDf = Seq(("first row", None), ("second row", Some(true))).toDF("n", "cond") + checkAnswer( + nullDf.filter("cond = true").select(assert_true($"cond", $"cond")), + Row(null) :: Nil + ) + val e2 = intercept[SparkException] { + nullDf.select(assert_true($"cond", $"n")).collect() + } + assert(e2.getCause.isInstanceOf[RuntimeException]) + assert(e2.getCause.getMessage contains "first row") + + // assert_true(condition) + val intDf = Seq((0, 1)).toDF("a", "b") + checkAnswer(intDf.select(assert_true($"a" < $"b")), Row(null) :: Nil) + val e3 = intercept[SparkException] { + intDf.select(assert_true($"a" > $"b")).collect() + } + assert(e3.getCause.isInstanceOf[RuntimeException]) + assert(e3.getCause.getMessage contains "'('a > 'b)' is not true!") + } + + testGluten( + "input_file_name, input_file_block_start and input_file_block_length " + + "should fall back if scan falls back") { + withSQLConf(("spark.gluten.sql.columnar.filescan", "false")) { + withTempPath { + dir => + val data = sparkContext.parallelize(0 to 10).toDF("id") + data.write.parquet(dir.getCanonicalPath) + + val q = + spark.read + .parquet(dir.getCanonicalPath) + .select( + input_file_name(), + expr("input_file_block_start()"), + expr("input_file_block_length()")) + val firstRow = q.head() + assert(firstRow.getString(0).contains(dir.toURI.getPath)) + assert(firstRow.getLong(1) == 0) + assert(firstRow.getLong(2) > 0) + val project = q.queryExecution.executedPlan.collect { case p: ProjectExec => p } + assert(project.size == 1) + } } } } diff --git a/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/GlutenJsonFunctionsSuite.scala b/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/GlutenJsonFunctionsSuite.scala index 24963f89d3fbe..5a28031b6c7a4 100644 --- a/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/GlutenJsonFunctionsSuite.scala +++ b/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/GlutenJsonFunctionsSuite.scala @@ -89,13 +89,13 @@ class GlutenJsonFunctionsSuite extends JsonFunctionsSuite with GlutenSQLTestsTra runTest("[\"a\",\"b\"]", "$[1]", "b") runTest("[[\"a\",\"b\"]]", "$[0][1]", "b") - runTest("[1,2,3]", "[0]", "1") - // runTest("[1,2,3]", "$0", null) crashes in velox + runTest("[1,2,3]", "[0]", null) + runTest("[1,2,3]", "$0", null) runTest("[1,2,3]", "0", null) runTest("[1,2,3]", "$.", null) - // runTest("[1,2,3]", "$", "[1,2,3]") crashes in velox - // runTest("{\"a\":4}", "$", "{\"a\":4}") crashes in velox + runTest("[1,2,3]", "$", "[1,2,3]") + runTest("{\"a\":4}", "$", "{\"a\":4}") def runTest(json: String, path: String, exp: String): Unit = { checkAnswer(Seq(json).toDF().selectExpr(s"get_json_object(value, '$path')"), Row(exp)) diff --git a/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/GlutenSQLQueryTestSuite.scala b/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/GlutenSQLQueryTestSuite.scala index b1f3945bf1920..8a6f5f32f8919 100644 --- a/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/GlutenSQLQueryTestSuite.scala +++ b/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/GlutenSQLQueryTestSuite.scala @@ -17,9 +17,12 @@ package org.apache.spark.sql import org.apache.gluten.GlutenConfig +import org.apache.gluten.exception.GlutenException import org.apache.gluten.utils.{BackendTestSettings, BackendTestUtils, SystemParameters} -import org.apache.spark.SparkConf +import org.apache.spark.{SparkConf, SparkException, SparkThrowable} +import org.apache.spark.ErrorMessageFormat.MINIMAL +import org.apache.spark.SparkThrowableHelper.getMessage import org.apache.spark.sql.catalyst.expressions.codegen.CodeGenerator import org.apache.spark.sql.catalyst.plans.SQLHelper import org.apache.spark.sql.catalyst.rules.RuleExecutor @@ -40,6 +43,7 @@ import scala.collection.mutable import scala.collection.mutable.ArrayBuffer import scala.sys.process.{Process, ProcessLogger} import scala.util.Try +import scala.util.control.NonFatal /** * End-to-end test cases for SQL queries. @@ -783,4 +787,50 @@ class GlutenSQLQueryTestSuite super.afterAll() } } + + /** + * This method handles exceptions occurred during query execution as they may need special care to + * become comparable to the expected output. + * + * @param result + * a function that returns a pair of schema and output + */ + override protected def handleExceptions( + result: => (String, Seq[String])): (String, Seq[String]) = { + val format = MINIMAL + try { + result + } catch { + case e: SparkThrowable with Throwable if e.getErrorClass != null => + (emptySchema, Seq(e.getClass.getName, getMessage(e, format))) + case a: AnalysisException => + // Do not output the logical plan tree which contains expression IDs. + // Also implement a crude way of masking expression IDs in the error message + // with a generic pattern "###". + (emptySchema, Seq(a.getClass.getName, a.getSimpleMessage.replaceAll("#\\d+", "#x"))) + case s: SparkException if s.getCause != null => + // For a runtime exception, it is hard to match because its message contains + // information of stage, task ID, etc. + // To make result matching simpler, here we match the cause of the exception if it exists. + s.getCause match { + case e: SparkThrowable with Throwable if e.getErrorClass != null => + (emptySchema, Seq(e.getClass.getName, getMessage(e, format))) + case e: GlutenException => + val reasonPattern = "Reason: (.*)".r + val reason = reasonPattern.findFirstMatchIn(e.getMessage).map(_.group(1)) + + reason match { + case Some(r) => + (emptySchema, Seq(e.getClass.getName, r)) + case None => (emptySchema, Seq()) + } + + case cause => + (emptySchema, Seq(cause.getClass.getName, cause.getMessage)) + } + case NonFatal(e) => + // If there is an exception, put the exception class followed by the message. + (emptySchema, Seq(e.getClass.getName, e.getMessage)) + } + } } diff --git a/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/execution/FallbackStrategiesSuite.scala b/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/execution/FallbackStrategiesSuite.scala index 7976288dd4efc..5150a47688519 100644 --- a/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/execution/FallbackStrategiesSuite.scala +++ b/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/execution/FallbackStrategiesSuite.scala @@ -19,7 +19,7 @@ package org.apache.spark.sql.execution import org.apache.gluten.backendsapi.BackendsApiManager import org.apache.gluten.execution.BasicScanExecTransformer import org.apache.gluten.extension.GlutenPlan -import org.apache.gluten.extension.columnar.{FallbackEmptySchemaRelation, TRANSFORM_UNSUPPORTED, TransformHints} +import org.apache.gluten.extension.columnar.{FallbackEmptySchemaRelation, FallbackTags} import org.apache.gluten.extension.columnar.heuristic.HeuristicApplier import org.apache.gluten.extension.columnar.transition.InsertTransitions import org.apache.gluten.utils.QueryPlanSelector @@ -125,17 +125,16 @@ class FallbackStrategiesSuite extends GlutenSQLTestsTrait { testGluten("Tag not transformable more than once") { val originalPlan = UnaryOp1(LeafOp(supportsColumnar = true)) - TransformHints.tag(originalPlan, TRANSFORM_UNSUPPORTED(Some("fake reason"))) + FallbackTags.add(originalPlan, "fake reason") val rule = FallbackEmptySchemaRelation() val newPlan = rule.apply(originalPlan) - val reason = TransformHints.getHint(newPlan).asInstanceOf[TRANSFORM_UNSUPPORTED].reason - assert(reason.isDefined) + val reason = FallbackTags.get(newPlan).reason() if (BackendsApiManager.getSettings.fallbackOnEmptySchema(newPlan)) { assert( - reason.get.contains("fake reason") && - reason.get.contains("at least one of its children has empty output")) + reason.contains("fake reason") && + reason.contains("at least one of its children has empty output")) } else { - assert(reason.get.contains("fake reason")) + assert(reason.contains("fake reason")) } } diff --git a/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/execution/GlutenSQLWindowFunctionSuite.scala b/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/execution/GlutenSQLWindowFunctionSuite.scala index 89a4351744ef4..4a87bac690e8a 100644 --- a/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/execution/GlutenSQLWindowFunctionSuite.scala +++ b/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/execution/GlutenSQLWindowFunctionSuite.scala @@ -16,7 +16,7 @@ */ package org.apache.spark.sql.execution -import org.apache.gluten.execution.{WindowExecTransformer, WindowGroupLimitExecTransformer} +import org.apache.gluten.execution.{SortExecTransformer, WindowExecTransformer, WindowGroupLimitExecTransformer} import org.apache.spark.sql.GlutenSQLTestsTrait import org.apache.spark.sql.Row @@ -134,6 +134,9 @@ class GlutenSQLWindowFunctionSuite extends SQLWindowFunctionSuite with GlutenSQL case _ => false } ) + assert( + getExecutedPlan(df).collect { case s: SortExecTransformer if !s.global => s }.size == 1 + ) } } diff --git a/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/GlutenParquetFilterSuite.scala b/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/GlutenParquetFilterSuite.scala index bb4a78a827956..4141acee31708 100644 --- a/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/GlutenParquetFilterSuite.scala +++ b/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/GlutenParquetFilterSuite.scala @@ -37,7 +37,6 @@ import org.apache.spark.util.Utils import org.apache.hadoop.fs.Path import org.apache.parquet.filter2.predicate.{FilterApi, FilterPredicate, Operators} import org.apache.parquet.filter2.predicate.FilterApi._ -import org.apache.parquet.filter2.predicate.Operators import org.apache.parquet.filter2.predicate.Operators.{Column => _, Eq, Gt, GtEq, Lt, LtEq, NotEq} import org.apache.parquet.hadoop.{ParquetFileReader, ParquetInputFormat, ParquetOutputFormat} import org.apache.parquet.hadoop.util.HadoopInputFile diff --git a/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/GlutenParquetRowIndexSuite.scala b/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/GlutenParquetRowIndexSuite.scala index ad41a8395fd0d..4c53396792c2d 100644 --- a/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/GlutenParquetRowIndexSuite.scala +++ b/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/execution/datasources/parquet/GlutenParquetRowIndexSuite.scala @@ -49,6 +49,7 @@ class GlutenParquetRowIndexSuite extends ParquetRowIndexSuite with GlutenSQLTest .getBlocks .asScala .map(_.getRowCount) + .toSeq } private def readRowGroupRowCounts(dir: File): Seq[Seq[Long]] = { diff --git a/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/extension/CustomerColumnarPreRules.scala b/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/extension/CustomerColumnarPreRules.scala index fe37da206a561..2ee1573ea07ab 100644 --- a/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/extension/CustomerColumnarPreRules.scala +++ b/gluten-ut/spark35/src/test/scala/org/apache/spark/sql/extension/CustomerColumnarPreRules.scala @@ -35,7 +35,7 @@ case class CustomerColumnarPreRules(session: SparkSession) extends Rule[SparkPla fileSourceScan.tableIdentifier, fileSourceScan.disableBucketedScan ) - if (transformer.doValidate().isValid) { + if (transformer.doValidate().ok()) { transformer } else { plan diff --git a/gluten-ut/test/src/test/scala/org/apache/spark/sql/GlutenExpressionDataTypesValidation.scala b/gluten-ut/test/src/test/scala/org/apache/spark/sql/GlutenExpressionDataTypesValidation.scala new file mode 100644 index 0000000000000..c8b2aaba280f5 --- /dev/null +++ b/gluten-ut/test/src/test/scala/org/apache/spark/sql/GlutenExpressionDataTypesValidation.scala @@ -0,0 +1,158 @@ +/* + * 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. + */ +package org.apache.spark.sql + +import org.apache.gluten.GlutenConfig +import org.apache.gluten.execution.{ProjectExecTransformer, WholeStageTransformerSuite} +import org.apache.gluten.extension.GlutenPlan +import org.apache.gluten.utils.{BackendTestUtils, SystemParameters} + +import org.apache.spark.SparkConf +import org.apache.spark.rdd.RDD +import org.apache.spark.sql.catalyst.InternalRow +import org.apache.spark.sql.catalyst.expressions._ +import org.apache.spark.sql.execution.LeafExecNode +import org.apache.spark.sql.execution.metric.SQLMetric +import org.apache.spark.sql.types._ + +class GlutenExpressionDataTypesValidation extends WholeStageTransformerSuite { + protected val resourcePath: String = null + protected val fileFormat: String = null + override protected val logLevel: String = "INFO" + + override protected def sparkConf: SparkConf = { + val conf = super.sparkConf + .set("spark.plugins", "org.apache.gluten.GlutenPlugin") + .set("spark.default.parallelism", "1") + .set("spark.memory.offHeap.enabled", "true") + .set("spark.memory.offHeap.size", "1024MB") + .set("spark.ui.enabled", "false") + .set("spark.gluten.ui.enabled", "false") + if (BackendTestUtils.isCHBackendLoaded()) { + conf + .set("spark.gluten.sql.enable.native.validation", "false") + .set(GlutenConfig.GLUTEN_LIB_PATH, SystemParameters.getClickHouseLibPath) + } + conf + } + + private case class DummyPlan() extends LeafExecNode { + override def output: Seq[Attribute] = Seq() + + override val metrics: Map[String, SQLMetric] = Map.empty + + override def doExecute(): RDD[InternalRow] = throw new UnsupportedOperationException( + "Just a dummy plan.") + } + + private val allPrimitiveDataTypes: Seq[DataType] = + Seq( + ByteType, + ShortType, + IntegerType, + LongType, + FloatType, + DoubleType, + DecimalType(5, 1), + StringType, + BinaryType, + DateType, + TimestampType) + + private val allComplexDataTypes: Seq[DataType] = Seq( + // Currently, only check certain inner types, assuming they are representative + // for checking most expressions. + ArrayType(IntegerType), + MapType(StringType, IntegerType), + StructType(Seq(StructField("a", StringType), StructField("b", IntegerType))) + ) + + def generateChildExpression(t: DataType): Expression = { + t match { + case _: IntegralType => Literal(null, t) + case _: FractionalType => Literal(null, t) + case StringType | BinaryType => Literal("123") + case DateType => Literal(null, t) + case TimestampType => Literal(null, t) + case ArrayType(_, _) => Literal(null, t) + case MapType(_, _, _) => Literal(null, t) + case StructType(_) => Literal(null, t) + case _ => throw new UnsupportedOperationException("Not supported type: " + t) + } + } + def generateGlutenProjectPlan(expr: Expression): GlutenPlan = { + val namedExpr = Seq(Alias(expr, "r")()) + ProjectExecTransformer(namedExpr, DummyPlan()) + } + + test("cast") { + for (from <- allPrimitiveDataTypes ++ allComplexDataTypes) { + for (to <- allPrimitiveDataTypes ++ allComplexDataTypes) { + if (to != from) { + val castExpr = Cast(generateChildExpression(from), to) + if (castExpr.checkInputDataTypes().isSuccess) { + val glutenProject = generateGlutenProjectPlan(castExpr) + if (castExpr.resolved && glutenProject.doValidate().ok()) { + logInfo("## cast validation passes: cast from " + from + " to " + to) + } else { + logInfo("!! cast validation fails: cast from " + from + " to " + to) + } + } + } + } + } + } + + test("unary expressions with expected input types") { + val functionRegistry = spark.sessionState.functionRegistry + val sparkBuiltInFunctions = functionRegistry.listFunction() + for (func <- sparkBuiltInFunctions) { + val builder = functionRegistry.lookupFunctionBuilder(func).get + var expr: Expression = null + try { + // Instantiate an expression with null input. Just for obtaining the instance for checking + // its allowed input types. + expr = builder(Seq(null)) + } catch { + // Ignore the exception as some expression builders require more than one input. + case _: Throwable => + } + if ( + expr != null && expr.isInstanceOf[ExpectsInputTypes] && expr.isInstanceOf[UnaryExpression] + ) { + val acceptedTypes = allPrimitiveDataTypes.filter( + expr.asInstanceOf[ExpectsInputTypes].inputTypes.head.acceptsType(_)) + if (acceptedTypes.isEmpty) { + logWarning("Any given type is not accepted for " + expr.getClass.getSimpleName) + } + acceptedTypes.foreach( + t => { + val child = generateChildExpression(t) + // Builds an expression whose child's type is really accepted in Spark. + val targetExpr = builder(Seq(child)) + val glutenProject = generateGlutenProjectPlan(targetExpr) + if (targetExpr.resolved && glutenProject.doValidate().ok()) { + logInfo("## validation passes: " + targetExpr.getClass.getSimpleName + "(" + t + ")") + } else { + logInfo("!! validation fails: " + targetExpr.getClass.getSimpleName + "(" + t + ")") + } + }) + } + } + } + +} diff --git a/pom.xml b/pom.xml index 887839ce5fc03..4f8bd3e14f61f 100644 --- a/pom.xml +++ b/pom.xml @@ -21,6 +21,18 @@ Gluten Parent Pom https://github.com/apache/incubator-gluten.git + Apache Gluten(incubating) + + + Apache + http://gluten.apache.org + + + + scm:git:git://github.com/apache/incubator-gluten.git + scm:git:ssh://github.com:apache/incubator-gluten.git + http://github.com/apache/incubator-gluten/tree/main + @@ -59,6 +71,8 @@ 15.0.0-gluten arrow-memory-unsafe 2.7.4 + 2.0.7 + 2.20.0 UTF-8 UTF-8 spark-sql-columnar @@ -113,6 +127,100 @@ + + scala-2.12 + + true + + + + 2.12.15 + 2.12 + + + + scala-2.13 + + 2.13.8 + 2.13 + + + + + + net.alchim31.maven + scala-maven-plugin + + + + -unchecked + -deprecation + -feature + -explaintypes + -target:jvm-1.8 + -Wconf:cat=deprecation:wv,any:e + -Wunused:imports + + -Wconf:cat=scaladoc:wv + -Wconf:cat=lint-multiarg-infix:wv + -Wconf:cat=other-nullary-override:wv + + -Wconf:msg=^(?=.*?method|value|type|object|trait|inheritance)(?=.*?deprecated)(?=.*?since 2.13).+$:s + -Wconf:msg=^(?=.*?Widening conversion from)(?=.*?is deprecated because it loses precision).+$:s + -Wconf:msg=Auto-application to \`\(\)\` is deprecated:s + -Wconf:msg=method with a single empty parameter list overrides method without any parameter list:s + -Wconf:msg=method without a parameter list overrides a method with a single empty one:s + + -Wconf:cat=deprecation&msg=procedure syntax is deprecated:e + + -Wconf:cat=unchecked&msg=outer reference:s + -Wconf:cat=unchecked&msg=eliminated by erasure:s + -Wconf:msg=^(?=.*?a value of type)(?=.*?cannot also be).+$:s + + + + + + + + + + java-8 @@ -196,6 +304,20 @@ 2.15.1 3.3.4 + + + org.slf4j + slf4j-api + ${slf4j.version} + provided + + + org.apache.logging.log4j + log4j-slf4j2-impl + ${log4j.version} + provided + + hadoop-2.7.4 @@ -305,6 +427,55 @@ gluten-ut + + + apache-release + + false + + + + + org.apache.maven.plugins + maven-release-plugin + + false + + + + org.apache.maven.plugins + maven-gpg-plugin + + false + true + + + + maven-assembly-plugin + + + source-release-assembly + none + + single + + + gnu + true + true + + + src/assembly/source-assembly.xml + + + apache-gluten-${project.version} + + + + + + + @@ -521,7 +692,7 @@ org.scalatest scalatest_${scala.binary.version} - 3.2.3 + 3.2.16 test @@ -585,7 +756,7 @@ ${scala.binary.version} - ${sparkbundle.version} + ${sparkbundle.version} diff --git a/shims/common/pom.xml b/shims/common/pom.xml index adf9da7c624ee..959a95fc074fe 100644 --- a/shims/common/pom.xml +++ b/shims/common/pom.xml @@ -61,7 +61,9 @@ -Wconf:cat=deprecation:silent + diff --git a/shims/common/src/main/scala/org/apache/gluten/GlutenConfig.scala b/shims/common/src/main/scala/org/apache/gluten/GlutenConfig.scala index c05841b5d88aa..a5bf492a1f525 100644 --- a/shims/common/src/main/scala/org/apache/gluten/GlutenConfig.scala +++ b/shims/common/src/main/scala/org/apache/gluten/GlutenConfig.scala @@ -643,6 +643,7 @@ object GlutenConfig { GLUTEN_DEFAULT_SESSION_TIMEZONE_KEY, SQLConf.LEGACY_SIZE_OF_NULL.key, "spark.io.compression.codec", + "spark.sql.decimalOperations.allowPrecisionLoss", COLUMNAR_VELOX_BLOOM_FILTER_EXPECTED_NUM_ITEMS.key, COLUMNAR_VELOX_BLOOM_FILTER_NUM_BITS.key, COLUMNAR_VELOX_BLOOM_FILTER_MAX_NUM_BITS.key, @@ -724,6 +725,7 @@ object GlutenConfig { ("spark.hadoop.input.write.timeout", "180000"), ("spark.hadoop.dfs.client.log.severity", "INFO"), ("spark.sql.orc.compression.codec", "snappy"), + ("spark.sql.decimalOperations.allowPrecisionLoss", "true"), ( COLUMNAR_VELOX_FILE_HANDLE_CACHE_ENABLED.key, COLUMNAR_VELOX_FILE_HANDLE_CACHE_ENABLED.defaultValueString), @@ -1610,6 +1612,13 @@ object GlutenConfig { .booleanConf .createOptional + val VELOX_WRITER_QUEUE_SIZE = + buildConf("spark.gluten.sql.velox.writer.queue.size") + .internal() + .doc("This is config to specify the velox writer queue size") + .intConf + .createWithDefault(64) + val NATIVE_HIVEFILEFORMAT_WRITER_ENABLED = buildConf("spark.gluten.sql.native.hive.writer.enabled") .internal() diff --git a/shims/common/src/main/scala/org/apache/gluten/expression/ExpressionNames.scala b/shims/common/src/main/scala/org/apache/gluten/expression/ExpressionNames.scala index 7060e297ea10e..7cc75405bad65 100644 --- a/shims/common/src/main/scala/org/apache/gluten/expression/ExpressionNames.scala +++ b/shims/common/src/main/scala/org/apache/gluten/expression/ExpressionNames.scala @@ -128,7 +128,7 @@ object ExpressionNames { final val UUID = "uuid" final val BIT_LENGTH = "bit_length" final val OCTET_LENGTH = "octet_length" - final val LEVENSHTEIN = "levenshteinDistance" + final val LEVENSHTEIN = "levenshtein" final val UNBASE64 = "unbase64" final val BASE64 = "base64" @@ -261,6 +261,7 @@ object ExpressionNames { final val ARRAY_EXCEPT = "array_except" final val ARRAY_REPEAT = "array_repeat" final val ARRAY_REMOVE = "array_remove" + final val ARRAY_SORT = "array_sort" final val ARRAYS_ZIP = "arrays_zip" final val FILTER = "filter" final val FORALL = "forall" @@ -314,6 +315,9 @@ object ExpressionNames { final val SPARK_PARTITION_ID = "spark_partition_id" final val MONOTONICALLY_INCREASING_ID = "monotonically_increasing_id" final val WIDTH_BUCKET = "width_bucket" + final val REPLICATE_ROWS = "replicaterows" + final val RAISE_ERROR = "raise_error" + final val VERSION = "version" // Directly use child expression transformer final val KNOWN_NULLABLE = "known_nullable" diff --git a/shims/common/src/main/scala/org/apache/gluten/sql/shims/SparkShims.scala b/shims/common/src/main/scala/org/apache/gluten/sql/shims/SparkShims.scala index bd1665330a891..fed08b789802b 100644 --- a/shims/common/src/main/scala/org/apache/gluten/sql/shims/SparkShims.scala +++ b/shims/common/src/main/scala/org/apache/gluten/sql/shims/SparkShims.scala @@ -38,12 +38,12 @@ import org.apache.spark.sql.connector.read.{InputPartition, Scan} import org.apache.spark.sql.execution.{FileSourceScanExec, GlobalLimitExec, SparkPlan, TakeOrderedAndProjectExec} import org.apache.spark.sql.execution.command.DataWritingCommandExec import org.apache.spark.sql.execution.datasources._ -import org.apache.spark.sql.execution.datasources.parquet.{ParquetFileFormat, ParquetFilters} +import org.apache.spark.sql.execution.datasources.parquet.ParquetFilters import org.apache.spark.sql.execution.datasources.v2.BatchScanExec import org.apache.spark.sql.execution.datasources.v2.text.TextScan import org.apache.spark.sql.execution.exchange.{BroadcastExchangeLike, ShuffleExchangeLike} import org.apache.spark.sql.internal.SQLConf -import org.apache.spark.sql.types.{StructField, StructType} +import org.apache.spark.sql.types.{DecimalType, StructType} import org.apache.spark.sql.util.CaseInsensitiveStringMap import org.apache.spark.storage.{BlockId, BlockManagerId} @@ -248,4 +248,23 @@ trait SparkShims { conf: SQLConf, schema: MessageType, caseSensitive: Option[Boolean] = None): ParquetFilters + + def genDecimalRoundExpressionOutput(decimalType: DecimalType, toScale: Int): DecimalType = { + val p = decimalType.precision + val s = decimalType.scale + // After rounding we may need one more digit in the integral part, + // e.g. `ceil(9.9, 0)` -> `10`, `ceil(99, -1)` -> `100`. + val integralLeastNumDigits = p - s + 1 + if (toScale < 0) { + // negative scale means we need to adjust `-scale` number of digits before the decimal + // point, which means we need at lease `-scale + 1` digits (after rounding). + val newPrecision = math.max(integralLeastNumDigits, -toScale + 1) + // We have to accept the risk of overflow as we can't exceed the max precision. + DecimalType(math.min(newPrecision, DecimalType.MAX_PRECISION), 0) + } else { + val newScale = math.min(s, toScale) + // We have to accept the risk of overflow as we can't exceed the max precision. + DecimalType(math.min(integralLeastNumDigits + newScale, 38), newScale) + } + } } diff --git a/shims/pom.xml b/shims/pom.xml index 5c17c3ec32ccb..61bea7040999e 100644 --- a/shims/pom.xml +++ b/shims/pom.xml @@ -37,7 +37,7 @@ org.scalatest scalatest_${scala.binary.version} - 3.2.3 + 3.2.16 test diff --git a/shims/spark32/src/main/scala/org/apache/gluten/sql/shims/spark32/Spark32Shims.scala b/shims/spark32/src/main/scala/org/apache/gluten/sql/shims/spark32/Spark32Shims.scala index b036d6dd9a411..5ad63884af38b 100644 --- a/shims/spark32/src/main/scala/org/apache/gluten/sql/shims/spark32/Spark32Shims.scala +++ b/shims/spark32/src/main/scala/org/apache/gluten/sql/shims/spark32/Spark32Shims.scala @@ -46,7 +46,7 @@ import org.apache.spark.sql.execution.datasources.v2.utils.CatalogUtil import org.apache.spark.sql.execution.exchange.BroadcastExchangeLike import org.apache.spark.sql.internal.SQLConf import org.apache.spark.sql.internal.SQLConf.LegacyBehaviorPolicy -import org.apache.spark.sql.types.{StructField, StructType} +import org.apache.spark.sql.types.{DecimalType, StructField, StructType} import org.apache.spark.sql.util.CaseInsensitiveStringMap import org.apache.spark.storage.{BlockId, BlockManagerId} @@ -276,4 +276,12 @@ class Spark32Shims extends SparkShims { RebaseSpec(LegacyBehaviorPolicy.CORRECTED) ) } + + override def genDecimalRoundExpressionOutput( + decimalType: DecimalType, + toScale: Int): DecimalType = { + val p = decimalType.precision + val s = decimalType.scale + DecimalType(p, if (toScale > s) s else toScale) + } } diff --git a/shims/spark34/src/main/scala/org/apache/gluten/sql/shims/spark34/Spark34Shims.scala b/shims/spark34/src/main/scala/org/apache/gluten/sql/shims/spark34/Spark34Shims.scala index 420be85119377..203256cf5fec2 100644 --- a/shims/spark34/src/main/scala/org/apache/gluten/sql/shims/spark34/Spark34Shims.scala +++ b/shims/spark34/src/main/scala/org/apache/gluten/sql/shims/spark34/Spark34Shims.scala @@ -77,7 +77,10 @@ class Spark34Shims extends SparkShims { Sig[Sec](ExpressionNames.SEC), Sig[Csc](ExpressionNames.CSC), Sig[KnownNullable](KNOWN_NULLABLE), - Sig[Empty2Null](ExpressionNames.EMPTY2NULL) + Sig[Empty2Null](ExpressionNames.EMPTY2NULL), + Sig[TimestampAdd](ExpressionNames.TIMESTAMP_ADD), + Sig[RoundFloor](ExpressionNames.FLOOR), + Sig[RoundCeil](ExpressionNames.CEIL) ) } diff --git a/shims/spark35/pom.xml b/shims/spark35/pom.xml index 27cd011ac2d66..1c79b882bf4ab 100644 --- a/shims/spark35/pom.xml +++ b/shims/spark35/pom.xml @@ -43,13 +43,13 @@ org.apache.spark - spark-catalyst_2.12 + spark-catalyst_${scala.binary.version} provided true org.apache.spark - spark-core_2.12 + spark-core_${scala.binary.version} provided true @@ -109,7 +109,9 @@ -Wconf:cat=deprecation:silent + diff --git a/shims/spark35/src/main/scala/org/apache/gluten/sql/shims/spark35/Spark35Shims.scala b/shims/spark35/src/main/scala/org/apache/gluten/sql/shims/spark35/Spark35Shims.scala index 8ac8d323efd60..821e0f5837d69 100644 --- a/shims/spark35/src/main/scala/org/apache/gluten/sql/shims/spark35/Spark35Shims.scala +++ b/shims/spark35/src/main/scala/org/apache/gluten/sql/shims/spark35/Spark35Shims.scala @@ -43,7 +43,7 @@ import org.apache.spark.sql.connector.read.{HasPartitionKey, InputPartition, Sca import org.apache.spark.sql.execution._ import org.apache.spark.sql.execution.command.DataWritingCommandExec import org.apache.spark.sql.execution.datasources._ -import org.apache.spark.sql.execution.datasources.parquet.{ParquetFileFormat, ParquetFilters, ParquetRowIndexUtil} +import org.apache.spark.sql.execution.datasources.parquet.{ParquetFileFormat, ParquetFilters} import org.apache.spark.sql.execution.datasources.v2.BatchScanExec import org.apache.spark.sql.execution.datasources.v2.text.TextScan import org.apache.spark.sql.execution.datasources.v2.utils.CatalogUtil @@ -77,7 +77,10 @@ class Spark35Shims extends SparkShims { Sig[Sec](ExpressionNames.SEC), Sig[Csc](ExpressionNames.CSC), Sig[KnownNullable](ExpressionNames.KNOWN_NULLABLE), - Sig[Empty2Null](ExpressionNames.EMPTY2NULL) + Sig[Empty2Null](ExpressionNames.EMPTY2NULL), + Sig[TimestampAdd](ExpressionNames.TIMESTAMP_ADD), + Sig[RoundFloor](ExpressionNames.FLOOR), + Sig[RoundCeil](ExpressionNames.CEIL) ) } diff --git a/tools/gluten-it/common/src/main/java/org/apache/gluten/integration/BaseMixin.java b/tools/gluten-it/common/src/main/java/org/apache/gluten/integration/BaseMixin.java index 93c82a6fa2573..47aa0a0cb59ff 100644 --- a/tools/gluten-it/common/src/main/java/org/apache/gluten/integration/BaseMixin.java +++ b/tools/gluten-it/common/src/main/java/org/apache/gluten/integration/BaseMixin.java @@ -48,6 +48,9 @@ public class BaseMixin { @CommandLine.Option(names = {"--error-on-memleak"}, description = "Fail the test when memory leak is detected by Spark's memory manager", defaultValue = "false") private boolean errorOnMemLeak; + @CommandLine.Option(names = {"--data-dir"}, description = "Location for storing data used by tests", defaultValue = "/tmp") + private String dataDir; + @CommandLine.Option(names = {"--enable-ui"}, description = "Enable Spark UI", defaultValue = "false") private boolean enableUi; @@ -129,19 +132,19 @@ public Integer runActions(Action[] actions) { switch (benchmarkType) { case "h": suite = new TpchSuite(runModeEnumeration.getSparkMasterUrl(), actions, testConf, - baselineConf, extraSparkConfScala, level, errorOnMemLeak, enableUi, + baselineConf, extraSparkConfScala, level, errorOnMemLeak, dataDir, enableUi, enableHsUi, hsUiPort, offHeapSize, disableAqe, disableBhj, disableWscg, shufflePartitions, scanPartitions); break; case "ds": suite = new TpcdsSuite(runModeEnumeration.getSparkMasterUrl(), actions, testConf, - baselineConf, extraSparkConfScala, level, errorOnMemLeak, enableUi, + baselineConf, extraSparkConfScala, level, errorOnMemLeak, dataDir, enableUi, enableHsUi, hsUiPort, offHeapSize, disableAqe, disableBhj, disableWscg, shufflePartitions, scanPartitions); break; case "clickbench": suite = new ClickBenchSuite(runModeEnumeration.getSparkMasterUrl(), actions, testConf, - baselineConf, extraSparkConfScala, level, errorOnMemLeak, enableUi, + baselineConf, extraSparkConfScala, level, errorOnMemLeak, dataDir, enableUi, enableHsUi, hsUiPort, offHeapSize, disableAqe, disableBhj, disableWscg, shufflePartitions, scanPartitions); break; diff --git a/tools/gluten-it/common/src/main/java/org/apache/gluten/integration/command/SparkRunModes.java b/tools/gluten-it/common/src/main/java/org/apache/gluten/integration/command/SparkRunModes.java index cfd3848d81580..56ef68db90573 100644 --- a/tools/gluten-it/common/src/main/java/org/apache/gluten/integration/command/SparkRunModes.java +++ b/tools/gluten-it/common/src/main/java/org/apache/gluten/integration/command/SparkRunModes.java @@ -129,6 +129,9 @@ public String getSparkMasterUrl() { if (!System.getenv().containsKey("SPARK_HOME")) { throw new IllegalArgumentException("SPARK_HOME not set! Please use --local if there is no local Spark build"); } + if (!System.getenv().containsKey("SPARK_SCALA_VERSION")) { + throw new IllegalArgumentException("SPARK_SCALA_VERSION not set! Please set it first or use --local instead. Example: export SPARK_SCALA_VERSION=2.12"); + } return String.format("local-cluster[%d,%d,%d]", lcWorkers, lcWorkerCores, Utils.byteStringAsMb(lcWorkerMem)); } diff --git a/tools/gluten-it/common/src/main/scala/org/apache/gluten/integration/clickbench/ClickBenchSuite.scala b/tools/gluten-it/common/src/main/scala/org/apache/gluten/integration/clickbench/ClickBenchSuite.scala index 04a34d332b610..f75431941d7a2 100644 --- a/tools/gluten-it/common/src/main/scala/org/apache/gluten/integration/clickbench/ClickBenchSuite.scala +++ b/tools/gluten-it/common/src/main/scala/org/apache/gluten/integration/clickbench/ClickBenchSuite.scala @@ -21,6 +21,8 @@ import org.apache.gluten.integration.{DataGen, Suite, TableCreator} import org.apache.log4j.Level import org.apache.spark.SparkConf +import java.io.File + /** * ClickBench: a Benchmark For Analytical Databases * @@ -35,6 +37,7 @@ class ClickBenchSuite( val extraSparkConf: Map[String, String], val logLevel: Level, val errorOnMemLeak: Boolean, + val dataDir: String, val enableUi: Boolean, val enableHsUi: Boolean, val hsUiPort: Int, @@ -69,7 +72,7 @@ class ClickBenchSuite( scale: Double, genPartitionedData: Boolean): String = { checkDataGenArgs(scale, genPartitionedData) - DATA_WRITE_PATH + new File(dataDir).toPath.resolve(DATA_WRITE_RELATIVE_PATH + s"-$scale").toFile.getAbsolutePath } override private[integration] def createDataGen( @@ -88,7 +91,7 @@ class ClickBenchSuite( } private object ClickBenchSuite { - private val DATA_WRITE_PATH = "/tmp/clickbench-generated" + private val DATA_WRITE_RELATIVE_PATH = "clickbench-generated" private val HISTORY_WRITE_PATH = "/tmp/clickbench-history" private val ALL_QUERY_IDS = (1 to 43).map(i => s"q$i").toArray diff --git a/tools/gluten-it/common/src/main/scala/org/apache/gluten/integration/ds/TpcdsSuite.scala b/tools/gluten-it/common/src/main/scala/org/apache/gluten/integration/ds/TpcdsSuite.scala index a4365afde38dc..190623614b9be 100644 --- a/tools/gluten-it/common/src/main/scala/org/apache/gluten/integration/ds/TpcdsSuite.scala +++ b/tools/gluten-it/common/src/main/scala/org/apache/gluten/integration/ds/TpcdsSuite.scala @@ -17,15 +17,13 @@ package org.apache.gluten.integration.ds import org.apache.gluten.integration.action.Action -import org.apache.gluten.integration.ds.TpcdsSuite.{ - ALL_QUERY_IDS, - HISTORY_WRITE_PATH, - TPCDS_WRITE_PATH -} +import org.apache.gluten.integration.ds.TpcdsSuite.{ALL_QUERY_IDS, HISTORY_WRITE_PATH, TPCDS_WRITE_RELATIVE_PATH} import org.apache.gluten.integration.{DataGen, Suite, TableCreator, TypeModifier} import org.apache.log4j.Level import org.apache.spark.SparkConf +import java.io.File + class TpcdsSuite( val masterUrl: String, val actions: Array[Action], @@ -34,6 +32,7 @@ class TpcdsSuite( val extraSparkConf: Map[String, String], val logLevel: Level, val errorOnMemLeak: Boolean, + val dataDir: String, val enableUi: Boolean, val enableHsUi: Boolean, val hsUiPort: Int, @@ -66,7 +65,7 @@ class TpcdsSuite( override private[integration] def dataWritePath( scale: Double, genPartitionedData: Boolean): String = - TPCDS_WRITE_PATH + s"-$scale" + new File(dataDir).toPath.resolve(TPCDS_WRITE_RELATIVE_PATH + s"-$scale").toFile.getAbsolutePath override private[integration] def createDataGen( scale: Double, @@ -95,7 +94,7 @@ class TpcdsSuite( } object TpcdsSuite { - private val TPCDS_WRITE_PATH = "/tmp/tpcds-generated" + private val TPCDS_WRITE_RELATIVE_PATH = "tpcds-generated" private val ALL_QUERY_IDS = Array( "q1", "q2", diff --git a/tools/gluten-it/common/src/main/scala/org/apache/gluten/integration/h/TpchSuite.scala b/tools/gluten-it/common/src/main/scala/org/apache/gluten/integration/h/TpchSuite.scala index bdcac3bffe39d..86fcaea0a6287 100644 --- a/tools/gluten-it/common/src/main/scala/org/apache/gluten/integration/h/TpchSuite.scala +++ b/tools/gluten-it/common/src/main/scala/org/apache/gluten/integration/h/TpchSuite.scala @@ -17,11 +17,13 @@ package org.apache.gluten.integration.h import org.apache.gluten.integration.action.Action -import org.apache.gluten.integration.h.TpchSuite.{HISTORY_WRITE_PATH, TPCH_WRITE_PATH} +import org.apache.gluten.integration.h.TpchSuite.{HISTORY_WRITE_PATH, TPCH_WRITE_RELATIVE_PATH} import org.apache.gluten.integration.{DataGen, Suite, TableCreator, TypeModifier} import org.apache.log4j.Level import org.apache.spark.SparkConf +import java.io.File + class TpchSuite( val masterUrl: String, val actions: Array[Action], @@ -30,6 +32,7 @@ class TpchSuite( val extraSparkConf: Map[String, String], val logLevel: Level, val errorOnMemLeak: Boolean, + val dataDir: String, val enableUi: Boolean, val enableHsUi: Boolean, val hsUiPort: Int, @@ -62,7 +65,7 @@ class TpchSuite( override private[integration] def dataWritePath( scale: Double, genPartitionedData: Boolean): String = - TPCH_WRITE_PATH + s"-$scale" + new File(dataDir).toPath.resolve(TPCH_WRITE_RELATIVE_PATH + s"-$scale").toFile.getAbsolutePath override private[integration] def createDataGen( scale: Double, @@ -90,7 +93,7 @@ class TpchSuite( } object TpchSuite { - private val TPCH_WRITE_PATH = "/tmp/tpch-generated" + private val TPCH_WRITE_RELATIVE_PATH = "tpch-generated" private val ALL_QUERY_IDS = Array( "q1", "q2", diff --git a/tools/gluten-it/package/pom.xml b/tools/gluten-it/package/pom.xml index 70a59cac05ea0..d630b774fa30c 100644 --- a/tools/gluten-it/package/pom.xml +++ b/tools/gluten-it/package/pom.xml @@ -16,7 +16,7 @@ org.apache.gluten gluten-it-common - ${gluten.version} + ${project.version} com.google.guava diff --git a/tools/gluten-it/pom.xml b/tools/gluten-it/pom.xml index 71db637a8403e..a65324f2728de 100644 --- a/tools/gluten-it/pom.xml +++ b/tools/gluten-it/pom.xml @@ -17,7 +17,7 @@ 1.8 ${java.version} ${java.version} - 2.12.15 + 2.12.17 3.4.2 2.12 3 @@ -144,24 +144,28 @@ 3.2.2 + 2.12.15 spark-3.3 3.3.1 + 2.12.15 spark-3.4 3.4.2 + 2.12.17 spark-3.5 3.5.1 + 2.12.18 @@ -170,5 +174,11 @@ 0.4.1 + + celeborn-0.5 + + 0.5.0 + + diff --git a/tools/gluten-it/sbin/gluten-it.sh b/tools/gluten-it/sbin/gluten-it.sh index fda1174179363..b21038ccdef6a 100755 --- a/tools/gluten-it/sbin/gluten-it.sh +++ b/tools/gluten-it/sbin/gluten-it.sh @@ -28,6 +28,14 @@ fi JAR_PATH=$LIB_DIR/* +EMBEDDED_SPARK_HOME=$BASEDIR/../spark-home + +export SPARK_HOME=${SPARK_HOME:-$EMBEDDED_SPARK_HOME} +export SPARK_SCALA_VERSION=${SPARK_SCALA_VERSION:-'2.12'} + +echo "SPARK_HOME set at [$SPARK_HOME]." +echo "SPARK_SCALA_VERSION set at [$SPARK_SCALA_VERSION]." + $JAVA_HOME/bin/java $GLUTEN_IT_JVM_ARGS \ -XX:+IgnoreUnrecognizedVMOptions \ --add-opens=java.base/java.lang=ALL-UNNAMED \ diff --git a/tools/gluten-it/spark-home/jars b/tools/gluten-it/spark-home/jars new file mode 120000 index 0000000000000..2939305caa547 --- /dev/null +++ b/tools/gluten-it/spark-home/jars @@ -0,0 +1 @@ +../package/target/lib \ No newline at end of file diff --git a/tools/gluten-te/centos/dockerfile-buildenv b/tools/gluten-te/centos/dockerfile-buildenv index 560889f25a204..12e75a30c65fd 100755 --- a/tools/gluten-te/centos/dockerfile-buildenv +++ b/tools/gluten-te/centos/dockerfile-buildenv @@ -58,13 +58,21 @@ RUN wget https://downloads.apache.org/maven/maven-3/3.8.8/binaries/apache-maven- rm apache-maven-3.8.8-bin.tar.gz && \ mv apache-maven-3.8.8 /usr/lib/maven -# # Build & install Spark 3.2.2 -# RUN cd /opt && git clone --depth 1 --branch v3.2.2 https://github.com/apache/spark.git spark322 -# RUN cd /opt/spark322 && ./build/mvn -Pyarn -DskipTests clean install +# Build & install Spark 3.2.2 +RUN cd /opt && wget https://archive.apache.org/dist/spark/spark-3.2.2/spark-3.2.2-bin-hadoop3.2.tgz +RUN cd /opt && mkdir spark322 && tar -xvf spark-3.2.2-bin-hadoop3.2.tgz -C spark322 --strip-components=1 -# # Build & install Spark 3.3.1 -# RUN cd /opt && git clone --depth 1 --branch v3.3.1 https://github.com/apache/spark.git spark331 -# RUN cd /opt/spark331 && ./build/mvn -Pyarn -DskipTests clean install +# Build & install Spark 3.3.1 +RUN cd /opt && wget https://archive.apache.org/dist/spark/spark-3.3.1/spark-3.3.1-bin-hadoop3.tgz +RUN cd /opt && mkdir spark331 && tar -xvf spark-3.3.1-bin-hadoop3.tgz -C spark331 --strip-components=1 + +# Build & install Spark 3.4.2 +RUN cd /opt && wget https://archive.apache.org/dist/spark/spark-3.4.2/spark-3.4.2-bin-hadoop3.tgz +RUN cd /opt && mkdir spark342 && tar -xvf spark-3.4.2-bin-hadoop3.tgz -C spark342 --strip-components=1 + +# Build & install Spark 3.5.1 +RUN cd /opt && wget https://archive.apache.org/dist/spark/spark-3.5.1/spark-3.5.1-bin-hadoop3.tgz +RUN cd /opt && mkdir spark351 && tar -xvf spark-3.5.1-bin-hadoop3.tgz -C spark351 --strip-components=1 ENV PATH="$PATH:/usr/lib/maven/bin" ENV LD_LIBRARY_PATH=/usr/local/lib64:/usr/local/lib:/usr/lib64:/usr/lib:/lib64:/lib diff --git a/tools/gluten-te/centos/shared.sh b/tools/gluten-te/centos/shared.sh index d14b35bf9d0f7..0253c16cef5f9 100755 --- a/tools/gluten-te/centos/shared.sh +++ b/tools/gluten-te/centos/shared.sh @@ -24,6 +24,13 @@ source "$SHARED_BASEDIR/defaults.conf" export DOCKER_BUILDKIT=1 export BUILDKIT_PROGRESS=plain +# Validate envs +if [ -z "$HOME" ] +then + echo 'Environment variable $HOME not found. Aborting.' + exit 1 +fi + # Set operating system OS_IMAGE_NAME=${OS_IMAGE_NAME:-$DEFAULT_OS_IMAGE_NAME} diff --git a/tools/gluten-te/ubuntu/defaults.conf b/tools/gluten-te/ubuntu/defaults.conf index 2656b1cfa0656..177c1073b9ada 100644 --- a/tools/gluten-te/ubuntu/defaults.conf +++ b/tools/gluten-te/ubuntu/defaults.conf @@ -37,7 +37,6 @@ DEFAULT_OS_IMAGE_NAME=ubuntu # Version ID of os image DEFAULT_OS_IMAGE_TAG=20.04 - # Set timezone name DEFAULT_TIMEZONE=Asia/Shanghai diff --git a/tools/gluten-te/ubuntu/dockerfile-buildenv b/tools/gluten-te/ubuntu/dockerfile-buildenv index dbb9fc65b3422..e520fd2951184 100644 --- a/tools/gluten-te/ubuntu/dockerfile-buildenv +++ b/tools/gluten-te/ubuntu/dockerfile-buildenv @@ -65,7 +65,7 @@ RUN cat /root/.m2/settings.xml ## APT dependencies # Update, then install essentials -RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y sudo locales wget tar tzdata git ccache cmake ninja-build build-essential llvm-11-dev clang-11 libiberty-dev libdwarf-dev libre2-dev libz-dev libssl-dev libboost-all-dev libcurl4-openssl-dev +RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y sudo locales wget tar tzdata git ccache ninja-build build-essential llvm-11-dev clang-11 libiberty-dev libdwarf-dev libre2-dev libz-dev libssl-dev libboost-all-dev libcurl4-openssl-dev curl zip unzip tar pkg-config autoconf-archive bison flex # install HBM dependencies RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y autoconf automake g++ libnuma-dev libtool numactl unzip libdaxctl-dev @@ -103,21 +103,29 @@ RUN set-login-env "LANG=en_US.UTF-8" RUN set-login-env "LANGUAGE=en_US:en" RUN set-login-env "LC_ALL=en_US.UTF-8" +# Install CMake +RUN cd /opt && wget https://github.com/Kitware/CMake/releases/download/v3.28.3/cmake-3.28.3-linux-x86_64.sh \ + && mkdir cmake \ + && bash cmake-3.28.3-linux-x86_64.sh --skip-license --prefix=/opt/cmake \ + && ln -s /opt/cmake/bin/cmake /usr/bin/cmake + +RUN cmake --version + # Build & install Spark 3.2.2 -RUN cd /opt && git clone --depth 1 --branch v3.2.2 https://github.com/apache/spark.git spark322 -RUN cd /opt/spark322 && ./build/mvn -Pyarn -DskipTests clean install +RUN cd /opt && wget https://archive.apache.org/dist/spark/spark-3.2.2/spark-3.2.2-bin-hadoop3.2.tgz +RUN cd /opt && mkdir spark322 && tar -xvf spark-3.2.2-bin-hadoop3.2.tgz -C spark322 --strip-components=1 # Build & install Spark 3.3.1 -RUN cd /opt && git clone --depth 1 --branch v3.3.1 https://github.com/apache/spark.git spark331 -RUN cd /opt/spark331 && ./build/mvn -Pyarn -DskipTests clean install +RUN cd /opt && wget https://archive.apache.org/dist/spark/spark-3.3.1/spark-3.3.1-bin-hadoop3.tgz +RUN cd /opt && mkdir spark331 && tar -xvf spark-3.3.1-bin-hadoop3.tgz -C spark331 --strip-components=1 # Build & install Spark 3.4.2 -RUN cd /opt && git clone --depth 1 --branch v3.4.2 https://github.com/apache/spark.git spark342 -RUN cd /opt/spark342 && ./build/mvn -Pyarn -DskipTests clean install +RUN cd /opt && wget https://archive.apache.org/dist/spark/spark-3.4.2/spark-3.4.2-bin-hadoop3.tgz +RUN cd /opt && mkdir spark342 && tar -xvf spark-3.4.2-bin-hadoop3.tgz -C spark342 --strip-components=1 # Build & install Spark 3.5.1 -# RUN cd /opt && git clone --depth 1 --branch v3.5.1 https://github.com/apache/spark.git spark351 -# RUN cd /opt/spark351 && ./build/mvn -Pyarn -DskipTests clean install +RUN cd /opt && wget https://archive.apache.org/dist/spark/spark-3.5.1/spark-3.5.1-bin-hadoop3.tgz +RUN cd /opt && mkdir spark351 && tar -xvf spark-3.5.1-bin-hadoop3.tgz -C spark351 --strip-components=1 # Prepare entry command COPY scripts/cmd.sh /root/.cmd.sh diff --git a/tools/gluten-te/ubuntu/examples/buildhere-veloxbe-portable-libs/README.md b/tools/gluten-te/ubuntu/examples/buildhere-veloxbe-portable-libs/README.md new file mode 100644 index 0000000000000..cd76e74e77678 --- /dev/null +++ b/tools/gluten-te/ubuntu/examples/buildhere-veloxbe-portable-libs/README.md @@ -0,0 +1,36 @@ +# Utility for building C++ libs in container + +The folder contains script code to build `libvelox.so` and `libgluten.so` in docker container and for host use. + +## Prerequisites + +1. X86 CPU architecture +2. Host machine with Linux operating system +3. Docker + +## Usage + +```sh +# 1. Set the following envs in case you are behind http proxy. +export HTTP_PROXY_HOST=myproxy.example.com +export HTTP_PROXY_PORT=55555 + +# 2. Set the following env to install Gluten's modified Arrow Jars on host. +export MOUNT_MAVEN_CACHE=ON + +# 3. Build the C++ libs in a ubuntu 20.04 docker container. +# Note, this command could take much longer time to finish if it's never run before. +# After the first run, the essential build environment will be cached in docker builder. +# +# Additionally, changes to HTTP_PROXY_HOST / HTTP_PROXY_PORT could invalidate the build cache +# either. For more details, please check docker file `dockerfile-buildenv`. +cd gluten/ +tools/gluten-te/ubuntu/examples/buildhere-veloxbe-portable-libs/run.sh + +# 4. Check the built libs. +ls -l cpp/build/releases/ + +# 5. If you intend to build Gluten's bundled jar, continue running subsequent Maven commands. +# For example: +mvn clean install -P spark-3.4,backends-velox -DskipTests +``` \ No newline at end of file diff --git a/tools/gluten-te/ubuntu/examples/buildhere-veloxbe-portable-libs/run-default.sh b/tools/gluten-te/ubuntu/examples/buildhere-veloxbe-portable-libs/run-default.sh new file mode 100755 index 0000000000000..2648725ce0b57 --- /dev/null +++ b/tools/gluten-te/ubuntu/examples/buildhere-veloxbe-portable-libs/run-default.sh @@ -0,0 +1,21 @@ +#!/bin/bash +# 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. + +set -ex + +BASEDIR=$(readlink -f $(dirname $0)) + +$BASEDIR/run.sh --enable_vcpkg=ON --build_tests=OFF --build_benchmarks=OFF --enable_s3=ON --enable_gcs=ON --enable_hdfs=ON --enable_abfs=ON diff --git a/tools/gluten-te/ubuntu/examples/buildhere-veloxbe-portable-libs/run.sh b/tools/gluten-te/ubuntu/examples/buildhere-veloxbe-portable-libs/run.sh new file mode 100755 index 0000000000000..4d28d45211c7d --- /dev/null +++ b/tools/gluten-te/ubuntu/examples/buildhere-veloxbe-portable-libs/run.sh @@ -0,0 +1,27 @@ +#!/bin/bash +# 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. + +set -ex + +BASEDIR=$(readlink -f $(dirname $0)) + +TIMESTAMP=$(date +%s) + +export EXTRA_DOCKER_OPTIONS="--name buildhere-veloxbe-portable-libs-$TIMESTAMP -v $BASEDIR/scripts:/opt/scripts" + +BASH_ARGS="$*" + +$BASEDIR/../../cbash-mount.sh "/opt/scripts/all.sh $BASH_ARGS" diff --git a/tools/gluten-te/ubuntu/examples/buildhere-veloxbe-portable-libs/scripts/all.sh b/tools/gluten-te/ubuntu/examples/buildhere-veloxbe-portable-libs/scripts/all.sh new file mode 100755 index 0000000000000..18dd92a343f95 --- /dev/null +++ b/tools/gluten-te/ubuntu/examples/buildhere-veloxbe-portable-libs/scripts/all.sh @@ -0,0 +1,51 @@ +#!/bin/bash +# 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. + +set -ex + +export NUM_THREADS=$(nproc) +export CMAKE_BUILD_PARALLEL_LEVEL=$(nproc) + +# Retry code copied from https://unix.stackexchange.com/a/137639. +function fail { + echo $1 >&2 + exit 1 +} + +function retry { + local n=1 + local max=5 + local delay=15 + while true; do + "$@" && break || { + if [[ $n -lt $max ]]; then + ((n++)) + echo "Command failed. Attempt $n/$max:" + sleep $delay; + else + fail "The command has failed after $n attempts." + fi + } + done +} + +cd /opt/gluten +retry apt-get update +retry apt-get install -y --dry-run # We now have all essentials installed in image. + +BASH_ARGS=$@ + +retry dev/builddeps-veloxbe.sh $BASH_ARGS diff --git a/tools/gluten-te/ubuntu/shared.sh b/tools/gluten-te/ubuntu/shared.sh index d14b35bf9d0f7..0253c16cef5f9 100755 --- a/tools/gluten-te/ubuntu/shared.sh +++ b/tools/gluten-te/ubuntu/shared.sh @@ -24,6 +24,13 @@ source "$SHARED_BASEDIR/defaults.conf" export DOCKER_BUILDKIT=1 export BUILDKIT_PROGRESS=plain +# Validate envs +if [ -z "$HOME" ] +then + echo 'Environment variable $HOME not found. Aborting.' + exit 1 +fi + # Set operating system OS_IMAGE_NAME=${OS_IMAGE_NAME:-$DEFAULT_OS_IMAGE_NAME}